A maneira mais simples de quebrar uma função
func(*args, **kwargs)
... é escrever manualmente um wrapper que chamaria func () dentro de si:
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
No Python, a função é um objeto, para que você possa passar o nome como argumento de outra função e retorná-lo. Você também pode escrever um gerador de wrapper para qualquer função anyFunc () :
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Observe também que no Python, quando você não sabe ou não deseja nomear todos os argumentos de uma função, pode se referir a uma tupla de argumentos, que é indicada por seu nome, precedida por um asterisco entre parênteses após o nome da função:
*args
Por exemplo, você pode definir uma função que aceite qualquer número de argumentos:
def testFunc(*args):
print args # prints the tuple of arguments
O Python fornece ainda mais manipulação nos argumentos das funções. Você pode permitir que uma função aceite argumentos de palavras-chave. Dentro do corpo da função, os argumentos da palavra-chave são mantidos em um dicionário. Entre parênteses após o nome da função, este dicionário é indicado por dois asteriscos seguidos pelo nome do dicionário:
**kwargs
Um exemplo semelhante que imprime o dicionário de argumentos de palavras-chave:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments