inspect.signature如何与类一起使用?

时间:2019-05-29 08:29:26

标签: python class signature

inspect.signature文档指出它支持将类作为输入,但是并没有涉及任何细节:

  

可接受从普通函数和类到functools.partial()对象的各种Python可调用对象。

如果我致电inspect.signature(MyClass),它将返回什么签名?它是否返回MyClass.__init__的签名?还是MyClass.__new__?还是其他?

1 个答案:

答案 0 :(得分:9)

它会尽其所能尽一切可能。我认为这些细节可能是故意未记录在案的,因为它们很复杂并且可能会越来越多,因此随着新的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__,则它返回{{1 }}类。 (这时有一个误导性的注释,并且可能包含涉及元类的错误-注释说它将检查object,但没有这样做。我认为this commit可能在这里犯了一个错误。)
  • 如果仍然找不到任何东西,它会放弃并举起type.__init__称其找不到任何东西。