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.

52voto

vartec Punkte 124396

Seit 2.5:

Wenn Sie sich zurückziehen wollen ばかり auf Keine:

a = x if x is not None else y 

Wenn Sie auch auf leere Zeichenketten zurückgreifen wollen, false , 0 usw.:

a = x if x else y 

o

a = x or y 

Wie für undefiniert (wie nie definiert, auch bekannt als nicht gebunden):

try:
  a = x 
except NameError:
  a = y

oder ein bisschen hackiger (das würde ich nicht wirklich empfehlen, aber es ist kurz):

a = vars().get('x',y)

6voto

SilentGhost Punkte 285785

Sie können zunächst mit einer ternären Lösung arbeiten:

a = y if x is None else x

aber das löst Ihr Problem nicht. Was Sie tun wollen, wird mit genauer umgesetzt:

try:
    a = x
except:
    a = y

4voto

Hinrik Punkte 793

Nur eine kleine Kritik an Ihrem Perl-Beispiel:

my $x = undef;

Dieser redundante Code lässt sich verkürzen auf:

my $x;

Und der folgende Code bewirkt nicht das, was Sie behaupten:

my $a = $x || $y;

Dadurch wird $y tatsächlich $a zugewiesen, wenn $x falsch . Falsche Werte umfassen Dinge wie undef , Null und die leere Zeichenkette. Um nur auf Definiertheit zu testen, könnten Sie folgendes tun (ab Perl 5.10):

my $a = $x // $y;

3voto

Ich bin davon überzeugt, dass es keinen "pythonischen" Weg gibt, weil es sich nicht um ein pythonisches Muster handelt. In elegantem Code sollte die Kontrolle nicht auf eine undefinierte Variable verweisen. Es gibt ähnliche Ideen, die pythonisch sind. Am offensichtlichsten:

def myRange(start, stop=None):
    start, stop = (0, start) if stop is None else (start, stop)
    ...

Wichtig ist, dass stop definiert ist, aber der Aufrufer es nicht explizit übergeben musste, sondern nur, dass es den Standardwert angenommen hat, wodurch die Semantik der Argumente geändert wird, was dazu führt, dass das erste Argument anstelle des zweiten optional ist, auch wenn die Sprache dies ohne diesen cleveren Trick nicht zulässt.

Davon abgesehen könnte so etwas auch ohne einen try-catch-Block funktionieren.

a = locals().get('x', y)

1voto

Dana Punkte 30263

Es gibt die ternäre Operation von Python:

a = x if x is not None else y

Erhältlich in 2,5 und höher.

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