python typing.Callable 到底是什么?

what exactly is python typing.Callable?

我看过 typing.Callable,但我没有找到任何有用的文档。 typing.Callable 到底是什么?

typing.Callable is the type you use to indicate a callable. Most python types that support the () operator are of the type collections.abc.Callable. Examples include functions, classmethods, staticmethods,绑定方法和 lambda。

总而言之,任何具有 __call__ 方法(() 的实现方式)的东西都是可调用的。

PEP 677 试图引入隐含的 tuple-with-arrow 语法,这样像 Callable[[int, str], list[float]] 这样的东西可以更直观地表达为 (int, str) -> list[float]。 PEP 被拒绝是因为考虑到增加的维护负担和可能的混淆空间,新语法的好处被认为是不够的。

请参阅文档 here

简写,Callable是一个类型提示,表示一个函数其他可以调用的对象。

考虑下面的一个简单示例。 bar参数是一个可调用对象,它接受两个整数作为参数,returns一个整数。

>>> def foo(bar: Callable[[int, int], int], a: int, b: int) -> int:
...     return bar(a, b)
...
>>> foo(int.__add__, 4, 5)
9
>>> class A:
...     def __call__(self, a, b):
...         return a * b
...
>>> foo(A(), 6, 7)
42
>>> foo(lambda x, y: x - y, 8, 3)
5
>>>

typing 模块用于类型提示:

This module provides runtime support for type hints.

什么是类型提示?

文档提供了这个例子:

def greeting(name: str) -> str:
    return 'Hello ' + name

In the function greeting, the argument name is expected to be of type str and the return type str. Subtypes are accepted as arguments.

如何使用typing.Callable

假设您要定义一个函数,它接受两个整数并对它们执行某种操作 returns 另一个整数:

def apply_func(a: int, b: int, func) -> int:
    return func(a, b)

因此 apply_funcfunc 参数的预期类型是“可以调用的东西(例如函数),它接受两个整数参数和 returns 一个整数”:

typing.Callable[[int, int], int]

为什么首先要考虑类型提示?

使用类型提示可以执行类型检查。如果您使用 IDE 之类的 PyCharm 或 Visual Studio 代码,如果您使用的是意外类型,您将获得视觉反馈:

我想补充以 Python 3.9 开头的其他答案,typing.Callable 已弃用。您应该改用 collections.abc.Callable

更多细节和原理,你可以看看PEP 585