2009-11-24 23 views
10

Ho molti oggetti chiamabili e tutti hanno la stringa __doc__ correttamente compilata, ma la guida in esecuzione su di essi produce l'aiuto per la loro classe invece della guida basata su __doc__.Da dove viene la funzione di aiuto pydoc di Python a ottenere il suo contenuto?

Voglio cambiarlo in modo che l'aiuto in esecuzione su di essi produca un aiuto personalizzato che assomigli in sostanza a ciò che otterrei se fossero funzioni effettive anziché istanze di una classe che implementa __call__.

In codice, mi piacerebbe fare l'output di questo:

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

    def __call__(self): 
     # do some stuff 
     pass 

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

guardare più come l'uscita di questo:

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

help(myFunc) 
+2

La mia ipotesi è che il problema qui è che il myFunc basato sulla classe ha istanza di tipo, mentre l'altra ha la funzione type. Non sono sicuro se c'è un modo per aggirare questo. (prova il tipo di stampa (myFunc) su ciascuno per vedere) – Suppressingfire

+0

hai ragione sui tipi, è quella informazione usata all'interno di pydoc? –

risposta

5

La funzione help (implementata nel modulo pydoc) non è pronta per trovare le didascalie per istanza. Ho dato una rapida occhiata al modulo per vedere se c'era un modo per fornire un aiuto esplicito, ma non sembra esserci. Usa il modulo inspect per determinare che tipo di cosa è, e il mio myFunc non sembra una funzione, sembra un'istanza. Quindi le stampe pydoc aiutano invece la classe dell'istanza.

Sarebbe bello se simile a __doc__ è possibile aggiungere un attributo __help__, ma non è supportato.

ho esitato a suggerire, ma la soluzione migliore potrebbe essere quella di definire una nuova help funzione:

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

e poi mettere un attributo __help__ sulle istanze:

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

Non avevo considerato questo approccio, questo è un suggerimento interessante. Il particolare programma in cui tengo all'aiuto ha già una console e un completatore personalizzati, quindi l'aiuto personalizzato non è così sorprendente e può essere fatto come parte del codice della console personalizzata. –

2

io non sono molto chiari su ciò che la tua domanda è esattamente La mia comprensione è che hai una classe e una funzione definite in essa e vuoi sapere da dove Python ottiene il testo di aiuto per quella funzione.

Python ottiene il testo della guida dalle stringhe doc fornite in tale classe/metodo.

Se si dispone di una classe "A" e un metodo "f" in quella classe e ci sono docstring nella funzione "f", quindi il seguente dump terminale dovrebbe aiutare a chiarire la tua domanda:

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

Spero che questo aiuti