Python中为何无法直接调用function.mro()?如何显式获取函数对象MRO?
函数对象MRO获取问题解析
问题复现
用户尝试获取函数对象的方法解析顺序(MRO),编写代码如下:
def num(): return 6 print(type(num).mro()) print(type(num)) print(function.mro())
运行输出:
[<class 'function'>, <class 'object'>] <class 'function'> Traceback (most recent call last): print(function.mro()) ^^^^^^^^ NameError: name 'function' is not defined
发现通过type(num).mro()可正常获取MRO,但直接调用function.mro()触发NameError,而int.mro()、dict.mro()等内置类型调用.mro()却能正常工作,需要解释该现象。
原因解释
- 全局命名空间差异:
int、dict这类基础内置类型的名称直接注册在Python的全局命名空间中,因此可以直接通过名称调用.mro()方法。但函数类型并没有在全局命名空间中暴露名为function的标识符,直接引用自然会触发名称未定义错误。 - 函数类型的正确引用方式:函数对象的实际类型是
types.FunctionType,需要先导入types模块才能直接引用这个类型。示例代码如下:import types def num(): return 6 print(types.FunctionType.mro()) # 输出: [<class 'function'>, <class 'object'>] type(num)的作用:type(num)获取的是函数对象num的类型,也就是function类,这相当于通过实例反向获取了类对象,因此能正常调用.mro()方法。
内容的提问来源于stack exchange,提问作者khajaba khangal
相关产品推荐
相关产品推荐

