繁体   English   中英

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

[英]1 as parameter type in function declaration

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

def my_function(param: list):
    pass

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

func myFunction(param: [Any]) {
//
}

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

def my_function_2(param: []):
    pass

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

def my_function_3(param: 1):
    pass

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

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

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

>>> print(my_function_3.__annotations__)
{'param': 1}

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

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

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

$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation

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


最后一件事:

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

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


但是,它们对stdlib( dataclass装饰器)中的至少一个东西确实有意义。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM