问题
When the python help function is invoked with an argument of string type, it is interpreted by pydoc.Helper.help
as a request for information on the topic, symbol, keyword or module identified by the value of the string. For other arguments, help on the object itself is provided, unless the object is an instance of a subclass of str
. In this latter case, the pydoc.resolve
function looks for a module with a name matching the value of the object and raises an exception if none is found.
To illustrate this, consider the example code:
class Extra(object):
def NewMethod(): return 'New'
Cls1 = type( 'FirstClass', (str,Extra), {'__doc__':'My new class','extra':'An extra attribute'})
inst1 = Cls1('METHODS')
help( 'METHODS' )
help( inst1 )
The first invocation of help
produces information on the topic "METHODS", the 2nd produces an error message because the pydoc.resolve
function is trying to find a module called "METHODS".
This means that it is difficult to provide effective documentation for user defined sub-classes of str
. Would it not be possible for pydoc.resolve
to use a test on the type of the object, as is done in pydoc.Helper.help
, and allow instances of user defined sub-classes to be treated as other class instances?
This question follows from earlier discussion of a related question here.
回答1:
The simple answer is that making user-defined subclasses of str
is not the most common case—partly because the user-defined data but not the string data would be mutable. By the time you have to deal with such, it’s imagined that you know how to write help(type(x))
, and using isinstance
rather than type(…) is …
is the correct default in general. (The other way, you’d have to use help(str(x))
if you wanted to use it, like any other string, to select a help topic, but that’s surely even rarer.)
来源:https://stackoverflow.com/questions/59458390/why-does-the-python-help-class-interpret-sub-classes-of-the-str-class-as-module