121 votes

Quel est ce comportement étrange du côlon?

Je suis à l'aide de Python 3.6.1, et je suis tombé sur quelque chose de très étrange. J'ai eu un simple dictionnaire d'attribution de la faute de frappe qui m'a pris beaucoup de temps pour trouver.

context = {}
context["a"]: 2
print(context)

Sortie

{}

Qu'est-ce que le code context["a"]: 2 faire? Il ne soulève pas un SyntaxError alors qu'il devrait l'OMI. Au début, je pensais que c'était la création d'une tranche. Toutefois, en tapant repr(context["a"]: 2) soulève SyntaxError. J'ai aussi tapé context["a"]: 2 dans la console et la console n'a pas d'imprimer quoi que ce soit. J'ai pensé que peut-être il est retourné None, mais je ne suis pas si sûr.

J'ai aussi pensé que cela pouvait être une seule ligne si la déclaration, mais cela ne doit pas être la bonne syntaxe soit.

En outre, context["a"] devrait soulever KeyError.

Je suis perplexe. Ce qui se passe?

119voto

vaultah Points 13200

Vous avez accidentellement écrit un syntaxiquement correcte de la variable d'annotation. Cette fonctionnalité a été introduite en Python 3.6 (voir PEP 526).

Bien qu'une variable d'annotation est analysée dans le cadre d'une annoté de la cession, l'instruction d'affectation est facultatif:

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

Ainsi, en context["a"]: 2

  • context["a"] est l'annotation de la cible
  • 2 est l'annotation elle-même
  • context["a"] est laissée non initialisée

Le PEP stipule que "l'objectif de l'annotation peut être valable, toute seule affectation cible, au moins du point de vue syntaxique (c'est le type de vérificateur de quoi faire avec cette)", ce qui signifie que la clé n'a pas besoin d'exister pour être annoté (donc pas d' KeyError). Voici un exemple à partir de l'original de la PEP:

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

Normalement, l'annotation d'expression doit s'évaluer à un Python de type -- après tout, la principale utilisation des annotations de type hinting, mais elle n'est pas appliquée. L'annotation peut être valide expression Python, quel que soit le type ou la valeur du résultat.

Comme vous pouvez le voir, à ce moment-type de conseils sont très permissive et rarement utile, sauf si vous avez un type statique checker comme mypy.

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