В Python 3.6 появилась такая интересная особенность, как синтаксис для аннотаций переменных. Подробнее про это нововведение можно прочитать в PEP 526. Суть этого PEP заключается в том, чтобы перевести идею аннотаций типов (PEP 484) на её следующую логическую ступень, т.е. сделать возможным указание типов переменных, включая поля классов и объектов.
Следует принять во внимание, что это нововведение не делает Python статически типизированным языком. Интерпретатору всё равно, какой тип указан у переменной. Тем не менее в среде разработки на Python или другом инструменте вроде pylint
может быть включена функция проверки аннотаций, которая сообщит вам, если вы сначала указали один тип переменной, а затем попытались использовать её в качестве другого типа далее в программе.
Давайте взглянем на простой пример, чтобы посмотреть, как это работает:
# annotate.py name: str = 'Mike'
В нашем файле annotate.py
мы создали переменную name
и добавили аннотацию, говорящую о том, что это строка. Аннотацию можно добавить, поставив двоеточие после имени переменной и затем указав нужный тип. Присваивать значение переменной вовсе не обязательно:
# annotate.py name: str
Прим.перев. Указать тип в Python 3.5 подобным образом не выйдет. Вместо этого есть возможность указывать тип в комментарии:
# annotate.py name = 'Mike' # type: str
Все переменные с аннотациями добавляются в атрибут __annotations__
модуля или класса. Давайте импортируем первую версию нашего модуля annotate
и получим доступ к этому атрибуту:
>>> import annotate >>> annotate.__annotations__ {'name': <class 'str'>} >>> annotate.name 'Mike'
Как вы видите, атрибут __annotations__
возвращает словарь с аннотацией в качестве значения. Давайте добавим ещё несколько аннотаций в наш модуль и посмотрим, как изменится атрибут __annotations__
:
# annotate.py name: str = 'Mike' ages: list = [12, 20, 32] class Car: variable: dict
В этом примере мы добавили список с аннотацией и класс, содержащий переменную с аннотацией. Теперь давайте импортируем новую версию нашего модуля и посмотрим на атрибут __annotations__
:
>>> import annotate >>> annotate.__annotations__ {'name': <class 'str'>, 'ages': <class 'list'>} >>> annotate.Car.__annotations__ {'variable': <class 'dict'>} >>> car = annotate.Car() >>> car.__annotations__ {'variable': <class 'dict'>}
В этот раз в словаре находится два объекта. Как вы могли заметить, в нём нет поля класса. Чтобы получить к нему доступ, мы должны обратиться к классу Car
напрямую или создать экземпляр класса и получить атрибут таким образом.
Заключение
Теперь вы знаете достаточно о такой особенности Python, как аннотации переменных. Она будет особенно полезна программистам, привыкшим работать со статически типизированными языками.