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

Ara*_*Fey 6 python class signature

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

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

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

use*_*ica 10

它会尽其所能尝试几乎所有内容。我认为这些细节可能是故意未记录在案的,因为它们很复杂并且可能会越来越多,因此随着新的Python版本增加了更多尝试的内容。

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

  • 如果该元类具有__call__在Python中定义的自定义,则它将使用该元类的签名__call__并删除第一个参数。
  • 否则,如果该类具有用__new__Python定义的方法,则它将使用__new__签名并删除第一个参数。
  • 否则,如果该类具有__init__用Python定义的方法,则它将使用已__init__删除第一个参数的签名。
  • 否则,它将遍历MRO以寻找__text_signature__。如果找到一个,它将进行分析__text_signature__以获取签名信息。
  • 如果仍然找不到任何内容,则类型__init__object.__init__,类型__new__object.__new__,则返回object类的签名。(这时有一个误导性的注释,并且可能包含涉及元类的错误-注释说它将要检查type.__init__,但并没有这样做。我认为此提交可能在这里了一个错误。)
  • 如果仍然找不到任何东西,它会放弃并提出一条ValueError说法:找不到任何东西。

  • 哈哈,实际上,它被修饰成元类的__call__的第一个参数,即使它是用@staticmethod装饰的。不错的细微错误。 (2认同)