Python获取当前函数__qualname__的简单可靠实现方法
我需要获取当前函数的限定名称,也就是类似函数或类属性的__qualname__值,但inspect.stack()仅能返回简单的非限定名称。
因此我希望能通过现有内省信息计算得到限定名称。由于不了解Python内部表示机制,我尝试了多次试错仍未找到可行方法。Python本身可以计算限定名称,说明所需的所有信息都已存在,只是我不清楚获取路径。
我在Stack Overflow上搜索到了几种解决方案,但都存在缺陷:
检查栈帧本地变量
该方法由@Aran-Fey提出,核心逻辑是扫描栈的本地变量,返回第一个出现的__qualname__:
def retrieveQualifiedName(): f = inspect.currentframe() while f: if '__qualname__' in f.f_locals: return f.f_locals['__qualname__'] f = f.f_back return None
该方法对直接嵌套在其他类中的类有效,但如果嵌套层级中存在函数就会失效。
适用场景示例:
class A: class B: pass
失效场景示例:
class A: def a(self): class B: pass return B()
借助第三方executing库实现
@Alex Hall建议使用第三方内省库executing实现:
import executing def retrieveQualifiedName(): f = inspect.currentframe().f_back.f_back return executing.Source.executing(f).code_qualname()
该库计算限定名称的准确性很高,但有两个问题促使我寻找其他方案:一是引入第三方依赖会提高维护成本,无法直接用于简单脚本编写,需要完整的项目定义和构建流程,我希望尽可能避免这种情况;二是executing库需要解析源代码来推断限定名称,会产生额外的性能开销,我更希望直接从解释器已有的信息中提取限定名称。
内容的提问来源于stack exchange,提问作者ivan golotin
相关产品推荐
相关产品推荐

