Рубрики
Без рубрики

Новый в Python: синтаксис для переменных аннотаций

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Python 3.6 Добавлена другая интересная новая функция, которая известна как Синтаксис для вариабельных аннотаций Отказ Эта новая функция изложена в PEP 526 Отказ Основная предпосылка этого PEP представляет собой идею подсказки к типу ( PEP 484 ) на следующий логический шаг, который в основном добавляет определения типа опции в Python переменные, включая переменные классов и переменные экземпляров. Обратите внимание, что добавление этих аннотаций или определений внезапно не делает Python статически напечатанным языком. Переводчик по-прежнему не заботится, какой тип переменной. Тем не менее, IDE или другая утилита, такая как Pylint, могла бы добавить проверку аннотации, которая может выделить, когда вы используете переменную, которую вы аннотировали в качестве одного типа, а затем неправильно использовали, изменяя его тип в середине функции.

Давайте посмотрим на простой пример, чтобы мы могли видеть, как это работает:

# annotate.py
name: str = 'Mike'

То, что у нас здесь – файл Python, который мы имели название Annotate.py Отказ В нем мы создали переменную, Имя и аннотировал его, чтобы указать, что это строка. Это сделано путем добавления толстой кишки после имени переменной, а затем указав, какой тип должен быть. Вам не нужно присвоить что-либо для переменной, если вы не хотите. Ниже приведено как правильно:

# annotate.py
name: str 

Когда вы аннотируете переменную, он будет добавлен к модулю или классу __annotations__ атрибут. Попробуем импортировать первую версию нашего модуля Annotate и доступа к этому атрибуту:

>>> import annotate
>>> annotate.__annotations__
{'name': }
>>> annotate.name
'Mike'

Как вы можете видеть, __annotations__ Атрибут Возвращает Dict Python с именем переменной в качестве ключа и типа в качестве значения. Давайте добавим пару других аннотаций в наш модуль и посмотреть, как __annotations__ Обновления атрибутов.

# annotate2.py
name: str = 'Mike'

ages: list = [12, 20, 32]

class Car:
    variable: dict

В этом коде мы добавляем аннотированный переменную списка и класс с аннотированной переменной класса. Теперь давайте импомнем нашу новую версию модуля Annotate и проверить его __annotations__ атрибут:

>>> import annotate
>>> annotate.__annotations__
{'name': , 'ages': }
>>> annotate.Car.__annotations__
{'variable': }
>>> car = annotate.Car()
>>> car.__annotations__
{'variable': }

На этот раз мы видим, что словарь аннотаций содержит два предмета. Вы отметите, что уровень модуля __annotations__ Атрибут не содержит аннотированной переменной класса. Чтобы получить доступ к этому, нам нужно получить доступ к классу автомобиля напрямую или создать экземпляр автомобиля и таким образом получить доступ к атрибуту.

Как указал один из моих читателей, вы можете сделать этот пример более совместимым на PEP 484, используя модуль печатания. Посмотрите на следующий пример:

# annotate3.py
from typing import Dict, List

name: str = 'Mike'

ages: List[int] = [12, 20, 32]

class Car:

    variable: Dict

Давайте запустим этот код в интерпретатере и посмотрите, как изменения вывода:

import annotate

In [2]: annotate.__annotations__
Out[2]: {'ages': typing.List[int], 'name': str}

In [3]: annotate.Car.__annotations__
Out[3]: {'variable': typing.Dict}

Отметим, что большинство типов теперь исходят из модуля печати.

Обертывание

Я нашел эту новую функцию, чтобы быть действительно интересной. Пока я люблю динамическую природу Python, я также могу увидеть ценность, зная, какой тип переменной должен быть после работы с C ++ в течение последних нескольких лет. Конечно, из-за отличной поддержки анноспекции Python выясните, что тип объекта тривиален. Но эта новая функция может лучше сделать статические шашки, а также сделать ваш код более очевидным, особенно когда вам нужно вернуться и обновить часть программного обеспечения, с которой вы не работали через несколько месяцев или лет.

Дополнительное чтение