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

Python 3: переменные аннотации

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

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

Python добавил синтаксис для чего-то названного Переменная аннотация В версии 3.6. Переменная аннотация в основном является улучшение подсказки к типу, которое было введено в Python 3.5. Полное объяснение переменной аннотации объясняется в PEP 526 Отказ В этой статье у нас будет быстрое повышение подсказки к типу, а затем ввести новый синтаксис переменной аннотации.

Что такое подсказка?

Тип намекания в Python в основном заявляет, что параметры в ваших функциях и методах имеют определенный тип. Python не поддерживает тип «подсказки», но вы можете использовать такие инструменты, как Marpy Чтобы обеспечить соблюдение типовых подсказок в целом так же, как C ++ применяет декларации типа во время выполнения. Давайте посмотрим на нормальную функцию без подсказок типа:

def add(a, b):
    return a + b

if __name__ == '__main__':
    add(2, 4)

Здесь мы создаем Добавить () Функция, которая принимает два параметра. Он добавляет два параметра и возвращает результат. Что мы не знаем, это то, что нам нужно перейти к функции. Мы могли бы пропустить его целые числа, плавать, списки или строки, и это, скорее всего, будет работать. Но будет ли это работать так, как мы ожидали этого? Давайте добавим какой-то тип намекания на наш код:

def add(a: int, b: int) -> int:
    return a + b

if __name__ == '__main__':
    print(add(2, 4))

Здесь мы изменяем определение функции для использования подсказки к типу. Вы заметите, что теперь параметры отмечены тем, какой тип они должны быть:

  • A: Int.
  • B: int.

Мы также намекаем на возвращаемое значение, что является то, что «-> int». Это означает, что мы ожидаем, что целое число как наше возвращаемое значение. Если вы попробуйте позвонить в функцию Add () с парой строк или поплавок и целым числом, вы не увидите ошибку. Как я уже сказал, Python просто позволяет вам подсказать то, что должен быть тип параметров, но он не применяет его.

Давайте обновим код следующим:

def add(a: int, b: int) -> int:
    return a + b

if __name__ == '__main__':
    print(add(5.0, 4))

Если вы запустите это, вы увидите, что он выполняет все хорошо. Теперь давайте установим Mypy, используя PIP:

pip install mypy

Теперь, когда у нас Mypy, мы можем использовать его, чтобы определить, правильно ли мы используем нашу функцию. Откройте терминал и перейдите к папке, которую вы сохраняете вышеуказанный скрипт. Затем выполните следующую команду:

mypy hints.py

Когда я запустил эту команду, я получил следующий вывод:

hints.py:5: error: Argument 1 to "add" has incompatible type "float"; expected "int"

Как видите, Mypy нашел проблему с нашим кодом. Мы проходим в поплавка для первого аргумента вместо INT. Вы можете использовать MyPy на непрерывном интеграционном сервере, который может проверить свой код для этих видов вопросов, прежде чем совершать выдвижение вашего подчинения в свою ветку, либо запустить его на месте, прежде чем совершить свой код вообще.

Переменная аннотация

Допустим, вы хотите не просто аннотировать параметры функции, но и регулярных переменных. В Python 3.5 вы не могли бы сделать это, используя один и тот же тип синтаксиса, поскольку вы бы на функциональные параметры, как это поднимет SyntaxError Отказ Вместо этого вам нужно будет использовать комментарии, но теперь, когда 3.6 выходит, мы можем использовать новый синтаксис! Давайте посмотрим на пример:

from typing import List

def odd_numbers(numbers: List) -> List:
    odd: List[int] = []
    for number in numbers:
        if number % 2:
            odd.append(number)

    return odd

if __name__ == '__main__':
    numbers = list(range(10))
    print(odd_numbers(numbers))

Здесь он указывает, что переменная, странные должен быть список целых чисел. Если вы запустите MyPy против этого сценария, вы не получите вывод, так как мы все правильно делаем. Попробуем изменять код, чтобы добавить что-то другое, чем целое число!

from typing import List

def odd_numbers(numbers: List) -> List:
    odd: List[int] = []
    for number in numbers:
        if number % 2:
            odd.append(number)

    odd.append('foo')

    return odd

if __name__ == '__main__':
    numbers = list(range(10))
    print(odd_numbers(numbers))

Здесь мы добавляем новую строку, которая добавляет строку в список целых чисел. Теперь, если мы запустим mypy против этой версии кода, мы должны видеть следующее:

hints2.py:9: error: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"

Просто для подтверждения, в Python 3.5 вы можете сделать вариабельную аннотацию, но вы должны были поставить эту аннотацию в комментарии:

# Python 3.6
odd: List[int] = []

# Python 3.5
odd = [] # type: List[int]

Обратите внимание, что если вы измените код для использования вариации Python 3.5 из вариабельной синтаксиса аннотации, MAPY все еще будет помечать ошибку правильно. Вы должны указать «тип:» после знака фунта. Если вы удалите это, то это больше не вариабельная аннотация. В основном все PEP 526 Добавлена синтаксис более равномерным по языку.

Обертывание

На этом этапе вы должны иметь достаточно информации, чтобы начать выполнять вариабельную аннотацию в своем собственном коде, независимо от того, используете ли вы Python 3.5 или 3.6, я думаю, что это аккураторное понятие и будет особенно полезно для тех программистов, которые работают с другими, которые более знакомы с Статический напечатанный язык.

Связанное чтение