我试图了解当帮助函数用于查询在我的代码中创建的对象时如何获得有用的结果。我对不同类的不同行为感到困惑。
Cls1 = type( 'FirstClass', (str,), {'__doc__':'My new class'})
inst1 = Cls1('Hello World')
Cls2 = type( 'SecondClass', (object,), {'__doc__':'My second new class'})
inst2 = Cls2( )
help(inst1)
产生No Python documentation found for 'Hello World'
,而help(inst2)
产生:
Help on SecondClass in module __main__ object:
class SecondClass(builtins.object)
| My second new class
|
...
我想创建一个基于str
的类,并能够通过help
函数显示有用的消息:有没有一种简单的方法来实现这一点?
如果要创建str
的子类并显示内置help
提示,则可以使用文档字符串。例如以下子类
class NewString(str):
"""This is a brand new implementation of string type"""
def test_method(self):
"""This is a test method in the new implementation"""
pass
在help(NewString)
上具有以下输出
class NewString(builtins.str)
| This is a brand new implementation of string type
|
| Method resolution order:
| NewString
| builtins.str
| builtins.object
|
| Methods defined here:
|
| test_method(self)
| This is a test method in the new implementation
...
但对于字符串的所有实例,help
方法将没有用。
它失败的原因是,当将str
传递给help
内置时,它被视为函数的名称,并且由于显然没有名为Hello World
的函数,因此它会显示错误。
运行以下help('help')
将输出:
Help on _Helper in module _sitebuiltins object:
help = class _Helper(builtins.object)
| Define the builtin 'help'.
|
| This is a wrapper around pydoc.help that provides a helpful message
| when 'help' is typed at the Python interactive prompt.
|
| Calling help() at the Python prompt starts an interactive help session.
| Calling help(thing) prints help for the python object 'thing'.
...
这是对help
的帮助.
我不确定这里的约定,但在搜索了pydoc
代码后,我想为我自己的问题提供更详细的答案(pydoc
帮助文本对细节的信息不是很丰富(。这
当传递类型匹配的参数时type("")
,help
检查参数是否为:
- 在列表中["关键字"、"符号"、"主题"、"模块"、"模块*"、"真"、"假"、"无"];
- 关键字(例如"发件人"(;
- 符号(例如"%", '<');
- 主题(例如"函数"、"方法"(;
这是在pydoc.Helper.help
方法中完成的。如果找到匹配项,则返回一些特定的帮助文本。
如果上述条件都不成立,则程序流将继续,并且对象通过pydoc.render_doc
传递给pydoc.resolve
函数。在这里,如果对象是str
的实例(包括子类的实例,由内置函数isinstance
解释(,则pydoc.resolve
函数尝试定位由参数值定义的模块,如果没有,则会引发ImportError
异常。
因此,help('METHODS')
提供了有关 python 方法的帮助,而help(Cls1('METHODS'))
返回错误(其中Cls1
如问题中所定义(。
这解释了我看到的行为。在我看来,在pydoc.resolve
中使用isinstance
测试,而不是在pydoc.Helper.help
中使用type("")
测试,似乎是一种不必要的不一致。当然,可能有很多我不知道的原因,所以我在这里提出了一个新问题,重点是这个问题。