python - Cosa sta facendo questo strano comportamento del colon?



python-3.x (1)

Hai accidentalmente scritto un'annotazione variabile sintatticamente corretta. Questa funzione è stata introdotta in Python 3.6 (vedi PEP 526 ).

Sebbene un'annotazione variabile venga analizzata come parte di un'assegnazione annotata , l'istruzione di assegnazione è facoltativa :

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

Pertanto, nel context["a"]: 2

  • context["a"] è la destinazione dell'annotazione
  • 2 è l'annotazione stessa
  • context["a"] viene inizializzato

Il PEP afferma che "il target dell'annotazione può essere qualsiasi target di assegnazione singolo valido, almeno sintatticamente (spetta al verificatore del tipo cosa fare con questo)" , il che significa che la chiave non deve necessariamente esistere per essere annotato (quindi nessun KeyError ). Ecco un esempio dal PEP originale:

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

Normalmente, l'espressione delle annotazioni dovrebbe valutare un tipo Python - dopo tutto l'uso principale delle annotazioni è il suggerimento del tipo, ma non viene applicato. L'annotazione può essere qualsiasi espressione Python valida , indipendentemente dal tipo o dal valore del risultato.

Come puoi vedere, in questo momento i suggerimenti sul tipo sono molto permissivi e raramente utili, a meno che tu non abbia un controllo statico del tipo come mypy .

Sto usando Python 3.6.1 e mi sono imbattuto in qualcosa di molto strano. Ho avuto un semplice errore di assegnazione del dizionario che mi ha impiegato molto tempo per trovarlo.

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

Produzione

{}

Che cosa sta facendo il context["a"]: 2 codice context["a"]: 2 ? Non SyntaxError un SyntaxError quando dovrebbe essere IMO. All'inizio ho pensato che stesse creando una fetta. Tuttavia, digitando repr(context["a"]: 2) genera un SyntaxError . Ho anche digitato context["a"]: 2 nella console e la console non ha stampato nulla. Ho pensato che forse è tornato None , ma non ne sono così sicuro.

Ho anche pensato che potesse essere un'istruzione if a riga singola, ma neanche quella dovrebbe essere la sintassi giusta.

Inoltre, il context["a"] dovrebbe generare un KeyError .

Sono perplesso. Cosa sta succedendo?





python-3.x