Ho un problema nell'utilizzo delle docstring con i decoratori. Dato il seguente esempio:Decoratore in pitone per il controllo delle docce
def decorator(f):
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Ora l'aiuto non mi mostrare la docstring di foo
come previsto, si vede:
Help on function _decorator in module __main__:
_decorator()
Senza il decoratore, l'aiuto è corretto:
Help on function foo in module __main__:
foo()
the magic foo function
Lo so, che la funzione foo
è avvolta dal decoratore e quindi l'oggetto funzione non è più la funzione foo
. Ma qual è una buona soluzione per ottenere docstring (e l'aiuto) come previsto?
Questo non funziona se 'foo' prende degli argomenti - vengono sostituiti da qualsiasi cosa usi' _decorator'. Questo è un problema specialmente quando vuoi che il tuo decoratore prenda '* args, ** kwds'. Non sono mai stato in grado di trovare un modo per ottenere correttamente la docstring usando 'functools.wraps'. –
@Scott Griffiths: la docstring sarà ancora corretta anche se 'foo' accetta argomenti. Tuttavia, 'help (foo)' visualizzerà la lista dei parametri di '_decorator', dato che in realtà sostituisce la funzione' foo'. Non c'è alcun modo per aggirare questo se stai scrivendo decoratori che accettano argomenti arbitrari usando '* args, ** kwargs', ma per me il punto importante è che la docstring sia mantenuta intatta. I dettagli dei parametri possono sempre essere specificati nella docstring per maggiore chiarezza. –
Grazie per le informazioni extra. Recentemente non sono riuscito a ottenere la descrizione della guida corretta per le funzioni decorate: mi sembra un pessimo stato di cose, ma capisco la difficoltà in quanto la funzione decorata potrebbe avere una firma completamente diversa. Tuttavia, ci deve essere un modo ... :) –