繁体   English   中英

inspect.signature究竟是如何与类一起工作的?

[英]How exactly does inspect.signature work with classes?

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

接受各种Python callables,从普通函数和类到functools.partial()对象。

如果我调用inspect.signature(MyClass) ,它会返回什么签名? 它是否返回MyClass.__init__的签名? MyClass.__new__ 或者是其他东西?

它几乎可以尝试一切。 我认为细节可能是故意没有记录的,因为它们很复杂,并且可能会更新,因为新的Python版本增加了更多的东西来尝试。

例如,从CPython 3.7.3开始, 代码路径按顺序尝试以下事项:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM