如何在Python 3.7中重新实现Python的__qualname__? 稍作调整

问题描述

__qualname__属性对我很有用,因为它可以使函数上下文化。但是,由于以下原因,我很难使用我的用例:

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

  2. __qualname__有时返回super类而不是引用的类。例如:

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

parsing the Python fileast之外,可以通过检查在python3中重新实现__qualname__吗? Python如何实现__qualname__?我认为在重新实现核心功能时,我将能够对其进行调整以适应我的用例。


先前的研究:

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

解决方法

您不会得到想要的东西。您希望your_thing(Parent.__init__)谈论Parentyour_thing(Child.__init__)谈论Child,但是Parent.__init__Child.__init__是相同的对象。

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

即使您做了一些可怕的堆栈检查工作,以查看your_thing(Child.__init__)的源代码中包含“ Child”的事实,对于将函数存储在变量或变量中的情况也不起作用。通过更多的函数调用层传递。仅在部分情况下您不需要它,因为您在编写代码时已经拥有了所需的信息,所以它只能工作。