Що таке анотації змінних?
Анотації змінних - це лише наступний крок до # 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має містити лишеints та сторонні програми, можливо, введіть перевірити вашу програму, щоб перевірити цю претензію, але коли ви запускаєте код у будь-якому інтерпретаторі python, який точно такий же, як написанняprimes = [], і, отже,primes: List[int] = []; primes.append("string")це все ще відбувається дійсний.