首页 > 解决方案 > 如何使用更短和自定义的内容选择性地覆盖 python 帮助(MYclass)中的文本?

问题描述

我正在学习编写用户友好的类和方法,我希望用户知道如何从终端使用它们。Python的标准help(MYclass)返回了我不想要的十八行,这是一个小窗口的半个屏幕,那些刚刚学习python的人会失去连续性,前面的行从顶部消失。

有什么方法可以覆盖使用help(MYclass)(或help(MYmethod))显示的内容,以便它只显示(在这种情况下)单行文档字符串?

虽然一些 IDE 以气泡形式显示文档字符串,但终端不配合。(在 IDLE 以外的 IDE 中键入时,Python 中的三引号(文档字符串)消息是否出现?):

在此处输入图像描述

因此,我转而help寻求帮助,但help对所有这些额外的模板行帮助太大了。

然后我想到了重新定义帮助:

def hhelp(x):
    return x.__doc__
help = hhelp

但我认为这是邪恶的;就像重新定义数字7一样,我还想help(some builtin)正常工作,选择性劫持只会发生在MYclasses。

总有

def doc(x):
    return x.__doc__

如果我找不到任何选择性劫持的东西help()


class A(object):
    """instantiate a = A(x), then use a.sqr() to get x**2"""
    def __init__(self, x):
            self.x = x
    def sqr(self):
            return x**2

结果是十九行。我只想显示我的单行文档字符串。

Help on class A in module __main__:

class A(__builtin__.object)
 |  instantiate a = A(x), then use a.sqr() to get x**2
 |  
 |  Methods defined here:
 |  
 |  __init__(self, x)
 |  
 |  sqr(self)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)

标签: pythonpython-2.7docstring

解决方案


您可以对内置help函数进行monkeypatch 以显示__doc__类的字符串并回退到help其他对象的原始字符串:

import inspect
import pydoc

class Helper(object):
    def __init__(self):
        self.help = __builtins__.help

    def __call__(self, obj):
        if inspect.isclass(obj):
            return pydoc.pager(obj.__doc__)
        else:
            return self.help(obj)

__builtins__.help = Helper()

产生以下输出:

class Foo:
    """This is the docstring."""

    def foo(self):
        return None

help(Foo)

# Output:
# This is the docstring.

推荐阅读