Il modo più semplice per avvolgere una funzione
func(*args, **kwargs)
... è scrivere manualmente un wrapper che chiamerebbe func () al suo interno:
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
In Python la funzione è un oggetto, quindi puoi passare il suo nome come argomento di un'altra funzione e restituirlo. Puoi anche scrivere un generatore di wrapper per qualsiasi funzione anyFunc () :
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Si noti inoltre che in Python quando non si conoscono o non si desidera nominare tutti gli argomenti di una funzione, è possibile fare riferimento a una tupla di argomenti, che è indicata dal suo nome, preceduta da un asterisco tra parentesi dopo il nome della funzione:
*args
Ad esempio, puoi definire una funzione che accetta qualsiasi numero di argomenti:
def testFunc(*args):
print args # prints the tuple of arguments
Python prevede un'ulteriore manipolazione degli argomenti delle funzioni. È possibile consentire a una funzione di accettare argomenti per parole chiave. All'interno del corpo della funzione gli argomenti delle parole chiave sono contenuti in un dizionario. Tra parentesi dopo il nome della funzione questo dizionario è indicato da due asterischi seguiti dal nome del dizionario:
**kwargs
Un esempio simile che stampa il dizionario degli argomenti delle parole chiave:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments