如何在 Python 3.7 中重新实现 Python 的 __qualname__? (有一些小的调整)
How to reimplement Python's __qualname__ in Python 3.7? (with some minor adjustments)
__qualname__
属性对我很有用,因为它使函数上下文化;但是,我很难将其用于我的用例,因为:
__qualname__
returns 一个字符串。对于我的用例,我需要对父对象的引用。
__qualname__
有时 returns super
class 而不是引用的 class。例如:
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 实现。
你不会得到你想要的。你想让 your_thing(Parent.__init__)
说一些关于 Parent
的事情,your_thing(Child.__init__)
说一些关于 Child
的事情,但是 Parent.__init__
和 Child.__init__
是同一个对象。
您已经通过两种不同的方式访问了该对象,但是 Python 没有保留任何记录。无论您实现什么,都只会收到一个函数对象,而不会收到您要查找的信息。
即使你做了一些可怕的堆栈检查来查看 your_thing(Child.__init__)
的源代码中写着“Child”的事实,这也不适用于函数存储在变量或通过更多层的函数调用传递。它只会在你不需要它的一小部分情况下不可靠地工作,因为你在编写代码时已经有了你想要的信息。
__qualname__
属性对我很有用,因为它使函数上下文化;但是,我很难将其用于我的用例,因为:
__qualname__
returns 一个字符串。对于我的用例,我需要对父对象的引用。__qualname__
有时 returnssuper
class 而不是引用的 class。例如: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 实现。
你不会得到你想要的。你想让 your_thing(Parent.__init__)
说一些关于 Parent
的事情,your_thing(Child.__init__)
说一些关于 Child
的事情,但是 Parent.__init__
和 Child.__init__
是同一个对象。
您已经通过两种不同的方式访问了该对象,但是 Python 没有保留任何记录。无论您实现什么,都只会收到一个函数对象,而不会收到您要查找的信息。
即使你做了一些可怕的堆栈检查来查看 your_thing(Child.__init__)
的源代码中写着“Child”的事实,这也不适用于函数存储在变量或通过更多层的函数调用传递。它只会在你不需要它的一小部分情况下不可靠地工作,因为你在编写代码时已经有了你想要的信息。