gpt4 book ai didi

python - inspect.signature 究竟如何与类一起工作?

转载 作者:太空狗 更新时间:2023-10-29 22:17:33 27 4
gpt4 key购买 nike

inspect.signature文档声明它支持类作为输入,但没有涉及任何细节:

Accepts a wide range of Python callables, from plain functions and classes to functools.partial() objects.

如果我调用 inspect.signature(MyClass),它会返回什么签名?它是否返回 MyClass.__init__ 的签名?还是 MyClass.__new__?还是别的?

最佳答案

它几乎尝试了所有合理的尝试。我认为细节可能是故意未记录的,因为它们很复杂并且可能会变得更多,因此随着新的 Python 版本添加更多的东西来尝试。

例如,从 CPython 3.7.3 开始,code path按顺序尝试以下操作:

  • 如果元类具有在 Python 中定义的自定义 __call__,它会使用元类 __call__ 的签名并删除第一个参数。
  • 否则,如果该类具有在 Python 中定义的 __new__ 方法,它将使用 __new__ 签名并删除第一个参数。
  • 否则,如果该类具有在 Python 中定义的 __init__ 方法,它将使用 __init__ 签名并删除第一个参数。
  • 否则,它遍历 MRO 寻找 __text_signature__ .如果找到,它会解析 __text_signature__ 以获取签名信息。
  • 如果它仍然没有找到任何东西,如果类型的 __init__object.__init__ 并且类型的 __new__object .__new__,它返回对象类的签名。 (在这一点上有一个误导性的评论和一个可能涉及元类的错误 - 评论说它将检查 type.__init__,但它并没有这样做。我认为 this commit 可能已经这里是一个错误。)
  • 如果它仍然没有找到任何东西,它会放弃并引发一个 ValueError 说它找不到任何东西。

关于python - inspect.signature 究竟如何与类一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com