Molto strettamente correlato a: How can I programmatically change the argspec of a function in a python decorator?Come posso modificare a livello di codice l'argomento di una funzione * not * in un decoratore python?
Il modulo decoratore fornisce i mezzi per eseguire una funzione di decorazione che conserva l'argspec della funzione decorata.
Se si definisce una funzione che non viene utilizzata come decoratore, esiste un modo per copiare l'argomento di un'altra funzione?
Esempio caso d'uso:
class Blah(object):
def foo(self, *args, **kwargs):
""" a docstr """
result = bar(*args, **kwargs)
result = result**2 # just so it's clear we're doing something extra here...
return result
def bar(x, y, z=1, q=2):
""" a more useful docstr, saying what x,y,z,q do """
return x+y*z+q
vorrei avere foo
's argspec assomigliare bar
' s, ma la fonte di rimanere invariato (vale a dire, inspect.getsource(foo)
sarebbe ancora mostrare la result
spazzatura). Lo scopo principale di questo è quello di ottenere i documenti sfinge e la guida interattiva di ipython per mostrare gli argomenti appropriati.
Come le risposte all'altra domanda, il decorator package mostra un modo per farlo, ma mi sono perso all'interno della carne di quel codice. Sembra che il pacchetto decorator
stia ricompilando il codice sorgente, o qualcosa del genere. Avevo sperato in un approccio più semplice, ad es. qualcosa come foo.argspec = bar.argspec
, sarebbe possibile.
Sì che qualche fonte peloso codice in quella funzione decoratore. Hai ragione, sta ricostruendo la funzione - suggerirei di provare a riutilizzare il metodo di classe FunctionMaker.create e vedere come vai. – Hamish
Pensandoci però, sembra che ci vorrà più lavoro, piuttosto che migliorare la firma originale o aggiungere un docblock appropriato. – Hamish
'pippo' è in realtà un metodo, quindi il primo argomento sarà _always_ essere l'oggetto istanziato, a meno che non si desideri che' foo' sia un 'staticmethod'. Altrimenti, sarebbe fuorviante controllare l'aiuto su 'Blah.foo' e non vedere' self' come primo argomento nella firma. Per non dire che non è fattibile, solo che potrebbe essere necessario ricordare di anteporre la firma 'bar' a' self'. –