这是我们面对装饰时遇到的第一个例子.但是我无法意识到我到底想要什么.
一个名为LOG的简单装饰器.它应该像这样工作:
@LOG
def f(a, b=2, *c, **d):
pass
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Run Code Online (Sandbox Code Playgroud)
将作为参数传递给函数的每个参数显示为其值.
我发现问题比我想象的更难,主要是因为你可以通过许多不同的方式将参数传递给函数(想想带有*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) …Run Code Online (Sandbox Code Playgroud)