Python "See help(type(self)) for accurate signature."

Python "See help(type(self)) for accurate signature."

help()ing a class 时,我在许多文档字符串中看到了以下语句:"See help(type(self)) for accurate signature."

值得注意的是,它在 scipy.stats.binom.__init__help() 中,至少在 stockfish.Stockfish.__init__ 中。因此,我认为这是某种股票信息。

反正我是搞不懂这到底是什么意思。这是有用的信息吗?请注意,作为 class 的 "outside",可以说,我永远无法访问 self。此外,如果我无法访问 __init__ 方法的签名,则无法实例化 class,因此甚至无法执行 help(type(my_object_instantiated))。这是一个陷阱 22。为了使用 __init__,我需要 __init__ 的签名,但为了读取 __init__ 的签名,我需要用 [=18] 实例化一个对象=].然而,这一点完全是学术性的,因为即使我确实设法实例化了一个 scipy.stats.binom,它实际上 returns 是一个完全 不同的 class 的对象, rv_frozen, 在其 __init__ 文档字符串中具有完全相同的消息,但其签名完全不同并且完全没有用。也就是说,help(type(self))其实并没有给出准确的签名。没用。

有谁知道这条消息的来源,或者我应该如何看待它?它只是来自文档生成器的垃圾,还是我的用户错误?

有一个约定,构造class实例的签名放在class上的__doc__(因为那个是用户调用的)而不是 __init__(或 __new__)确定该签名。对于 __init__ 无法通过内省发现其签名的扩展类型(用 C 编写)尤其如此。

您看到的消息是 type class 的一部分(参见 help(type.__init__)),因此默认情况下由 metaclasses 继承。

在某些版本中,scipy.stats.binom 实际上不是一个类型,因此混淆了问题;它只是另一个 class 的实例(如 type)是可调用的。所以在上面请求 help 只会为 that class 提供帮助(就像 help(1) 得到你 help(int))——你有查看其 __call__ 以获取更多信息(如果有)。并根据 调用 的结果请求 help,正如您所观察到的那样,它可以为您 returns 的实际 class 提供帮助。