2010-02-24 3 views

Répondre

10

Je ne pense pas qu'il ait un nom officiel, c'est juste une façon intelligente/paresseuse d'être concis. Il est à peu près équivalent à:

a = b if b else {} 

ou:

if b: 
    a = b 
else: 
    a = {} 

J'ai écrit cela comme un commentaire, mais je pense qu'il est utile de mentionner ici:

Vous devez être très prudent lorsque vous utilisez cette astuce. Si votre intention est de définir une valeur par défaut quand quelque chose est None, il serait préférable d'écrire explicitement ce test is None que d'utiliser cette astuce. La raison en est que None n'est pas la seule chose qui évalue à false dans un contexte booléen. 0, [], {}, ... également évaluer à false. Donc, cette astuce pourrait ne pas vous donner les résultats escomptés si vous ne pensiez pas à ces cas particuliers.

est ici une façon de le faire qui est plus sûr:

a = b if b is not None else {} 
+0

alors donnons lui un :) –

+0

A peu près comme var a = b ?? nouveau b() en C#. –

+1

@Filip: Similaire, sauf que l'opérateur de coalescence nulle '??' a été ajouté intentionnellement à C# dans ce but. Cette astuce dans Python fonctionne car None est traité comme faux dans un contexte booléen. Mais 0, [], {}, etc ... sont aussi faux, alors soyez prudent. Si vous voulez émuler '??', il est préférable d'écrire explicitement le test 'is None 'que de compter sur cette astuce. –

1

Ce n'est pas une construction spéciale, au moins à mes yeux un peu fatigués. Il est dit d'affecter le résultat de

(b or {}) 

à un. Donc, si b est une valeur False, a devient {} (le dictionnaire vide), sinon il obtient la valeur de b.

+0

exactement, mais peut-être qu'il y a un nom pour ça. L'assignation en court-circuit est celle que je serais tenté de dire. peut-être une affectation conditionnelle? Mais cela fait normalement référence à l'opérateur?:. –

+0

Cela ne dépend pas vraiment d'une sorte de court-circuit, cependant ... J'y penserais si cela supprimait un effet secondaire sur le RHS. Mais pour ça? –

+0

C'est une "construction spéciale" si vous venez de C++ ou Java où les seules choses que vous pouvez mettre de chaque côté d'un "ou" sont des booléens. Ici, b pourrait être n'importe quel objet (vraisemblablement un dictionnaire basé sur le contexte) donc (b ou {}) n'est * pas * un booléen. Parfaitement normal pour un Pythonista, mais pas évident si vous apprenez Python pour la première fois. – MatrixFrog

1

Affectation par défaut Idiom

+1

officiel ou inventé par vous en ce moment même? –

+1

@Stefano, je pensais que nous votons pour ce que nous pensons que le nom officiel devrait être :) –

2

L'expression b or {} est juste un boolean OR expression simple. La particularité de c'est juste que cette expression n'a pas besoin de retourner une valeur booléenne, par définition, comme dans d'autres langues:

L'expression x or y premier x évalue; si x est vrai, sa valeur est retournée; sinon, y est évalué et la valeur résultante est renvoyée.

(Notez que ni and ni or limitent la valeur et le type qu'ils reviennent à False et True, mais plutôt revenir le dernier argument évalué. Ceci est parfois utile, par exemple, si s est une chaîne qui devrait être remplacé par un défaut Si not doit inventer une valeur de toute façon, il ne prend pas la peine de renvoyer une valeur du même type que son argument, par exemple, not 'foo' donne False, et non ''.) si elle est vide, l'expression s or 'foo' donne la valeur désirée.