Тип аннотации в 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)