问题:如何在类型提示中指定函数类型?
我想在当前的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 parameter `func`?
# do some processing
pass
我检查了PEP 483,但在那里找不到函数类型提示。
回答 0
正如@jonrsharpe在评论中指出的,可以使用以下方法完成typing.Callable
:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
问题是,Callable
将其本身翻译为Callable[..., Any]
:
一个Callable接受任意数量的/类型的参数,并返回任何类型的值。在大多数情况下,这不是您想要的,因为您几乎可以允许传递任何函数。您也希望提示函数参数和返回类型。
这就是为什么许多types
in typing
重载以支持表示这些额外类型的子脚本的原因。因此,例如,如果您有一个函数sum
接受两个int
s并返回一个int
:
def sum(a: int, b: int) -> int: return a+b
您的注释为:
Callable[[int, int], int]
也就是说,参数在外部订阅中带有下标,返回类型作为外部订阅中的第二个元素。一般来说:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
回答 1
另一个需要注意的有趣点是,您可以使用内置函数type()
来获取内置函数的类型并使用它。所以你可以
def f(my_function: type(abs)) -> int:
return my_function(100)
或那种形式的东西