Аннотации не имеют смысла для компилятора и интерпретатора Python. 1 Пока то, что вы вводите, является синтаксически допустимым выражением, Python будет оценивать его, сохранять его значение как часть аннотаций функции и оставлять еготам вы можете делать все, что вы хотите (что обычно ничего).
На самом деле, вы можете видеть, что это хранится без проблем:
>>> print(my_function_3.__annotations__)
{'param': 1}
Главноеаннотаций для использования средства проверки статического типа, как описано в PEP 484 (и сопровождающих PEP 483 и PEP 482 для фона).
Проверка статического типа необязательна в Python и обычно выполняется с помощью специального инструмента, например mypy , или с инструментами, интегрированными в IDE, например PyCharm .
Если вы запуститетакая проверка вашего кода, он будет жаловаться.Например:
$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation
Эта ошибка означает, что она не может определить, какой тип 1
должен быть. 2
Последнийвещь:
какую переменную мне нужно было бы передать функциям 2 и 3 для удовлетворения типа параметра, который я ошибочно запросил
Нет типа, который бы удовлетворял этому.Правила типов времени выполнения Python более гибкие, чем его (необязательные) правила статического типа, но они не , а гибкие. 3
1,Однако они do имеют значение по крайней мере для одной вещи в stdlib: dataclass
decorator .
2.С этого момента Mypy продолжается, но без ошибок, даже если вы неправильно используете параметр в теле или неправильно вызываете функцию.Насколько я могу судить, он пропускает проверку тела и обрабатывает функцию так, как будто она взяла какие-либо параметры и вернула Any
.И это вполне разумно - таким образом вы получите только одну ошибку вместо сотен бесполезных, которые, вероятно, ничего не будут значить.
3.Вы даже не можете проверить это - isinstance(obj, 1)
вызовет исключение , потому что 1
не является экземпляром type
.Но если бы вы могли, он мог бы вернуть true, только если obj
был создан путем вызова 1
(или подкласса 1
, которого нет ни одного) в качестве метакласса, что невозможно, или если obj.__class__
былиустановить 1
(или подкласс), что невозможно, или если int
имел экземпляр или подкласс подкласса, который принял obj
, а это не так.Но - по крайней мере, в CPython и PyPy - это далеко не уйдет.Конечно, вы всегда можете перейти ниже Python, ниже C API и напрямую изменить поле ob_type
структуры под obj
, чтобы оно указывало на объект 1
, но если вы сделаете это, то все, что вы попытаетесь сделать сobj
будет просто segfault.