【问题标题】:Log decorator for methods方法的日志装饰器
【发布时间】:2015-12-01 00:32:18
【问题描述】:

我正在尝试创建一个装饰器,它记录方法启动的时间、方法的名称和该方法的参数。

这个装饰器在某些情况下工作,但我想让它在尽可能多的情况下工作。所以我想让它既可以作为普通方法,也可以作为类方法。

def log(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
            log(func.__name__ + '; ARGS: {}'.format(','.join(str(args))))
            return func(*args, **kwargs)

    return wrapper

有一些问题:

  1. 它不适用于类方法。为了让它在课堂上工作,我必须将self 作为第一个参数放在def wrapper(*args, **kwargs): 和这里return func(*args, **kwargs)

  2. 我想让它适用于所有类型的参数(列表、字符串、整数、字典等)。这仅适用于字符串和整数(分别适用于浮点数等)

  3. 奇怪的是,例如,如果我在一个将两个整数作为参数的方法上使用它,它会将其打印到日志中:name_of_function; ARGS: (,5,,, ,6,)

如果您能帮我解决这些问题,我将不胜感激。

【问题讨论】:

    标签: python string types int decorator


    【解决方案1】:

    这有帮助吗?

    def func_detail(func):
        def func_wrapper(*args,**kwargs):
            print(func.__name__)
            print(*args)
            print(kwargs)
            return func(*args,**kwargs)
        return func_wrapper
    
    @func_detail
    def foo(a,b,c,**kwargs):
        return 1
    
    class Person(object):
        @func_detail
        def __init__(self,name,age,**kwargs):
            self.name = name
            self.age = age
            self.email = kwargs.get('email',None)
    
    me = Person('taesu',24,email='me@me.com')
    
    print(foo(1,1.1,'4',test='me'))
    

    【讨论】:

    • 是的,这很有帮助。谢谢!
    • 以上适用于 py3。您可能需要为py2 稍微调整一下
    猜你喜欢
    • 2020-01-11
    • 2011-10-30
    • 2011-10-23
    • 2014-01-14
    • 1970-01-01
    • 2021-04-27
    • 2019-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多