请考虑Python 3.8+中的以下示例。假设一个函数有任意数量的参数,所有参数都是相同的类型。例如
def fun(*foos):
for foo in foos:
foo.do_something()
我想为foos
参数添加类型,因此假设所有参数都是相同类型的foo_type
。正确的打字方式是什么?
对于我来说,下面是很明显的输入:
from typing import Tuple
def fun(*foos: Tuple[foo_type]) -> None:
for foo in foos:
foo.do_something()
我的IDE (CLion)建议:
def fun(*foos: foo_type) -> None:
for foo in foos:
foo.do_something()
输入foos
参数的哪种方式是正确的,为什么?
我不确定是什么提示了这个问题,答案是(正如您的IDE已经告诉您的):
def fun(*foos: foo_type) -> NoReturn:
for foo in foos:
foo.do_something()
如果你有这样的东西:
def fun(foos: Tuple[foo_type]) -> NoReturn:
for foo in foos:
foo.do_something()
这也可以工作,但当然,这需要使用foo_type
元素的实际元组调用函数。
在fun(*foos: foo_type)
中,未打包的foos
被定义为foo_type
,这就是您想要的。如果你这样做:
def fun(*foos: Tuple[foo_type]) -> NoReturn:
for foo in foos:
foo.do_something()
那么你会得到错误,因为一个元组没有do_something()
(除非你给它一个),但你仍然会得到类型提示。