【问题标题】:How to reimplement Python's __qualname__ in Python 3.7? (with some minor adjustments)如何在 Python 3.7 中重新实现 Python 的 __qualname__? (有一些小的调整)
【发布时间】:2020-09-07 19:25:44
【问题描述】:

__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 之外,__qualname__ 是否可以通过检查在 Python3 中重新实现? Python如何实现__qualname__?在重新实现核心功能时,我想我可以根据我的用例对其进行调整。


先前的研究:

我无法在 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


【解决方案1】:

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

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

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

【讨论】:

  • 如前所述,目标是重新实现__qualname__
  • @MichaelPetrochuk:目标是重新实现__qualname__ 调整,其中之一是不可能的。 (调整 1 是微不足道的,但调整 2 不是。)如果不是为了调整,你就用__qualname__
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多