Самый простой способ обернуть функцию
func(*args, **kwargs)
... состоит в том, чтобы вручную написать оболочку, которая будет вызывать func () внутри себя:
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
В Python функция является объектом, поэтому вы можете передать ее имя в качестве аргумента другой функции и вернуть его. Вы также можете написать генератор-обертку для любой функции anyFunc () :
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Также обратите внимание, что в Python, когда вы не знаете или не хотите называть все аргументы функции, вы можете ссылаться на кортеж аргументов, который обозначается его именем, которому предшествует звездочка в скобках после имя функции:
*args
Например, вы можете определить функцию, которая будет принимать любое количество аргументов:
def testFunc(*args):
print args # prints the tuple of arguments
Python предусматривает еще больше манипуляций с аргументами функций. Вы можете разрешить функции принимать ключевые аргументы. Внутри тела функции ключевые аргументы хранятся в словаре. В скобках после имени функции этот словарь обозначается двумя звездочками, за которыми следует название словаря:
**kwargs
Аналогичный пример, который печатает словарь аргументов ключевого слова:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments