2009-11-24 5 views
10

Ich habe viele aufrufbare Objekte und sie alle haben die __doc__ Zeichenfolge richtig ausgefüllt, aber die Hilfe auf ihnen erzeugt die Hilfe für ihre Klasse anstelle der Hilfe basierend auf __doc__.Woher erhält Pythons pydoc-Hilfe ihren Inhalt?

Ich möchte es ändern, so dass das Ausführen von Hilfe für sie benutzerdefinierte Hilfe erzeugt, die im Wesentlichen aussieht, was ich erhalten würde, wenn sie tatsächliche Funktionen anstelle von Instanzen einer Klasse wären, die __call__ implementiert.

In Code, würde Ich mag die Ausgabe davon machen:

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

    def __call__(self): 
     # do some stuff 
     pass 

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

eher wie der Ausgang dieses:

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

help(myFunc) 
+2

Meine Vermutung ist, dass Das Problem hier ist, dass die klassenbasierte myFunc Typinstanz hat, während die andere Typ Funktion hat. Ich bin mir nicht sicher, ob es einen Weg gibt. (Probieren Sie den Drucktyp (myFunc) auf jedem zu sehen) – Suppressingfire

+0

Sie haben Recht über die Typen, wird diese Information in pydoc verwendet? –

Antwort

5

Die help-Funktion (im Modul pydoc implementiert) ist nicht bereit, pro-Instanz Docstrings zu finden. Ich schaute kurz durch das Modul, um zu sehen, ob es eine Möglichkeit gab, explizite Hilfe zu leisten, aber das scheint es nicht zu geben. Es verwendet das Modul inspect, um zu bestimmen, was es ist, und Ihre myFunc sieht nicht wie eine Funktion aus, sie sieht wie eine Instanz aus. Pydoc gibt stattdessen Hilfe über die Klasse der Instanz aus.

Es wäre nett, wenn Sie __doc__ ähnlich wären, könnten Sie ein __help__ Attribut hinzufügen, aber es gibt keine Unterstützung dafür.

zögere ich es vorschlagen, aber die beste Wahl könnte eine neue help Funktion zu definieren sein:

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

und dann legte ein __help__ Attribut auf Ihre Instanzen:

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

Ich hatte diesen Ansatz nicht berücksichtigt, das ist ein interessanter Vorschlag. Das spezielle Programm, das mich um die Hilfe kümmert, hat bereits eine benutzerdefinierte Konsole und einen Completer, so dass benutzerdefinierte Hilfe nicht so überraschend ist und als Teil des benutzerdefinierten Konsolencodes ausgeführt werden kann. –

2

ich über das, was Ihre Frage ist nicht ganz klar bin ist genau. Mein Verständnis ist, dass Sie eine Klasse und eine Funktion definiert haben und Sie wissen möchten, woher Python den Hilfetext für diese Funktion erhält.

Python ruft den Hilfetext aus den in dieser Klasse/Methode bereitgestellten Doc-Strings ab.

Wenn Sie eine Klasse "A" und ein Verfahren "f" in dieser Klasse haben und es gibt Docstrings in der Funktion "f", dann sollte die folgende Terminal-Dump helfen, Ihre Frage zu klären:

>>> 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" ' 

Hoffe, das hilft