inspect.signature
文档中说明它支持类作为输入,但并未详细说明。其接受广泛的 Python 可调用对象,包括普通函数、类以及 functools.partial()
对象。如果我调用 inspect.signature(MyClass)
,它将返回什么签名?它会返回 MyClass.__init__
的签名还是 MyClass.__new__
的签名?或者其他的东西?inspect.signature
文档中说明它支持类作为输入,但并未详细说明。其接受广泛的 Python 可调用对象,包括普通函数、类以及 functools.partial()
对象。如果我调用 inspect.signature(MyClass)
,它将返回什么签名?它会返回 MyClass.__init__
的签名还是 MyClass.__new__
的签名?或者其他的东西?它尽可能地尝试了所有合理的方法。我认为这些细节可能是有意不记录的,因为它们很复杂,并且随着新的Python版本添加更多内容,可能会变得更加复杂。
例如,在CPython 3.7.3中,代码路径按顺序尝试以下内容:
__call__
,则使用元类__call__
的签名,第一个参数已删除。__new__
方法,则使用__new__
签名,第一个参数已删除。__init__
方法,则使用__init__
签名,第一个参数已删除。__text_signature__
。 如果找到一个,它会解析__text_signature__
以获取签名信息。__init__
是object.__init__
并且该类型的__new__
是object.__new__
,则返回object
类的签名。(在这一点上有一个误导性的注释和可能涉及元类的错误-该注释说它要检查type.__init__
,但它并没有这样做。我认为这个提交可能在这里犯了一个错误。)ValueError
,表示无法找到任何内容。
@staticmethod
修饰,它实际上仍会截断元类的__call__
的第一个参数。不错的微妙错误。 - Aran-Fey