为什么应用于实例的 Python help 函数在某些情况下返回有关父类的页面,而在其他情况下则不返回?



我试图了解当帮助函数用于查询在我的代码中创建的对象时如何获得有用的结果。我对不同类的不同行为感到困惑。

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("")测试,似乎是一种不必要的不一致。当然,可能有很多我不知道的原因,所以我在这里提出了一个新问题,重点是这个问题。

相关内容

  • 没有找到相关文章

最新更新