Анотації змінних в Python [*]


У Python 3.6 з’явилася така цікава особливість, як синтаксис для анотацій змінних. Детальніше про це нововведення можна прочитати в PEP 526. Суть цього PEP полягає в тому, щоб перекласти ідею анотацій типів (PEP 484) на її наступний логічний ступінь, тобто зробити можливою вказівку типів змінних, включаючи поля класів і об’єктів.

Слід взяти до уваги, що це нововведення не робить Python мовою, що статично типізується. Інтерпретатору все одно, який тип вказаний у змінної. Проте в середовищі розробки на Python або іншому інструменті ніби pylint може бути включена функція перевірки анотацій, яка повідомить вас, якщо ви спочатку вказали один тип змінної, а потім спробували використати її в якості іншого типу далі в програмі.

Давайте поглянемо на простий приклад, щоб подивитися, як це працює:

# annotate.pyname: str = 'Mike'

У нашому файлі annotate.py ми створили змінну name і додали анотацію, що говорить про те, що це рядок. Анотацію можна додати, поставивши двокрапку після імені змінної і потім вказавши потрібний тип. Привласнювати значення змінної зовсім не обов’язково:

# annotate.pyname: str

Вказати тип в Python 3.5 так само не вийде. Замість цього є можливість вказувати тип в коментарі :

# annotate.pyname = 'Mike' # type: str

Усі змінні з анотаціями додаються в атрибут __annotations__ модуля або класу. Давайте імпортуємо першу версію нашого модуля annotate і отримаємо доступ до цього атрибуту:

>>> import annotate>>> annotate.__annotations__{'name': <class 'str'>}>>> annotate.name'Mike'

Як ви бачите, атрибут __annotations__ повертає словник з анотацією в якості значення. Давайте додамо ще декілька анотацій в наш модуль і подивимося, як зміниться атрибут __annotations__:

# annotate.pyname: 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, як анотацію змінних. Вона буде особливо корисна програмістам, звиклим працювати з мовами, що статично типізуються.

Переклад статті “New in Python: Syntax for Variable Annotations”

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *