2016-04-25 9 views
1

Ich weiß überPython Zuordnung zu bedingter LHS

a = val1 if condition else val2 

aber ist es eine Möglichkeit, so etwas wie

a if condition else b = val 

, die ein SyntaxError wirft zu tun (was verständlich ist nehme ich an)

I würde eine Bedingung verwenden,

if condition: 
    a = val 
else: 
    b = val 

aber ich hasse das gleiche Stück Code (hier, die rechte Seite) in meinem Programm zweimal (in meinem echten Code, val ist ein nicht-trivialer Ausdruck). Ich weiß, dass ich einfach eine Dummy-Variable machen kann, um das Stück zu halten, aber das scheint un-idiomatisch zu sein.

Es fiel mir auch ein Tupel zu tun

ba = (b,a) 
ba[bool(condition)] = val 
b, a = ba 

aber das scheint auch sehr nicht-idiomatische.

Gibt es einen anderen Weg, an den ich nicht denke?

+0

'a, b = val, b, wenn cond els schreiben e a, val 'ist eine Zeile, wiederholt aber immer noch' val '. –

+0

Es ist eine seltsame Anforderung. Es ist besser, die Ergebnisse nicht-trivialer Ausdrücke Variablen zuzuweisen, die entsprechend benannt sind. Z.B. topTenDebtCustomers oder was auch immer. Dann können Sie diesen Wert wie in Ihrer if/else-Anweisung "a" oder "b" zuweisen, was der richtige Weg ist. Dies ist keine "Dummy" Variable und nicht unidiomatisch, ganz im Gegenteil. Ihr Wunsch, gut benannte Variablen zu eliminieren, um eine Codezeile zu speichern, macht Sie zu einem SCHLECHTEN PROGRAMMIERER. – aaa90210

+0

@aaa In der Situation, in der ich diese Frage gestellt habe, wurde die Bedeutung von "val" vollständig durch "condition" bestimmt. Es gibt also keine semantisch gültige Bezeichnung dafür (abgesehen von etwas wie "vielleicht_a_maybe_b"). Es ist ein totaler Eckfall, aber ich habe mich gefragt, was die Leute für richtig hielten. Natürlich ging es mir, wie so oft, ganz anders und ich musste das gar nicht machen. Es könnte theoretisch passieren. – phsyron

Antwort

1

Sie können eine Funktion verwenden, um die Logik zu kapseln und entpacken zurück auf die Variablen, die Sie sich interessieren:

def decider(x, y, condition, val): 
    if condition: 
     return val, y 
    return x, val 

a, b = decider(a, b, cond, value) 
1

Nein, das geht nicht. Stellen Sie eine weitere Variable auf val und verwenden Sie if. Einfach ist gut.

1

Es ist machbar in einer Linie mit Tupel:

a,b = val if cond else a, val if not cond else b 

Aber bitte verwenden Sie es nicht, es ist hässlich und viel komplizierter, dass eine einfache if Aussage.

+1

Sehr hacky aber es funktioniert. Kann zu '(a, b) = (val, b) gekürzt werden, wenn die Bedingung else (a, val) ' – smac89

+1

Außerdem wiederholst du noch mehr Code. Jetzt erscheint auch 'cond' zweimal. – user2357112

0

Wenn a und b einige frühere Werte haben, können Sie einfach schreiben:

a, b = (a, val) if condition else (val, b) 

Else können Sie

a, b = (None, val) if condition else (val, None)