使用 types.FunctionType 与 typing.Callable 的类型提示注释?
Using type hint annotation using types.FunctionType vs typing.Callable?
使用 types.FunctionType vs 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
可以是任何类型的可调用对象(函数、方法、class 等),而 FunctionType
仅限于函数。
我忽略了什么吗?在某些情况下使用 FunctionType
比 Callable
有好处吗?
types
模块早于 PEP 484 注释,其创建主要是为了使 运行 对象的时间自省更容易。例如,要确定某个值是否为函数,您可以 运行 isinstance(my_var, types.FunctionType)
.
typing
模块包含专门用于辅助静态分析工具(如 mypy)的类型提示。例如,假设您要指示参数 必须 是接受两个 int 和 returns 一个 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
的具体实例,而不是任意可调用的值,这一点至关重要。
使用 types.FunctionType vs 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
可以是任何类型的可调用对象(函数、方法、class 等),而 FunctionType
仅限于函数。
我忽略了什么吗?在某些情况下使用 FunctionType
比 Callable
有好处吗?
types
模块早于 PEP 484 注释,其创建主要是为了使 运行 对象的时间自省更容易。例如,要确定某个值是否为函数,您可以 运行 isinstance(my_var, types.FunctionType)
.
typing
模块包含专门用于辅助静态分析工具(如 mypy)的类型提示。例如,假设您要指示参数 必须 是接受两个 int 和 returns 一个 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
的具体实例,而不是任意可调用的值,这一点至关重要。