如何在 Python 3.7 中重新实现 Python 的 __qualname__? (有一些小的调整)

How to reimplement Python's __qualname__ in Python 3.7? (with some minor adjustments)

__qualname__ 属性对我很有用,因为它使函数上下文化;但是,我很难将其用于我的用例,因为:

  1. __qualname__ returns 一个字符串。对于我的用例,我需要对父对象的引用。

  2. __qualname__ 有时 returns super class 而不是引用的 class。例如:

    class Parent():
    
        def __init__(self):
            pass
    
    
    class Child(Parent):
        pass
    
    
    print(Child.__init__.__qualname__)  # Prints: "Parent.__init__"
    
  3. 我正在开发的包需要健壮,据我所知 __qualname__ 的边缘情况不是 documented

parsing the Python file 之外 ast__qualname__ 是否可以通过检查在 Python3 中重新实现? Python如何实现__qualname__?在重新实现核心功能时,我想我可以根据我的用例对其进行调整。


前期研究:

我无法在 Python 源代码中找到 qualname 实现。

你不会得到你想要的。你想让 your_thing(Parent.__init__) 说一些关于 Parent 的事情,your_thing(Child.__init__) 说一些关于 Child 的事情,但是 Parent.__init__Child.__init__ 是同一个对象。

您已经通过两种不同的方式访问了该对象,但是 Python 没有保留任何记录。无论您实现什么,都只会收到一个函数对象,而不会收到您要查找的信息。

即使你做了一些可怕的堆栈检查来查看 your_thing(Child.__init__) 的源代码中写着“Child”的事实,这也不适用于函数存储在变量或通过更多层的函数调用传递。它只会在你不需要它的一小部分情况下不可靠地工作,因为你在编写代码时已经有了你想要的信息。