2010-04-08 9 views
47

Ist eine Zuordnung in einem Zustand möglich?Können wir eine Zuweisung in einer Bedingung haben?

Für z.

if (a=some_func()): 
    # Use a 
+5

-1: Trivial selbst zu beantworten. Duplizieren: http://stackoverflow.com/questions/1663995/python-variable-assignment-and-if-statement –

+1

@ S.Lott Nicht so trivial zu wissen, warum, wenn es für einige der Antworten, die das beschreiben, nicht wäre Hier. –

Antwort

66

Warum nicht ausprobieren?

>>> def some_func(): 
... return 2 
... 
>>> a = 2 
>>> if (a = some_func()): 
    File "<stdin>", line 1 
    if (a = some_func()): 
     ^
SyntaxError: invalid syntax 
>>> 

Also, nein.

+17

Dies ist absichtlich verboten, da Guido, wohlwollender Python-Diktator, sie unnötig und verwirrender als nützlich findet. Aus demselben Grund gibt es auch keine Post-Inkrement- oder Pre-Increment-Operatoren (++). –

+4

er erlaubte das Hinzufügen von * augmented assigment * in 2.0, weil 'x = x + 1' zusätzliche Nachschlagezeit benötigt, während' x + = 1' etwas schneller war, aber ich bin mir sicher, dass er * das gar nicht mochte * viel. :-) – wescpy

4

Nein. Die Zuweisung in Python ist eine Anweisung, kein Ausdruck.

+0

Und Guido hätte es nicht anders. –

+0

@MarkRansom Alle Grüße Guido. * Richtig * .. Seufzer. – javadba

+0

@javadba der Typ war viel öfter richtig als er falsch lag. Ich bin mir darüber im Klaren, dass eine einzige Person, die für die Vision verantwortlich ist, zu einer viel kohärenteren Strategie führt als das Design der Ausschüsse; Ich kann vergleichen und kontrastieren mit C++, das ist mein Hauptbrot und Butter. –

33

Nö, hat der BDFL nicht wie diese Funktion.

Von wo aus ich sitze, hat Guido van Rossum, "Wohltätiger Diktator für das Leben", hart dafür gekämpft, Python so einfach wie möglich zu halten. Wir können mit einigen der Entscheidungen, die er getroffen hat - ich hätte es vorgezogen Er sagte "Nein" öfter, aber die Tatsache, dass es kein Komitee gab, das Python entwarf, sondern ein vertrauenswürdiges "Beratungsgremium", das größtenteils auf Verdienst basierte und durch Sensibilität des Designers filterte, hat eine Hölle von a produziert nette Sprache, IMHO

+3

Simple? Diese Funktion könnte einen Teil meines Codes vereinfachen, da er kompakter und damit besser lesbar wäre. Jetzt brauche ich zwei Zeilen, wo ich früher eine brauchte. Ich habe nie verstanden, warum Python viele andere Programmiersprachen für viele Jahre abgelehnt hat (und das oft aus einem sehr guten Grund). Besonders dieses Feature, über das wir hier sprechen, ist sehr, sehr nützlich. In –

11

Nicht direkt, per this old recipe of mine - aber wie das Rezept sagt, ist es einfach, das semantische Äquivalent zu erstellen, zB wenn Sie direkt von einem C-codierten Referenzalgorithmus transliterieren müssen (vor Refactoring zu mehr-idiomatischen Python, von cour se ;-). Dh:

class DataHolder(object): 
    def __init__(self, value=None): self.value = value 
    def set(self, value): self.value = value; return value 
    def get(self): return self.value 

data = DataHolder() 

while data.set(somefunc()): 
    a = data.get() 
    # use a 

BTW, ein sehr idiomatisch Pythonic Form für Ihren speziellen Fall, wenn Sie genau wissen, was falsish Wert somefunc zurückkehren kann, wenn er einen falsish Wert zurückgibt (zB 0), ist

for a in iter(somefunc, 0): 
    # use a 

Also in diesem speziellen Fall wäre das Refactoring ziemlich einfach ;-).

Wenn die Rückkehr könnte any Art der falsish Wert sein (0, None, '', ...)), Eine Möglichkeit ist:

import itertools 

for a in itertools.takewhile(lambda x: x, iter(somefunc, object())): 
    # use a 

aber Sie könnten einen einfachen benutzerdefinierten Generator bevorzugen:

def getwhile(func, *a, **k): 
    while True: 
     x = func(*a, **k) 
     if not x: break 
     yield x 

for a in getwhile(somefunc): 
    # use a 
1

Einer der Gründe, warum Zuweisungen in Bedingungen illegal sind, ist, dass es einfacher ist, einen Fehler gemacht und zuweisen Getreu zu machen oder Falsch:

some_variable = 5 

# This does not work 
# if True = some_variable: 
# do_something() 

# This only works in Python 2.x 
True = some_variable 

print True # returns 5 

In Python 3 True und False sind Schlüsselwörter, also kein Risiko mehr.

+1

[161]: l_empty == [] Out [161]: Wahren In [162]: [] == [] Out [162]: Wahre Ich glaube nicht, dass ist der Grund, – volcano

0

Sie können eine Funktion definieren Sie die Zuordnung zu tun:

def assign(name, value): 
    import inspect 
    frame = inspect.currentframe() 
    try: 
     locals_ = frame.f_back.f_locals 
    finally: 
     del frame 
    locals_[name] = value 
    return value 

if assign('test', 0): 
    print("first", test) 
elif assign('xyz', 123): 
    print("second", xyz) 
Verwandte Themen