2014-09-19 4 views
-2

Я использую Python, чтобы написать функцию декоратора, который записывает аргументы и возвращает значение функции, когда она называетсяСоздать функцию декоратора, который регистрирует аргументы

def logfunc(prefix) 

Выход должен быть sys.stderr в формат:

"{prefix}: {function name}({positional args}..., {keyword=args}, ...)" 

и

"{prefix}: {function name} -> {return value}" 

соответственно для вызова и возврата.

Это, как он используется:

@logfunc("test") 
def f(arg) 
    return arg 

Я не тихо понимаю? Может ли кто-нибудь показать мне указатель?

+2

Теперь покажите нам код, который вы имеете до сих пор. – 2014-09-19 14:53:29

+0

Поскольку вы запрашиваете указатель, я нашел [эту статью] (http://www.artima.com/weblogs/viewpost.jsp?thread=240808) очень полезной. –

+0

Вздох, кто-то сегодня не думает ясно. – chepner

ответ

0
import logging 

logger = logging.getLogger(__name__) 

def logging_decorator(fn): 
    def func(*a, **kw): 
     logger.info('%s(%s, %s)', fn, a, kw) 
     return fn(*a, **kw) 
    return func 

если вы хотите печатать stderr вместо этого вы можете использовать import sys, а затем sys.stderr.write('%s(%s, %s)' % (fn, a, kw))

1

Я нашел этот вопрос, чтобы быть интересным, даже если он плохо спросил :-(

легкая часть , если в документах Python есть примеры декораторов без аргументов, но мне потребовалось некоторое время, чтобы понять, что декоратор, принимающий аргументы, фактически является функцией, принимающей аргументы и возвращающей декоратора. Как только этот момент ясен, ответ почти очевидный :

def logger(prefix): 
    def decorate(f): 
     def wrapper(*args, **kwargs): 
      print(prefix, f.__name__, "args", args, "kwargs", kwargs) 
      cr = f(*args, **kwargs) 
      print(prefix, f.__name__, "result", cr) 
      return cr 
     return wrapper 
    return decorate 

Использование:

>>> @logger("test") 
def zut(a, b, foo='FOO'): 
    return a+b 

>>> zut(2,3) 
test zut args (2, 3) kwargs {} 
test zut cr 5 
5 
>>> zut(2,3, foo = 'FEE') 
test zut args (2, 3) kwargs {'foo': 'FEE'} 
test zut cr 5 
5 
Смежные вопросы