Python 如何在类型提示中指定函数类型?
我想在我当前的Python 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数 如何在我的类型提示中指定类型函数?Python 如何在类型提示中指定函数类型?,python,python-3.x,python-3.5,type-hinting,mypy,Python,Python 3.x,Python 3.5,Type Hinting,Mypy,我想在我当前的Python 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数 如何在我的类型提示中指定类型函数? import typing def my_function(name:typing.AnyStr, func: typing.Function) -> None: # However, typing.Function does not exist. # How can I specify the type function for the param
import typing
def my_function(name:typing.AnyStr, func: typing.Function) -> None:
# However, typing.Function does not exist.
# How can I specify the type function for the parameter `func`?
# do some processing
pass
我检查了,但在那里找不到函数类型提示。如注释中所述,这可以通过以下方法完成:
问题是,Callable
本身被翻译成Callable[…,Any]
,这意味着:
可调用函数接受任意数量/类型的参数,并返回任意类型的值。在大多数情况下,这不是您想要的,因为您将允许传递几乎任何函数。您还需要提示函数参数和返回类型
这就是为什么类型
中的许多类型
被重载以支持表示这些额外类型的子脚本。例如,如果有一个函数sum
,它取两个int
s并返回一个int
:
def sum(a: int, b: int) -> int: return a+b
您对它的注释是:
Callable[[int, int], int]
也就是说,这些参数在外部订阅中是子脚本,返回类型是外部订阅中的第二个元素。一般而言:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
另一个需要注意的有趣点是,您可以使用内置函数
type()
获取内置函数的类型并使用它。
所以你本来可以
def f(my_function: type(abs)) -> int:
return my_function(100)
或者类似的形式最简单、最奇特的解决方案是:
def f(my_function: type(lambda x: None)):
return my_function()
这可以通过以下方式证明:
def poww(num1, num2):
return num1**num2
print(type(lambda x: None) == type(poww))
输出将是:
True
函数是“我们可能添加”之前的最后一个要点。这个键入的东西将整个python语言提升了一个档次。@javadba-哦,是的,但我仍然不确定是哪个拨号盘。。。顺便问一下,对于*args
、**kwargs
、仅关键字args和仅位置args,可调用[[Arg,类型,此处]、…]
如何?他们没有考虑过在可调用项的类型签名中调用约定吗?;)typing.Callable
似乎更倾向于collections.abc.Callable
:类型提示可以是您想要的任何内容,但它们并不总是经过惰性评估。另外,您的函数是否真的只将内置函数或
作为我的函数
?难道一个lambda
不起作用吗?用户定义的函数或绑定方法?这是一种非常聪明的方法,至少对于疑难解答或头脑风暴来说是这样。不,当运行mypy
时,这会产生错误:错误:无效的类型注释或批注注意:建议:使用类型[…]而不是类型(…)
。这种注释类型的方式不包含有关签名的任何信息:参数数量、这些参数的类型、返回值类型。可以像这样注释函数类型,但我不推荐这样做。正如其他答案中所建议的那样,最好使用键入.Callable
def poww(num1, num2):
return num1**num2
print(type(lambda x: None) == type(poww))