1作为函数声明中的参数类型

Sta*_*huk 3 python parameters types function python-3.x

如果你需要在Python中指定参数类型,在我的例子中,你需要写这样的东西:

def my_function(param: list):
    pass
Run Code Online (Sandbox Code Playgroud)

在Swift中,您可以指定参数类型,如下所示:

func myFunction(param: [Any]) {
//
}
Run Code Online (Sandbox Code Playgroud)

有一天,我犯了Swift风格的错误并写道:

def my_function_2(param: []):
    pass
Run Code Online (Sandbox Code Playgroud)

现在我注意到它并尝试更奇怪的事情:

def my_function_3(param: 1):
    pass
Run Code Online (Sandbox Code Playgroud)

所有这些函数都是有效的,可以在Python 3.6中调用.具有预期参数类型1的函数...为什么会发生这种情况,为什么我没有看到任何警告以及我必须传递给函数2和3以满足错误请求的参数类型I的变量类型?

aba*_*ert 9

注释对Python的编译器和解释器没有意义.1只要你键入的是一个语法上有效的表达式,Python就会对它进行评估,将其值存储为函数注释的一部分,然后将它留在那里为你做任何你想做的事情(通常都没有).

实际上,您可以看到存储没有问题:

>>> print(my_function_3.__annotations__)
{'param': 1}
Run Code Online (Sandbox Code Playgroud)

注释的要点是使用静态类型检查器,如PEP 484(以及随附的PEP 483PEP 482背景)中所述.

静态类型检查在Python中是可选的,通常使用像mypy这样的专用工具,或者使用集成到像PyCharm这样的IDE中的工具来完成.

如果你对你的代码运行这样的检查器,它会抱怨.例如:

$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation
Run Code Online (Sandbox Code Playgroud)

此错误意味着它无法确定1应该是什么类型.2


最后一件事:

我必须传递给函数2和3以满足错误请求的参数类型I的变量类型

没有哪种类型可以满足这一要求.Python的运行时类型规则比它(可选)静态类型的规则更灵活,但他们不是灵活.3


然而,他们这样做有一个意义在STDLIB至少有一点,dataclass装饰.

2. Mypy继续从这里继续,但没有更多错误,即使您滥用正文中的参数或不正确地调用该函数.据我所知,它跳过检查正文,并将该函数视为采用任何参数并返回一个Any.这是非常合理的 - 你只是得到这一个错误,而不是数百个无用的错误,可能不会有任何意义.

你甚至无法测试它 - isinstance(obj, 1)会引发异常,因为1它不是一个实例type.但是如果可以的话,只有obj通过调用1(或者没有子类1,没有)作为元类创建它才能返回true ,这是不可能的,或者如果obj.__class__设置为1(或子类),这是不可能的,或者如果int有一个接受的实例或子类钩子obj,它没有.但是 - 至少在CPython和PyPy中 - 它甚至都不会那么遥远.当然,你总是可以在Python下面,在C API之下,并直接修改ob_type下面的struct 的字段obj指向1对象,但是如果你这样做,你尝试做的任何事情obj都只是段错误.