我想在我当前的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 :(得分:75)
在评论中注明@jonrsharpe,可以使用typing.Callable
:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
问题是,Callable
上的Callable[..., Any]
被翻译为types
,这意味着:
可调用的任意数量的/ 类型的参数,并返回任何类型的值。在大多数情况下,这并不是你想要的,因为你几乎可以传递任何函数。您还希望隐藏函数参数和返回类型。
这就是为什么typing
中的许多sum
被重载以支持表示这些额外类型的子脚本的原因。因此,例如,如果您的函数int
需要两个int
并返回def sum(a: int, b: int) -> int: return a+b
:
Callable[[int, int], int]
您的注释将是:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
也就是说,参数在外部订阅中是子脚本的,返回类型是外部订阅中的第二个元素。一般来说:
for i in ...:
答案 1 :(得分:3)
另一个有趣的注意事项是,您可以使用内置函数type()
来获取内置函数的类型并使用它。
你可以拥有
def f(my_function: type(abs)) -> int:
return my_function(100)
或者某种形式
答案 2 :(得分:1)
一个简单而奇特的解决方案是:
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