Domanda

ho un sacco di oggetti callable e tutti hanno la stringa __doc__ correttamente compilato, ma in esecuzione di aiuto su di essi produce l'aiuto per la loro classe, invece di aiuto in base a __doc__.

Voglio cambiare in modo che in esecuzione di aiuto su di essi produce aiuto personalizzato che assomiglia essenzialmente quello che vorrei avere se fossero funzioni reali invece di istanze di una classe che implementa __call__.

Nel 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)

Guarda più come l'uscita di questo:

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

help(myFunc)
È stato utile?

Soluzione

La funzione help (implementato nel modulo pydoc) non è disposta a trovare docstrings per-esempio. Ho preso un rapido sguardo attraverso il modulo per vedere se ci fosse un modo per fornire un aiuto esplicito, ma ci non sembra essere. Utilizza il modulo di inspect per determinare quale tipo di cosa si tratta, e la vostra myFunc non sembra una funzione, sembra un caso. Così stampe pydoc aiutano sulla classe dell'istanza, invece.

Sarebbe bello se simile a __doc__ si potrebbe aggiungere un attributo __help__, ma non c'è alcun supporto per questo.

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

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

e poi mettere un attributo __help__ sui vostri casi:

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

Altri suggerimenti

Non sono molto chiari su ciò che la vostra domanda è esattamente. La mia comprensione è che avete una classe e una funzione definita in esso e si vuole sapere dove Python ottiene il testo della guida per quella funzione da.

Python ottiene il testo di aiuto dalle corde doc previste in quella 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top