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

时间:2018-06-02 00:48:34

标签: python python-3.x function types parameters

如果你需要在我的例子中用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中调用。具有预期参数类型的函数 one ...为什么会发生这种情况,为什么我没有看到任何警告以及我必须传递给函数2和3以满足参数类型I的变量类型错误地要求?

1 个答案:

答案 0 :(得分:9)

注释对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以满足错误请求的参数类型

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

<子> 1。但是,他们对stdlib中的至少一件事the dataclass decorator有意义。

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

<子> 3。您甚至无法对其进行测试 - isinstance(obj, 1)会引发异常because 1 is not an instance of type。但是,如果可以,只有通过调用obj(或1的子类,其中没有)作为元类创建1,它才能返回true,这是不可能的,或者如果obj.__class__设置为1(或子类),这是不可能的,或者int有一个接受obj的实例或子类钩子,它没有'吨。但是 - 至少在CPython和PyPy中 - 它甚至都不会那么遥远。当然,您可以始终使用低于C ++的Python下面的Python,并直接修改ob_type下面的结构的obj字段以指向1对象,但如果您这样做,你试图用obj做的任何事情只会是段错误。