29 Stimmen

Welches ist die pythonischste Art und Weise, einen Rückfallwert in einer Zuweisung anzugeben?

In Perl ist es oft schön, ein Objekt zuweisen zu können, aber einen Rückfallwert anzugeben, wenn die Variable, von der zugewiesen wird, 'undef' ist. Zum Beispiel:

my $x = undef;
my $y = 2;
my $a = $x || $y;

Hiernach,

$a == 2

Gibt es eine prägnante Art und Weise, dies in Python zu erreichen, wenn der Wert x keine ist, oder würde eine full-on ...

if x is not None
    a = x
else
    a = y

... der pythonischste Weg sein, dies zu erreichen?

EDIT: Entschuldigung, wie von mehreren Kommentatoren angemerkt wurde, habe ich nicht wirklich davon gesprochen, dass der Wert undefiniert ist, sondern "undef" in Perl, was nicht wirklich dasselbe ist. Aber die Frage, wie sie ursprünglich formuliert war, hat das nicht klar gemacht.

1voto

rpr Punkte 3520

Ich denke, dies würde helfen, da das Problem darin besteht, zu prüfen, ob eine Variable definiert ist oder nicht:
Kann man auf einfache Weise überprüfen, ob eine Variable in Python definiert ist?

0voto

randlet Punkte 3438

Die meisten Lösungen, die auf if-Anweisungen beruhen, funktionieren nicht für den Fall, dass x 0 oder negativ ist.

>>> x = 0
>>> y = 2
>>> a = x or y
>>> a
2
>>> 

Wenn Sie den Namen der Variablen im Voraus wüssten, könnten Sie etwa so vorgehen:

if 'x' in dir():
    a = x 
except:
     a =y

Allerdings scheint mir diese Lösung etwas schlampig zu sein. Ich glaube, die beste Methode ist die Verwendung eines Try-Exceptions-Blocks wie dieser:

try:
    a = x
else:
    a = y

0voto

dbr Punkte 158949

Eine Möglichkeit zur Umschreibung...

if x is not None
    a = x
else
    a = y

ist:

x = myfunction()

if x is None:
    x = y

print x

Oder die Verwendung von Ausnahmen (möglicherweise mehr Python'y, je nachdem, was der Code tut - wenn es keine zurückgibt, weil es einen Fehler gab, ist die Verwendung einer Ausnahme wahrscheinlich der richtige Weg):

try:
    x = myfunction()
except AnException:
    x = "fallback"

print x

Abgesehen davon ist an Ihrem ursprünglichen Code wirklich nichts auszusetzen:

if x is not None
    a = x
else
    a = y

Er ist zwar lang, aber ich finde ihn viel leichter zu lesen (und viel pythonischer) als die beiden folgenden Einzeiler:

a = x if x is not None else y
a = x or y

-1voto

Jon Cage Punkte 34808

Wenn es ein Argument für eine Funktion ist, können Sie dies tun:

def MyFunc( a=2 ):
    print "a is %d"%a

>>> MyFunc()
...a is 2
>>> MyFunc(5)
...a is 5

[Bearbeiten] Für die Abwärtswähler: Der if/else-Teil ist für die Lösung unnötig - er wurde nur hinzugefügt, um die Ergebnisse zu verdeutlichen. Haben Sie die "if"-Anweisung entfernt, wenn das die Sache klarer macht?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X