Тип аннотации в Python означает статическую проверку типов? - PullRequest
0 голосов
/ 17 февраля 2019

Я смотрю на модуль typing из python, потому что надеюсь реализовать некоторую статическую проверку типов в проекте, написанном на python.

Когда я определяю функцию, такую ​​как , из документа

def greeting(name: str) -> str:
    return 'Hello ' + name

и пытаюсь сделать что-то вроде greeting(3), я действительно получаю следующую ошибку

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in greeting
TypeError: must be str, not int

Но когда я снова определяю функцию с именем test

def test(a: int) -> None:
    print(a)

и выполняю test("a"), у меня печатается a без каких-либо ошибок.Я также попытался

def test(a: str) -> None:
    print(a)

и сделал test(3), но не возникла ошибка TypeError.

Я определил обе функции в одной и той же среде, то есть в сеансе взаимодействия Python с использованием iTerm.Почему это случилось?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Тип аннотации в python НЕ принудительная статическая проверка типов.

Python по-прежнему динамический язык, где интерпретатор проверяет, есть ли у него метод для выполнения операции, добавьте str («Привет») и добавить целое число (3), когда он достигает этой строки во время цикла выполнения. Pep-484 утверждает, что разработчики ядра не хотят изменять это с помощью аннотаций.

Если вы посмотрите на документацию, она называется 'подсказки типа' ,Подсказки не являются обязательными.

Подсказки типов действительно предназначены для разработчиков и их инструментов (таких как IDE) для лучшего документирования ожидаемого типа параметра.Но добавление этой формы документации не накладывает никаких ограничений на аргумент.Это просто документация .Фактически, лучше всего рассматривать эти аннотации как документацию .

Ошибка, которую вы видите, возникает без этих аннотаций.Например,

>>> "Hello" + 3
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

Можно разработать инструменты для этого, если хотите.Аннотация к объекту

__annotations__

Почему это так? В python мы обычно не делаем явных проверок типов.Вместо этого мы просто пытаемся вызвать метод, например «добавить« привет »и 3», и допустим ошибку.Вызывающий функции должен предоставить правильные типы.Но это также означает, что автор функции должен точно задокументировать параметр.Подсказки типов помогают описать ожидаемый тип и сделать его доступным для объекта, что полезно для подключения других инструментов.Раньше мы писали это как документацию, например:

def greeting(name):
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + name

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

 def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello" + str(name)

def greeting(name: str) -> str:
    """Greeting to name
    :param name: str, the name to greet
    Returns string"""
    return "hello {}".format(name)
0 голосов
/ 17 февраля 2019

Подсказка находится в номере строки: ошибка возникает внутри функции, когда вы пытаетесь добавить 'Hello' и 3.Аннотации типов проверяются синтаксической корректностью интерпретатором, но никакие другие действия не выполняются.

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

...