2015-09-04 5 views
0

Я пытаюсь создать декоратор, который регистрирует время при запуске метода, имя метода и аргументы этого метода.Log decorator for methods

Этот декоратор работает в некоторых ситуациях, но я хочу, чтобы он работал как можно больше ситуаций. Поэтому я хочу заставить его работать как обычный метод, так и метод класса.

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. Я хочу, чтобы он работал для всех типов аргументов (списки, строки, ints, dicts и т. Д.). Это работает только для строк и целых чисел (соответственно для поплавков и т.д.)

  3. Странная вещь, что если я использую его, например, по методу, который принимает два целых числа в качестве аргументов, он выводит его в журнале: name_of_function; ARGS: (,5,,, ,6,)

Я был бы признателен, если вы поможете мне решить любую из этих проблем.

ответ

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='[email protected]') 

print(foo(1,1.1,'4',test='me')) 
+0

Да, это очень помогло. Спасибо! –

+0

выше работает на py3. вам может потребоваться немного настроить его для [py2] (https://repl.it/BFjR) <- как это – taesu