如何在类型提示中指定函数类型?

时间:2016-06-15 12:14:52

标签: 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 parameter `func`?

    # do some processing
    pass

我检查了PEP 483,但在那里找不到函数类型提示。

3 个答案:

答案 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