函数签名的 Python 3 类型提示

pat*_*ato 11 python type-hinting python-3.x

有没有办法用 Python (3.5+) 类型提示声明函数对象的签名?具体来说,有没有办法声明一个函数可以接受什么类型的函数对象或一个变量可以引用什么类型的函数对象。

我确定它可能会变得非常混乱(例如,它可以使用 C++11 lambda 类型),但是至少有某种方法可以检查函数类型吗?

例如:

def func1(x: int) -> int:
    return x

def func2(x: int, y: int) -> int:
    return x + y

# 'TwoArgFn' is a 'function type' that accepts two ints and returns an int
def takes_two(f: TwoArgFn) -> int:
    return f(123, 456)
Run Code Online (Sandbox Code Playgroud)

func1作为参数传递到takes_two应该是一个错误,而传递func2是好的。

dse*_*uss 13

为此,请使用typing.Callable类型(请参阅此处):

from typing import Callable

def takes_two(f: Callable[[int, int], int]) -> int:
    return f(123, 456)
Run Code Online (Sandbox Code Playgroud)

第一个参数Callable是函数参数的类型列表,而第二个参数是返回类型。

当然,python 本身根本不检查类型。为此,您应该使用其他工具,例如mypy