79 votes

Opérateur d'affectation conditionnelle Python

Fait l'équivalent en Python de la fonction Ruby ||= ("définir la variable si la variable n'est pas définie") existe-t-il ?

Exemple en Ruby :

 variable_not_set ||= 'bla bla'
 variable_not_set == 'bla bla'

 variable_set = 'pi pi'
 variable_set ||= 'bla bla'
 variable_set == 'pi pi'

1 votes

Il ne l'active pas s'il n'est pas activé - il l'active si sa valeur actuelle est fausse ( false ou nil ). Il est vrai que cette distinction est plus importante dans les langages qui, par exemple, considèrent 0 et "" comme faux, mais il n'en reste pas moins que la distinction est plus importante dans les langages qui, par exemple, considèrent 0 et "" comme faux.

0 votes

Quel est le cas d'utilisation de cet opérateur ruby ?

1 votes

La façon de le faire serait d'utiliser un try except NameError comme indiqué par phihag, mais cela n'a pas tellement de sens en Python comme indiqué par tout le monde ici. En Ruby, c'est plus utile en raison de la façon dont les gens passent des blocs de code arbitraires à exécuter à l'intérieur d'une fonction. La fonction cible peut alors avoir besoin de définir une variable qui n'a pas été initialisée dans le bloc étranger qu'elle a exécuté. De tels cas n'existent pas en Python.

4voto

Jochen Ritzel Points 42916

Non, ne pas savoir quelles variables sont définies est un bug, pas une fonctionnalité de Python.

Utilisez plutôt des dictionnaires :

d = {}
d.setdefault('key', 1)
d['key'] == 1

d['key'] = 2
d.setdefault('key', 1)
d['key'] == 2

1voto

Dog eat cat world Points 333

Je procède généralement de la manière suivante :

def set_if_not_exists(obj,attr,value):
 if not hasattr(obj,attr): setattr(obj,attr,value)

1voto

chad steele Points 51

C'est ce que je fais... je le partage au cas où il serait utile à l'OP ou à quelqu'un d'autre...

def iff(value, default):
    return default if not value else value

Uso:

z = iff(x,y) # z = x if and only if x is not null otherwise y

0voto

user1928764 Points 29

Je pense que ce que vous cherchez, si vous cherchez quelque chose dans un dictionnaire, c'est le setdefault méthode :

(Pdb) we=dict()
(Pdb) we.setdefault('e',14)
14
(Pdb) we['e']
14
(Pdb) we['r']="p"
(Pdb) we.setdefault('r','jeff')
'p'
(Pdb) we['r']
'p'
(Pdb) we[e]
*** NameError: name 'e' is not defined
(Pdb) we['e']
14
(Pdb) we['q2']

*** KeyError : 'q2' (Pdb) (Pdb)

La chose importante à noter dans mon exemple est que l'élément setdefault modifie le dictionnaire si et seulement si la clé que la méthode setdefault n'est pas présent.

-1voto

tsimbalar Points 1582

Je ne suis pas sûr de bien comprendre la question ici ... Essayer de "lire" la valeur d'un nom de variable "indéfini" déclenchera une erreur de type NameError . (voir ici, que Python a des "noms" et non des variables...).

\== EDIT ==

Comme indiqué dans les commentaires par delnan, le code ci-dessous n'est pas robuste et se cassera dans de nombreuses situations ...

Néanmoins, si votre variable "existe", mais qu'elle a une valeur fictive, comme par exemple None La méthode suivante pourrait être utilisée :

>>> my_possibly_None_value = None
>>> myval = my_possibly_None_value or 5
>>> myval
5
>>> my_possibly_None_value = 12
>>> myval = my_possibly_None_value or 5
>>> myval
12
>>> 

(voir ce paragraphe sur les valeurs de vérité )

2 votes

Cela ne fonctionne pas dès que la valeur peut être 0, "", une chaîne vide, ou toute autre chose qui est "falsy". Vérifier explicitement s'il is None .

0 votes

Oh oui, vous avez raison, je n'y avais pas pensé. Merci pour l'astuce ! En fait, je n'ai jamais eu besoin de faire ce "ou", et je pensais que c'était une réponse valable à la question ... mais la question elle-même ne semble pas être pertinente pour Python de toute façon ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X