Python 装饰记录器
Python decorator logger
我有以下代码:
def log(func):
def wrapper(*args, **kwargs):
func_str = func.__name__
args_str = ', '.join(args)
kwargs_str = ', '.join([':'.join([str(j) for j in i]) for i in kwargs.iteritems()])
with open('log.txt', 'w') as f:
f.write(func_str)
f.write(args_str)
f.write(kwargs_str)
return func(*args, **kwargs)
return wrapper()
@log
def example(a, b):
print('example')
然而,即使没有调用任何函数,我仍然得到错误:
TypeError: example() takes exactly 2 arguments (0 given)
谁能解释一下为什么会这样,因为好像调用了函数,但我不明白为什么。
因为你在这里调用它:
return wrapper()
应该是:
return wrapper
您应该 return wrapper
函数而不调用它:
return wrapper
调用它意味着必须评估对 wrapper
的调用,但是您正在使用错误的签名进行调用。
我有以下代码:
def log(func):
def wrapper(*args, **kwargs):
func_str = func.__name__
args_str = ', '.join(args)
kwargs_str = ', '.join([':'.join([str(j) for j in i]) for i in kwargs.iteritems()])
with open('log.txt', 'w') as f:
f.write(func_str)
f.write(args_str)
f.write(kwargs_str)
return func(*args, **kwargs)
return wrapper()
@log
def example(a, b):
print('example')
然而,即使没有调用任何函数,我仍然得到错误:
TypeError: example() takes exactly 2 arguments (0 given)
谁能解释一下为什么会这样,因为好像调用了函数,但我不明白为什么。
因为你在这里调用它:
return wrapper()
应该是:
return wrapper
您应该 return wrapper
函数而不调用它:
return wrapper
调用它意味着必须评估对 wrapper
的调用,但是您正在使用错误的签名进行调用。