问题描述
__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
之外,可以通过检查在python3中重新实现__qualname__
吗? 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”的事实,对于将函数存储在变量或变量中的情况也不起作用。通过更多的函数调用层传递。仅在部分情况下您不需要它,因为您在编写代码时已经拥有了所需的信息,所以它只能工作。