【发布时间】:2020-09-07 19:25:44
【问题描述】:
__qualname__ 属性对我很有用,因为它将函数上下文化;但是,我很难将其用于我的用例,因为:
-
__qualname__返回一个字符串。对于我的用例,我需要对父对象的引用。 -
__qualname__有时会返回super类而不是引用的类。例如:class Parent(): def __init__(self): pass class Child(Parent): pass print(Child.__init__.__qualname__) # Prints: "Parent.__init__" -
我正在开发的包必须是健壮的,据我所知,
__qualname__的边缘情况不是documented。
在parsing the Python file 和ast 之外,__qualname__ 是否可以通过检查在 Python3 中重新实现? Python如何实现__qualname__?在重新实现核心功能时,我想我可以根据我的用例对其进行调整。
先前的研究:
- PEP 3155:https://www.python.org/dev/peps/pep-3155/
- Python 2
qualname实现:https://github.com/wbolster/qualname/blob/master/qualname.py - 解析
__qualname__以获取引用:Get defining class of unbound method object in Python 3 - Python 2
__qualname__堆栈溢出:Reproduce effects of Python 3.3 __qualname__ in earlier Pythons
我无法在 Python 源代码中找到 qualname 实现。
【问题讨论】:
-
您能否简要介绍一下您要使用
__qualname__属性实现的目标?表示您想使用__qualname__解决哪个问题?也许人们会想到其他方法。 -
为什么在您的示例中将
__qualname__输出称为“意外”?由于子类没有覆盖__init__,因此它是从父类继承的。__qualname__返回方法引用的字符串路径,在本例中为父类__init__。 -
感谢您对此进行调查 :) @klaas 我希望根据函数或方法的引用重建虚线路径。例如,如果提供对
Child.__init__的引用,我希望能够返回由[Child, Child.__init__]组成的列表。这与以下类似但更通用:stackoverflow.com/questions/3589311/… -
Here's where CPython determines a function or class's
__qualname__. 它发生在编译时,并且依赖于解析树信息。 -
就像问题问的那样......我正在尝试:“在 Python 3.7 中重新实现 Python 的
__qualname__”。你能帮我解决这个问题吗?为了有所帮助,我调整了帖子以澄清我的意图和观点。很抱歉造成混乱,感谢您的耐心等待。我尽力了!
标签: python python-3.x introspection