Ho una funzione (foo
) che è una funzione di funzione comfort per un'altra funzione (bar
). foo
chiama bar
, quindi esegue un altro paio di attività sull'output. Per esempio:Mantenimento delle firme delle chiamate di funzioni coerenti per una funzione che accetta un superset degli argomenti di un'altra funzione
def bar(bar_arg, bar_kw=None):
#do some stuff
return ret
def foo(bar_arg, foo_arg, bar_kw=None, foo_kw=None):
ret = bar(bar_arg, bar_kw)
ret.some_method(foo_arg, foo_kw=foo_kw)
Vorrei la firma richiesta di foo
per contenere le parole chiave e gli argomenti da bar
in modo che un utente che controlla foo
sa quello che può passare, però, vorrei evitare di mantenere l'elenco completo delle argomenti dal bar
tende a cambiare quando il pacchetto da cui proviene viene aggiornato e il suo elenco di argomenti è lungo. Dal foo
chiama sempre bar
con l'elenco completo di argomenti e parole chiave che bar
accetta, non vedo che avrei bisogno di mantenere la lista da solo.
C'è un modo per creare la firma della chiamata per foo
in base alla firma della chiamata per bar
? Inoltre, esiste un modo per acquisire gli input su foo
in un dizionario o uno spazio dei nomi in modo da poter separare facilmente gli argomenti e le parole chiave utilizzati da foo
da quelli utilizzati da bar
?
Nota, so di * args e ** kwargs. Tuttavia, lasciano ambigua la firma della funzione e non informano l'utente di quali argomenti e argomenti della parola chiave sono consentiti.
Modifica: Devo notare che il mio caso d'uso è significativamente più complesso di questo esempio. La funzione esterna chiamata (bar
) è matplotlib.colorbar.ColorbarBase
. La funzione di chiamata (foo
) è un metodo di classe per una classe di stampa che viene utilizzata in numerose applicazioni personali che altri useranno in futuro. foo
crea una barra colori, quindi esegue lavori aggiuntivi sulla barra dei colori in base a argomenti e parole chiave aggiuntivi non accettati da ColorbarBase
.
È possibile * probabilmente * avere un decoratore (che ottiene il riferimento 'bar' come argomento) farlo per voi. – SuperSaiyan
Penso che tu intenda "ret.some_method', e anche" return ret ". –
@Alex Grazie, modificato. – Vorticity