python - 使用 types.FunctionType 与 typing.Callable 的类型提示注释?

标签 python python-3.x pycharm type-hinting

使用 types.FunctionType 有哪些缺点或好处?对比typing.Callable作为类型提示注释?

考虑以下代码...

import types
import typing

def functionA(func: types.FunctionType):
    rt = func()
    print(func.__name__)
    return rt

def functionB(func: typing.Callable):
    rt = func()
    print(func.__name__)
    return rt

我能看到的唯一区别是 Callable 可以是任何类型的可调用对象(函数、方法、类等),而 FunctionType 仅限于函数。< br/> 我忽略了什么吗?在某些情况下使用 FunctionType 而不是 Callable 有好处吗?

最佳答案

types 模块早于 PEP 484 注释,其创建主要是为了使对象的运行时内省(introspection)更容易。例如,要确定某个值是否为函数,您可以运行 isinstance(my_var, types.FunctionType)

typing 模块包含专门用于辅助静态分析工具(如 mypy)的类型提示。例如,假设您要指示参数必须 是一个接受两个整数并返回一个str 的函数。您可以这样做:

def handle(f: Callable[[int, int], str]) -> None: ...

没有办法以类似的方式使用 FunctionType:它根本不是为此目的而设计的。

这个函数签名也更灵活:它也可以接受诸如带有 __call__ 的对象之类的东西,因为这些对象确实是可调用的。

为了方便起见,typing 模块的内容有时也可以以类似于 types 的内容的方式用于运行时检查:例如,做 isinstance(f, Callable) 有效。但是,此功能是有意限制的:有意禁止执行 isinstance(f, Callable[[int, int], str])。尝试执行该检查将在运行时引发异常。

也就是说,我不认为使用 typing 中的任何东西执行运行时检查是一种好的方式:typing 模块首先用于静态分析。

出于类似原因,我不会在类型提示中使用 types 模块中的任何内容。唯一的异常(exception)是,如果您的函数是以这样一种方式编写的,即您需要接收的值是 FunctionType 的一个实例,而不是任意可调用的,这一点至关重要。

关于python - 使用 types.FunctionType 与 typing.Callable 的类型提示注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55873205/

相关文章:

python - 为什么我的 Python 程序在 IDE(pycharm) 中运行,但当我从命令行尝试时却没有?

python - 文字和枚举的重载类型提示在 PyCharm 中不起作用

Python 检查列表的第一个和最后一个索引

python - 为什么OpenCV for Python 的cv2.HoughLines 的返回值需要通过索引访问?

python 3 : Why does __spec__ work?

python - pycharm 自动完成 "print()"而不是 "print"

python - 使用 python 将输入发送到使用子进程打开的程序?

python - 想法/解决方案如何编辑PBL(PowerBuilder Library)文件?

Python sympy.Plot - OverflowError : int too large to convert to float

python - 如何使用 Python 在 Airflow 中的另一个 DAG 成功时触发 DAG?