Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 方法的日志装饰器_Python_String_Types_Int_Decorator - Fatal编程技术网

Python 方法的日志装饰器

Python 方法的日志装饰器,python,string,types,int,decorator,Python,String,Types,Int,Decorator,我正在尝试创建一个decorator,它记录方法启动的时间、方法的名称和该方法的参数 这个装饰器在某些情况下工作,但我想让它在尽可能多的情况下工作。所以我想让它既作为普通方法也作为类方法工作 def log(func): @wraps(func) def wrapper(*args, **kwargs): log(func.__name__ + '; ARGS: {}'.format(','.join(str(args)))) re

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

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

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

    return wrapper
存在一些问题:

  • 它不适用于类方法。要使其在类中工作,我必须在这里将
    self
    作为第一个参数
    def wrapper(*args,**kwargs):
    和这里
    return func(*args,**kwargs)

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

  • 奇怪的是,如果我在一个以两个整数作为参数的方法上使用它,它会将它打印到日志:
    name\u of_function;参数:(,5,,,6,)

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

    这有帮助吗

    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上工作。您可能需要对其进行一些调整