3

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

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:有没有一种简单的方法可以实现这一点?

4

2 回答 2

2

如果你想创建一个子类str并显示help内置的提示,你可以使用 docstrings。例如下面的子类

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方法将没有用。

它失败的原因是当将 a 传递strhelp内置函数时,它被视为函数的名称,并且显然没有函数命名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.

于 2019-12-20T22:59:28.767 回答
0

我不确定这里的约定,但是在搜索完pydoc代码后,我想为我自己的问题提供更详细的答案(pydoc帮助文本对细节的信息不是很丰富)。这

当传递一个类型为匹配的参数时type("")help检查参数是否为:

  • 在列表中 ['keywords', 'symbols', 'topics', 'modules', 'modules *', 'True', 'False', 'None'];
  • 关键字(例如“来自”);
  • 一个符号(例如'%'、'<');
  • 一个主题(例如“功能”、“方法”);

这是在pydoc.Helper.help方法中完成的。如果找到匹配项,则返回一些特定的帮助文本。

如果上述条件均不成立,则程序流程继续,并将对象传递pydoc.render_docpydoc.resolve函数。在这里,如果对象是str(包括子类的实例,由内置函数 解释) isinstance,则该pydoc.resolve函数尝试定位由参数值定义的模块,ImportError如果没有则引发异常。

因此,help('METHODS')提供有关 python 方法的帮助,同时help(Cls1('METHODS'))返回错误(Cls1问题中定义的位置)。

这解释了我看到的行为。对我来说,使用 中的isinstance测试pydoc.resolve,而不是 中type("")使用的测试pydoc.Helper.help,似乎是不必要的不​​一致。当然,这可能有很多我不知道的原因,所以我在这里提出了一个新的问题,关注这个问题

于 2019-12-23T16:31:40.703 回答