2015-07-30 3 views
1

Я пытаюсь найти способ передать мои аргументы по умолчанию для декоратора. Я должен сказать, что я довольно новичок в сфере декораторов, поэтому, может быть, я просто не понимаю его должным образом, но пока не нашел ответов.Передача аргументов по умолчанию декоратору в python

Итак, здесь мой модифицированный пример с страницы руководства python functools.wraps.

from functools import wraps 
def my_decorator(f): 
    @wraps(f) 
    def wrapper(*args, **kwds): 
      print 'Calling decorated function' 
      print 'args:', args 
      print 'kwargs:', kwds 
      return f(*args, **kwds) 
    return wrapper 

@my_decorator 
def example(i, j=0): 
    """Docstring""" 
    print 'Called example function' 

example(i=1) 

Я хочу j=0 быть принят, тоже. Так что вывод должен быть:

Calling decorated function 
args:() 
kwargs: {'i': 1, 'j': 0} 
Called example function 
+1

'J = 0 '* это * прошло, но ** не внутри' wrapper' **. Если вы напечатаете i, j' внутри 'example', вы увидите, что он есть. Вы можете использовать, например. 'inspect.getargspec (f)', чтобы узнать, какие значения по умолчанию установлены для функции, которая будет оформлена, но почему вам нужно получить доступ к умолчанию в 'wrapper'? – jonrsharpe

+0

Я знаю, что его передали в 'example', но мне нужно' j' передать в 'wrapper', потому что это необходимо для вычислений, которые я выполняю со многими несколькими функциями. Но, как правило, использование 'inspect.getargspec (f)' будет работать, спасибо. –

ответ

1

Вы можете получить аргументы доступа *args для позиционных аргументов и **kwds для позиционных аргументов. Чтобы получить j внутри обертки вы можете сделать следующее

def my_decorator(f): 
@wraps(f) 
def wrapper(*args, **kwds): 
    j = kwargs.get('j') 
    return f(*args, **kwds) 
return wrapper 
+0

Но это не работает! –

Смежные вопросы