注解对 Python 的编译器和解释器没有任何意义。1 只要您输入的是语法上有效的表达式,Python 就会计算它,将其值作为函数注解的一部分存储,然后离开它在那里让你做任何你想做的事(通常没什么)。
事实上,您可以看到它的存储没有问题:
>>> print(my_function_3.__annotations__)
{'param': 1}
注释的主要目的是使用静态类型检查器,如PEP 484 中所述(以及随附的PEP 483 和PEP 482 用于背景)。
静态类型检查在 Python 中是可选的,通常使用mypy 等专用工具或PyCharm 等集成到 IDE 中的工具完成。
如果您对您的代码运行这样的检查程序,它会报错。例如:
$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation
这个错误意味着它无法确定1应该是什么类型。2
最后一件事:
我必须将什么样的变量传递给函数 2 和 3 以满足我错误请求的参数类型
没有任何类型可以满足这一点。 Python 的运行时类型规则比它的(可选的)静态类型规则更灵活,但它们没有那么灵活。3
1。但是,它们确实对 stdlib 中的至少一件事有意义,the dataclass decorator。
2。 Mypy 从这里继续,但没有更多错误,即使您滥用主体中的参数或不正确地调用函数。据我所知,它会跳过检查主体,并将函数视为接受任何参数并返回Any。这是相当合理的——这样你只会得到一个错误,而不是数百个可能没有任何意义的无用错误。
3。你甚至无法测试它——isinstance(obj, 1) 将引发异常because 1 is not an instance of type。但是如果可以的话,它只能返回 true 如果 obj 是通过调用 1(或 1 的子类,其中没有)作为元类创建的,这是不可能的,或者如果 obj.__class__ 是设置为1(或子类),这是不可能的,或者如果int 有一个接受obj 的实例或子类挂钩,但它没有。但是——至少在 CPython 和 PyPy 中——它甚至不会走那么远。当然,你总是可以在 Python 之下,在 C API 之下,直接修改obj 下结构的ob_type 字段以指向1 对象,但如果你这样做,任何你尝试做的事情obj 只会出现段错误。