J'utilise Python 3.6.1 et je suis tombé sur quelque chose de très étrange. J'ai eu une simple faute de frappe dans le dictionnaire qui m'a pris beaucoup de temps à trouver.
context = {}
context["a"]: 2
print(context)
Production
{}
Que fait le code context["a"]: 2
? Il ne soulève pas un SyntaxError
quand il devrait IMO. Au début, je pensais que cela créait une tranche. Cependant, la saisie repr(context["a"]: 2)
déclenche un SyntaxError
. J'ai également tapé context["a"]: 2
dans la console et la console n'a rien imprimé. Je pensais qu'il était peut-être revenu None
, mais je n'en suis pas si sûr.
J'ai également pensé que cela pourrait être une instruction if sur une seule ligne, mais cela ne devrait pas non plus être la bonne syntaxe.
De plus, context["a"]
devrait augmenter un KeyError
.
Je suis perplexe. Que se passe-t-il?
la source
Réponses:
Vous avez accidentellement écrit une syntaxiquement correcte annotation variable . Cette fonctionnalité a été introduite dans Python 3.6 (voir PEP 526 ).
Bien qu'une annotation de variable soit analysée dans le cadre d'une affectation annotée , l'instruction d'affectation est facultative :
Ainsi, dans
context["a"]: 2
context["a"]
est la cible de l'annotation2
est l'annotation elle-mêmecontext["a"]
est laissé non initialiséLe PEP déclare que "la cible de l'annotation peut être n'importe quelle cible d'affectation unique valide, au moins syntaxiquement (il appartient au vérificateur de type quoi faire avec cela)" , ce qui signifie que la clé n'a pas besoin d'exister pour être annoté (donc non
KeyError
). Voici un exemple du PEP original:Normalement, l'expression d'annotation doit être évaluée à un type Python - après tout, l'utilisation principale des annotations est l'indication de type, mais elle n'est pas appliquée. L'annotation peut être n'importe quelle expression Python valide , quel que soit le type ou la valeur du résultat.
Comme vous pouvez le voir, à l'heure actuelle, les indices de type sont très permissifs et rarement utiles, à moins que vous n'ayez un vérificateur de type statique tel que mypy .
la source
=
opérateur d'affectation? La clé n'existe pas. Cela me semble juste mal.:
est l'opérateur d'affectation. Nous "assignons" simplement une annotation de type seule, pas une clé. Je doute qu'il y ait une raison de l'autoriser, juste un effet secondaire involontaire de l'ajout de la syntaxe d'annotation.x: str
et immédiatement suivie detype(x)
, l'interprète lèvera unNameError
. OMI, la syntaxe doit appliquer l'objet est prédéfinie ou définie sur place. Cela ne fait qu'introduire de la confusion.x = 'i am a string'
avantx: str
rend ce dernier type de redondance. Cela n'aurait pas dû être ajouté du tout. C'était bien comme commentaire; Je ne le montre jamais utilisé d'une manière ou d'une autre.