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, classmethod
s, staticmethod
s,绑定方法和 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_func
中 func
参数的预期类型是“可以调用的东西(例如函数),它接受两个整数参数和 returns 一个整数”:
typing.Callable[[int, int], int]
为什么首先要考虑类型提示?
使用类型提示可以执行类型检查。如果您使用 IDE 之类的 PyCharm 或 Visual Studio 代码,如果您使用的是意外类型,您将获得视觉反馈:
我想补充以 Python 3.9 开头的其他答案,typing.Callable
已弃用。您应该改用 collections.abc.Callable
。
更多细节和原理,你可以看看PEP 585
我看过 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, classmethod
s, staticmethod
s,绑定方法和 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 typestr
and the return typestr
. Subtypes are accepted as arguments.
如何使用typing.Callable
假设您要定义一个函数,它接受两个整数并对它们执行某种操作 returns 另一个整数:
def apply_func(a: int, b: int, func) -> int:
return func(a, b)
因此 apply_func
中 func
参数的预期类型是“可以调用的东西(例如函数),它接受两个整数参数和 returns 一个整数”:
typing.Callable[[int, int], int]
为什么首先要考虑类型提示?
使用类型提示可以执行类型检查。如果您使用 IDE 之类的 PyCharm 或 Visual Studio 代码,如果您使用的是意外类型,您将获得视觉反馈:
我想补充以 Python 3.9 开头的其他答案,typing.Callable
已弃用。您应该改用 collections.abc.Callable
。
更多细节和原理,你可以看看PEP 585