2009-11-24 45 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" ' 

希望這可以幫助