Python装饰器记录器

时间:2016-10-12 09:32:09

标签: python decorator

我有以下代码:

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)

有人可以向我解释为什么会发生这种情况,因为似乎这个功能被调用了,但我不明白为什么。

2 个答案:

答案 0 :(得分:5)

您应该在不调用它的情况下返回wrapper函数:

return wrapper

调用它意味着必须对wrapper的调用进行评估,然而您使用错误的签名进行调用。

答案 1 :(得分:4)

因为你在这里打电话:

Calendar calendar = Calendar.getInstance();
calendar.setTime(MainActivity.today.getTime();

应该是:

return wrapper()