pythontyping.Callable到底是什么?

use*_*770 40 python typing

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

Mad*_*ist 42

typing.Callable是用于指示可调用的类型。大多数支持该()运算符的 Python 类型都是collections.abc.Callable. 示例包括函数、classmethods、staticmethods、绑定方法和 lambda。

总之,任何带有__call__方法(这是如何()实现的)的东西都是可调用的。

PEP 677尝试引入隐式带箭头的元组语法,以便Callable[[int, str], list[float]]可以更直观地表达类似的内容(int, str) -> list[float]。PEP 被拒绝,因为考虑到增加的维护负担和可能的混乱空间,新语法的好处被认为不够充分。


Ant*_*der 21

typing模块用于类型提示:

该模块为类型提示提供运行时支持。

什么是类型提示?

文档提供了这个示例:

def greeting(name: str) -> str:
    return 'Hello ' + name
Run Code Online (Sandbox Code Playgroud)

在函数中greeting,参数名称应为类型str和返回类型str。子类型被接受作为参数。

如何使用typing.Callable

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

def apply_func(a: int, b: int, func) -> int:
    return func(a, b)
Run Code Online (Sandbox Code Playgroud)

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

typing.Callable[[int, int], int]
Run Code Online (Sandbox Code Playgroud)

为什么首先要费心类型提示呢?

使用类型提示使您能够执行类型检查。如果您使用 PyCharm 或 Visual Studio Code 等 IDE,如果您使用意外类型,您将获得视觉反馈:

PyCharm 中出现意外的类型标注


dec*_*ory 9

我想补充一下其他答案,即从 Python 3.9 开始,typing.Callable已弃用。你应该改用collections.abc.Callable

有关更多详细信息和基本原理,您可以查看PEP 585

  • 我不明白为什么 Callable 被移至“collections.abc”。这是输入函数的有效方法,与集合完全无关! (6认同)