使用类型提示注释使用类型.函数类型与打字。可以打电话吗?

2024-06-25 16:52:44 发布

您现在位置:Python中文网/ 问答频道 /正文

使用types.FunctionTypevstyping.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仅限于函数。
我是不是忽略了什么?在某些情况下使用FunctionTypeCallable有什么好处吗?在


Tags: 函数nameimporttyping类型returndeftypes
1条回答
网友
1楼 · 发布于 2024-06-25 16:52:44

types模块早于pep484注释,其创建主要是为了使对象的运行时内省更容易。例如,要确定某个值是否是函数,可以运行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模块中的任何内容。唯一的例外是,如果您的函数的编写方式非常关键,您需要接收的值是FunctionType的实例,而不是任意可调用的。在

相关问题 更多 >