Аннотации переменных в Python

Аватар Никита Прияцелюк

Аннотации переменных — следующий шаг развития аннотаций типов. Сегодня мы подробно расскажем, что они из себя представляют и как их использовать.

Обложка поста Аннотации переменных в Python

В 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, как аннотации переменных. Она будет особенно полезна программистам, привыкшим работать со статически типизированными языками.

Python
Для продолжающих
24154