Это первый пример, который мы встречаем, когда сталкиваемся с декораторами. Но я не могу понять, что именно я хотел бы.
Простой декоратор с именем LOG. Он должен работать следующим образом:
@LOG
def f(a, b=2, *c, **d):
pass
И результат должен выглядеть примерно так:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Где каждый аргумент, переданный как параметр функции, отображается с его значением.
Я обнаружил, что проблема сложнее, чем я думал, в основном из-за множества различных способов передачи аргументов функции (подумайте о кортежах с помощью * c или словарей с ** d).
Я попробовал решение, но я не уверен, что это правильно. Это примерно так:
def LOG(fn):
import inspect
varList, _, _, default = inspect.getargspec(fn)
d = {}
if default is not None:
d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
def f(*argt, **argd):
print ('Enter %s' % fn).center(100, '=')
d.update(dict((varList[i], v) for i, v in enumerate(argt)))
d.update(argd)
for c in d.iteritems():
print '%s = %s' % c
ret = fn(*argt, **argd)
print 'return: %s' % ret
print ('Exit %s' % fn).center(100, '=')
return ret
return f
Мне кажется, это не так просто, как я ожидал, но странно, что я не нашел то, что хотел в Google.
Можете ли вы сказать мне, если мое решение в порядке? Или вы можете предложить лучшее решение проблемы, которую я предложил?
Спасибо всем.