Répondre
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 {}
alors donnons lui un :) –
A peu près comme var a = b ?? nouveau b() en C#. –
@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. –
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.
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?:. –
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? –
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
Affectation par défaut Idiom
officiel ou inventé par vous en ce moment même? –
@Stefano, je pensais que nous votons pour ce que nous pensons que le nom officiel devrait être :) –
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
nior
limitent la valeur et le type qu'ils reviennent àFalse
etTrue
, mais plutôt revenir le dernier argument évalué. Ceci est parfois utile, par exemple, sis
est une chaîne qui devrait être remplacé par un défaut Sinot
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'
donneFalse
, et non''
.) si elle est vide, l'expressions or 'foo'
donne la valeur désirée.
- 1. Quel est le nom officiel de cette fonction de syntaxe?
- 2. Quel est le nom de cette fonctionnalité de rotation d'article?
- 3. quel est le nom de cette structure de données
- 4. Quel est le nom officiel du jeu de sélection de numéros?
- 5. Quel est le nom de cette syntaxe C#?
- 6. Quel est le meilleur nom pour cette interface?
- 7. Quel est le nom de ce modèle?
- 8. quel est le nom de ce modèle?
- 9. Quel est le nouveau nom de Microsoft.Data.Entity.Ctp?
- 10. Quel est le nom d'une telle notation?
- 11. Quel est le nom du type de construction [x pour x dans some_list] en python?
- 12. Quel est le problème avec cette regex?
- 13. Quel est le problème dans cette requête?
- 14. Quel est le problème avec cette ligne?
- 15. Quel est le problème avec cette fonction?
- 16. Quel est le problème avec cette requête?
- 17. Quel est le problème avec cette classe?
- 18. Quel est le problème avec cette boucle?
- 19. Quel est le problème avec cette regex?
- 20. Quel est le problème avec cette regex?
- 21. quel est le problème sur cette page?
- 22. Quel est le problème avec cette syntaxe?
- 23. Quel est le SI dans cette requête
- 24. Quel est le problème avec cette requête?
- 25. Quel est le problème avec cette requête?
- 26. Quel est le problème avec cette syntaxe?
- 27. Quel est le problème dans cette déclaration?
- 28. Quel est le problème avec cette méthode?
- 29. Quel est le problème avec cette méthode?
- 30. Quel est le problème avec cette boucle?
Vous voyez cela dans Ruby, aussi. –
et perl si je me souviens correctement –
aussi en Javascript aussi. – YOU