Що таке анотації змінних?
Анотації змінних - це лише наступний крок до # type
коментарів, як вони були визначені в PEP 484
; обгрунтування цієї зміни висвітлено у відповідному розділі PEP 526 .
Отже, замість натякання на тип за допомогою:
primes = []
Введено новий синтаксис, що дозволяє безпосередньо анотовувати тип із присвоєнням форми:
primes: List[int] = []
який, як зазначив @Martijn, позначає список цілих чисел, використовуючи доступні типи typing
та ініціалізуючи його до порожнього списку.
Які зміни він приносить?
Першою введеною зміною був новий синтаксис, який дозволяє анотувати ім’я типом, або самостійно після :
символу, або додатково анотувати, одночасно призначаючи йому значення:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
Отже, приклад, про який йдеться:
primes: List[int] = [ ]
Також були внесені додаткові зміни разом із новим синтаксисом; Модулі та класи тепер мають __annotations__
атрибут (як це було у функцій з часу PEP 3107 - Анотації функцій ), до якого додаються метадані типу:
from typing import get_type_hints
Тепер __main__.__annotations__
зберігає заявлені типи:
>>> from typing import List, get_type_hints
>>> primes: List[int] = []
>>> captain: str
>>> import __main__
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int]}
captain
в даний час не відображатиметься через, get_type_hints
оскільки get_type_hints
повертає лише типи, до яких також можна отримати доступ в модулі; тобто спочатку йому потрібно значення:
>>> captain = "Picard"
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int], 'captain': <class 'str'>}
Використання print(__annotations__)
покаже, 'captain': <class 'str'>
але ви дійсно не повинні отримувати __annotations__
безпосередній доступ .
Аналогічно для класів:
>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
Де a ChainMap
використовується для захоплення анотацій для даного класу (розташованого на першому зіставленні) та всіх анотацій, визначених у базових класах, знайдених у ньому mro
(наступні відображення, {}
для об’єкта).
Поряд із новим синтаксисом, ClassVar
для позначення змінних класу було додано новий тип. Так, stats
у вашому прикладі насправді є змінною екземпляра , а не ClassVar
.
Чи буду я змушений цим користуватися?
Як і підказки типу від PEP 484
, вони є абсолютно необов’язковими і є основним використанням для інструментів перевірки типу (і будь-чого іншого, що ви можете створити на основі цієї інформації). Це повинно бути тимчасовим, коли вийде стабільна версія Python 3.6, тому в майбутньому можуть бути додані невеликі налаштування.
primes: List[int] = []
- це просто порожній список якprimes = []
. Різниця полягає в тому, що ви заявляєте, щоprimes
має містити лишеint
s та сторонні програми, можливо, введіть перевірити вашу програму, щоб перевірити цю претензію, але коли ви запускаєте код у будь-якому інтерпретаторі python, який точно такий же, як написанняprimes = []
, і, отже,primes: List[int] = []; primes.append("string")
це все ще відбувається дійсний.