- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 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/
我有这样的代码: class A(): def __init__(self, a): self.a = a def outer_method(self):
我想在不将 type(testObject) 更改为 FunctionType 的情况下实现以下功能: import functools class TestClass(object): de
我正在努力加强我的 Python 技能,我遇到了 Open-Source code for Saltstack那是使用types.FunctionType,我不明白发生了什么。 salt.cloud.
我正在尝试使用 python 检查模块检查源代码。我在本例中检查的代码示例是: class xxx: def __init__(self): pass def xxxm
我正在尝试对嵌套函数(函数内部的函数)进行单元测试,我正在使用下面链接中的代码(“嵌套”是函数名称),它将提供闭包并返回可从测试中调用的有效函数。它适用于简单的功能。我试图让它适用于递归函数。 举个例
我对基于 https://stackoverflow.com/a/10303539/4113228 的代码片段有疑问 当我尝试编译时: import types dynf = types.Functi
在我的代码中,我需要检测变量是否是函数并对其执行一些操作。 一切都很顺利,直到我现在使用 functools 创建了一个部分函数,突然我的一些测试失败了: import types import
如果是直接调用函数,可以通过以下代码获取Function类型。 Function * fun = callInst->getCalledFunction(); Function * funTyp
我们可以转换llvm::FunctionType的对象转换为 C/C++ 风格的函数原始指针? C/C++ 风格的函数原始指针示例:uint64_t (*funPtr)(uint64_t* args)
使用 types.FunctionType 有哪些缺点或好处?对比typing.Callable作为类型提示注释? 考虑以下代码... import types import typing def f
免责声明:我知道我正在做的事情可能永远永远不会在真实程序中完成。 我最近刚刚了解了 python 的 types.CodeType 和 types.FunctionType,这让我对通过这些类手动创建
我是一名优秀的程序员,十分优秀!