PEP 572 contient de nombreux détails, notamment pour la première question. Je vais essayer de résumer/citer de manière concise certaines des parties les plus importantes du PEP :
Justification
Permettre cette forme d'assignation dans les compréhensions, telles que les compréhensions de listes, et les fonctions lambda où les assignations traditionnelles sont interdites. Cela peut également faciliter le débogage interactif sans nécessiter de refactoring du code.
Exemples de cas d'utilisation recommandés
a) Obtenir des valeurs conditionnelles
par exemple (dans Python 3) :
command = input("> ")
while command != "quit":
print("You entered:", command)
command = input("> ")
peut devenir :
while (command := input("> ")) != "quit":
print("You entered:", command)
De même, de les docs :
Dans cet exemple, l'expression d'affectation permet d'éviter d'appeler len() deux fois :
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
b) Simplifier les compréhensions de listes
par exemple :
stuff = [(lambda y: [y,x/y])(f(x)) for x in range(5)]
peut devenir :
stuff = [[y := f(x), x/y] for x in range(5)]
Syntaxe et sémantique
Dans tout contexte où des expressions Python arbitraires peuvent être utilisées, une expression expression nommée peut apparaître. Celle-ci est de la forme name := expr
où expr
est toute expression Python valide, et name est un identifiant.
La valeur d'une telle expression nommée est la même que l'expression incorporée, avec l'effet secondaire supplémentaire que la cible se voit attribuer cette valeur.
Différences par rapport aux déclarations d'affectation ordinaires
En plus d'être une expression plutôt qu'une déclaration, il y a plusieurs différences mentionnées dans le PEP : les affectations d'expression vont de droite à gauche, ont une priorité différente autour des virgules, et ne supportent pas :
x = y = z = 0 # Equivalent: (z := (y := (x := 0)))
- Les affectations ne sont pas à un seul nom :
# No equivalent
a[i] = x
self.rest = []
- Emballage/déballage itérable
# Equivalent needs extra parentheses
loc = x, y # Use (loc := (x, y))
info = name, phone, *rest # Use (info := (name, phone, *rest))
# No equivalent
px, py, pz = position
name, phone, email, *other_info = contact
- Annotations de type en ligne :
# Closest equivalent is "p: Optional[int]" as a separate declaration
p: Optional[int] = None
- L'affectation augmentée n'est pas prise en charge :
total += tax # Equivalent: (total := total + tax)
1 votes
Y a-t-il des questions organiques sur ce sujet qui peuvent être fermées par un lien vers cette question de référence ? Une question qui pourrait autrement être considérée comme "trop large" peut certainement être justifiée lorsqu'elle traite de ce qui est autrement une source de doublons courants.
11 votes
Cela devrait être rouvert. Ce n'est certainement pas "trop large". C'est un sujet très spécifique et une très bonne question de référence.
1 votes
Bien qu'il ne faille pas le prendre trop au pied de la lettre car je suis sûr que Python peut diverger sur certains points, c'est l'une des meilleures caractéristiques de Go et il y a exemples dans toute la documentation de Go
7 votes
Juste pour vous donner une perspective historique : Une discussion longue et animée entre les développeurs Python a précédé l'approbation du PEP 572. Et il semble que une des raisons pourquoi Guido a démissionné de BDFL. Les expressions d'affectation ont un certain nombre de cas d'utilisation valables, mais peuvent aussi être facilement détournées pour rendre le code moins lisible. Essayez de limiter l'utilisation de l'opérateur morse à des cas propres qui réduisent la complexité et améliorent la lisibilité.