inspect.signature
文档指出它支持将类作为输入,但是并没有涉及任何细节:
可接受从普通函数和类到
functools.partial()
对象的各种Python可调用对象。
如果我致电inspect.signature(MyClass)
,它将返回什么签名?它是否返回MyClass.__init__
的签名?还是MyClass.__new__
?还是其他?
答案 0 :(得分:9)
它会尽其所能尽一切可能。我认为这些细节可能是故意未记录在案的,因为它们很复杂并且可能会越来越多,因此随着新的Python版本增加了更多尝试的内容。
例如,从CPython 3.7.3开始,code path按顺序尝试以下操作:
__call__
,则它将使用元类__call__
的签名,并删除第一个参数。__new__
方法,则它将使用__new__
签名并删除第一个参数。__init__
方法,则它将使用__init__
签名并删除第一个参数。__text_signature__
。如果找到一个,它将解析__text_signature__
以获得签名信息。__init__
是object.__init__
,类型的__new__
是object.__new__
,则它返回{{1 }}类。 (这时有一个误导性的注释,并且可能包含涉及元类的错误-注释说它将检查object
,但没有这样做。我认为this commit可能在这里犯了一个错误。)type.__init__
称其找不到任何东西。