2010-07-27 3 views
3

Dicts en Python ont une méthode très agréable get:façon de choisir entre Cleanest deux valeurs en Python

# m is some dict 
m.get(k,v) # if m[k] exists, returns that, otherwise returns v 

Est-il possible de le faire pour toute valeur? Par exemple, en Perl, je pouvais le faire:

return $some_var or "some_var doesn't exist." 
+0

Mon erreur, cela ne fonctionnait pas pour ma classe pour quelque raison. Voter pour fermer, cela semble évident rétrospectivement. –

+0

Comme le note la réponse, vous pouvez utiliser l'opérateur ou comme ceci en Python. Mais je suis curieux: les gens considèrent-ils généralement cet idiome Pythonic? Je ne l'ai pas vu personnellement dans le code Python, mais je le vois dans le code Perl partout. –

+5

Cette déclaration 'return' ne fait pas ce que vous pensez qu'elle fait. Voir http://stackoverflow.com/questions/1512547/what-is-the-difference-between-perls-or-and-and-short-circuit-op – mob

Répondre

2

L'opérateur or en Python est guaranteed pour retourner l'un de ses opérandes, dans le cas où l'expression gauche évalue à False, la droite est évaluée et retournée.

Modifier:

Après re-lecture de votre question, je remarque que j'ai mal compris la première fois. En utilisant la locals() fonction intégrée, vous pouvez utiliser la méthode get() pour les variables, comme vous l'utilisez pour dicts (bien que ce soit ni très joli, ni pythonique), pour vérifier si une valeur existe ou non:

>>> locals().get('some_var', "some_var doesn't exist.") 
"some_var doesn't exist." 
>>> some_var = 0 
>>> locals().get('some_var', "some_var doesn't exist.") 
0 
1

Les courts-circuits fonctionnent aussi en Python.

return a or b 
2

Et si vous devez être capable de gérer « faux-ish » des valeurs plus spécifiquement (par exemple, 0 ou '' sont bonnes valeurs, mais None et False ne sont pas), il y a la « expression conditionnelle » plus bavard (aka opérateur ternaire) introduit dans le python 2.5:

return x if <cond> else y 

<cond> peut être l'un quelconque état:

return x if isinstance(x, basestring) else y 
1

En fait, il existe une différence dans Python ehre: Si une variable nommée some_var n'est pas définie, vous ne pouvez pas y accéder pour savoir qu'elle n'existe pas - vous obtiendrez une exception NameError.

Il en est ainsi par conception: les noms de variable indéfinis n'ont pas de valeur "indéfinie" ou "nulle", ils provoquent une exception, et c'est l'une des plus grandes différences entre les langages typés Python. Donc, ce n'est pas Pythonic pour arriver à une instruction où some_var pourrait ou non être définie. Dans un bon programme, il aurait été défini, même si contenir "None" ou "False" - Dans ce cas, l'idiome "or" fonctionnerait, mais la façon recommandée de gérer s pour utiliser l'expression if comme dans:

return some_var if some_var else "some_var contains a False Value" 

Si vous arrive tohave code où some_var pourrait ne pas être défini, et ne peut pas pour soemr Eason changer cela, vous pouvez vérifier si la chaîne « some_var » existe comme une clé dans la dicitonary de ariables de localv, retourné par locals() pour savoir s'il a été défini ou non:

return some_var if "some_var" in locals() else "some_var was not defined" 

Ce n'est pas La façon la plus pythonique - avoir affaire à une variable qui ne peut pas être définie est exceptionnelle dans le code Python.Donc, la meilleure pratice serait d'essayer d'utiliser le contenu de vars l'intérieur d'une cause essayer et attraper l'exception « NameError » si le var n'existe pas:

try: 
    return some_var 
except NameError: 
    return "some_var not defined" 
Questions connexes