Python “See help(type(self)) for accurate signature.”

烂漫一生 提交于 2020-08-04 05:44:02

问题


I have seen the following statement in a number of docstrings when help()ing a class: "See help(type(self)) for accurate signature."

Notably, it is in the help() for scipy.stats.binom.__init__ and for stockfish.Stockfish.__init__ at the very least. I assume, therefore, that it is some sort of stock message.

In any case, I can't figure out what the heck it means. Is this useful information? Note that, being "outside" of the class, so to speak, I never have access to self. Furthermore, it is impossible to instantiate a class if I cannot access the signature of the __init__ method, and can therefore not even do help(type(my_object_instantiated)). Its a catch 22. In order to use __init__, I need the signature for __init__, but in order to read the signature for __init__, I need to instantiate an object with __init__. This point is strictly academic however, for even when I do manage to instantiate a scipy.stats.binom, it actually returns an object of an entirely different class, rv_frozen, with the exact same message in its __init__ docstring, but whose signature is entirely different and entirely less useful. In other words, help(type(self)) actually does not give an accurate signature. It is useless.

Does anyone know where this message comes from, or what I'm supposed to make of it? Is it just stock rubbish from a documentation generator, or am I user-erroring?


回答1:


There is a convention that the signature for constructing a class instance is put in the __doc__ on the class (since that is what the user calls) rather than on __init__ (or __new__) which determines that signature. This is especially true for extension types (written in C) whose __init__ cannot have its signature discovered via introspection.

The message that you see is part of the type class (see help(type.__init__)) and is thus inherited by metaclasses by default.

In some versions, scipy.stats.binom confuses the matter by not actually being a type; it is merely an instance of another class that (like type) is callable. So asking for help on it merely gives the help for that class (just like help(1) gets you help(int))—you have to look at its __call__ for further information (if any). And asking for help on the result of calling it gives you help for the actual class of whatever it returns, as you observed.



来源:https://stackoverflow.com/questions/54114270/python-see-helptypeself-for-accurate-signature

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!