vous avez presque jamais des variables non définies en Python, et quand vous faites cela signifie généralement que vous avez m ade une erreur.Cependant, de manière pratique, la plupart des types de valeurs couramment utilisés comme valeurs par défaut (conteneurs vides, chaînes de longueur zéro, zéro et None
) sont "falsifiés" en Python, de sorte que vous verrez parfois des choses comme ça qui profite de la façon dont le travail des opérateurs booléens en Python:
name = name or "Guido" # if name is empty, set it to "Guido"
numb = numb or 42 # if numb is zero, set it to 42
la raison pour laquelle cela fonctionne est que cesse Python évalue or
si le premier argument est « truthy, » qui est appelé court-circuit, et dans les deux cas retourne l'argument réel, plutôt que comme résultat True
ou False
. Donc, si name
est "Jim" alors "Jim" or "Guido"
évalue à "Jim"
parce que "Jim"
est une chaîne de longueur non-zéro et donc "véridique".
Bien sûr, cela ne fonctionne pas très bien lorsque vous ne connaissez pas le type de la valeur que vous traitez et/ou qu'une valeur «falsifiée» est une valeur valide. Cependant, cela fonctionne assez bien avec des choses comme des fichiers de configuration et raw_input()
où une valeur manquante renvoie une chaîne vide:
name = raw_input("What is your name? ") or "Guido"
Un autre idiome commun est utilisé en traitant des éléments dans un dictionnaire. La méthode get()
de la classe de dictionnaire vous permet de spécifier une valeur par défaut à utiliser si la variable n'est pas dans le dictionnaire.
name = values.get("name", "Guido")
Ceci peut être utilisé lorsque votre fonction a été passé arguments mots clés en utilisant la convention **kwargs
. Vous pouvez utiliser aussi avec des variables, comme les globals()
et locals()
fonctions renvoient respectivement, toutes les variables globales ou locales actuellement portée comme un dictionnaire:
name = locals().get("name", "Guido")
Cependant, comme je l'ai dit, vous aurez rarement Variables en fait indéfinies en Python. Dans des cas comme les frameworks Web, vous passerez des arguments de chaîne de requête en tant que dictionnaire, par exemple, et pourrez utiliser la méthode .get()
du dictionnaire.
Dans les rares cas où un nom n'existe pas (par exemple, votre fichier de configuration est en syntaxe Python et vous l'importez en tant que module Python plutôt que de l'analyser, et vous voulez que les utilisateurs puissent omettre certaines valeurs ... ou quelque chose d'aussi farfelue), vous pouvez utiliser getattr()
, qui (comme celui .get()
) dictionnaire accepte une valeur par défaut:
import config
name = getattr(config, "name", "Guido") # rather than just name.config
ou tout simplement laisser jeter un NameError
et l'attraper.
Oui c'est un doublon, il semble. Merci Adam! –
'$ foo || =" quoi "' réattribue '$ foo' s'il est déjà * faux *. Bien sûr 'undef' est faux, mais il en est de même de zéro et de la chaîne nulle. Pour réaffecter seulement une valeur indéfinie, utilisez des barres obliques à la place, comme '$ foo // =" quoi "' – Borodin
Notez que '//' (et son extension, '// =') a été ajouté à perl 5.10. Si vous êtes toujours bloqué sur 5.8.x, vous ne pourrez pas utiliser '// =' (et vous devriez envisager sérieusement de mettre à jour si possible). –