2009-11-24 44 views
10

我有很多可调用的对象,他们都有__doc__字符串正确填写,但对他们运行帮助产生他们的帮助,而不是帮助基于__doc__Python的pydoc帮助函数在哪里获取内容?

我想改变它,以便在它们上运行帮助产生定制的帮助,这看起来基本上和我得到的,如果它们是实际功能而不是实现__call__的类的实例。

在代码中,我想本作的输出:

class myCallable: 
    def __init__(self, doc): 
     self.__doc__ = doc 

    def __call__(self): 
     # do some stuff 
     pass 

myFunc = myCallable("some doco text") 
help(myFunc) 

看起来更像这个输出:

def myFunc(): 
    "some doco text" 
    # do some stuff 
    pass 

help(myFunc) 
+2

我的猜测是,这里的问题是基于类的myFunc具有类型实例,而另一个具有类型函数。我不确定是否有解决办法。 (尝试打印类型(myFunc)每个看到) – Suppressingfire 2009-11-24 01:25:01

+0

你是正确的类型,是在pydoc内使用的信息? – 2009-11-24 01:49:25

回答

5

help函数(在pydoc模块中实现)不准备查找每实例文档字符串。我通过模块快速浏览了一下,看看是否有办法提供明确的帮助,但似乎没有。它使用inspect模块来确定它是什么类型的,而你的myFunc看起来不像一个函数,它看起来像一个实例。因此,pydoc打印帮助关于实例的类。

这会是很好,如果类似__doc__您可以添加一个__help__属性,但有一个为不支持。

我毫不犹豫地建议,但你最好的选择可能是定义一个新的help功能:

old_help = help 
def help(thing): 
    if hasattr(thing, '__help__'): 
     print thing.__help__ 
    else: 
     old_help(thing) 

,然后把__help__属性上的实例:

class myCallable: 
    def __init__(self, doc): 
     self.__doc__ = doc 
     self.__help__ = doc 
+0

我没有考虑过这种方法,这是一个有趣的建议。我关心帮助的特定程序已经具有自定义控制台和完成程序,因此自定义帮助并不令人惊讶,并且可以作为自定义控制台代码的一部分来完成。 – 2009-11-24 11:59:54

2

我不是什么你的问题很清楚正是。我的理解是,你有一个类定义了一个类和一个函数,你想知道Python从哪里获取该函数的帮助文本。

Python从该类/方法提供的文档字符串中获取帮助文本。

如果该类中的“A”级和方法“F”,并有在函数“f”文档字符串,那么下面的终端转储应该帮助清除你的问题:

>>> class A: 
     def __init__(self): 
      self.c = 0 # some class variable 
     def f(self, x): 
      """this is the documentation/help text for the function "f" """ 
      return x+1 

>>> help(A.f) 
Help on method f in module __main__: 

f(self, x) unbound __main__.A method 
this is the documentation/help text for the function "f" 

>>> A.f.__doc__ 
'this is the documentation/help text for the function "f" ' 

希望这可以帮助