2015-09-04 2 views
1

Я изменяю следующий класс декоратора. Можно ли получить аргументы для func, а также получить доступ к этой функции?Создайте декоратор, который имеет доступ к аргументам и функции

def arg(*args, **kwargs): 
    def _decorator(func): 
     # check for funcs args 

     func.do_something(args, kwargs) 
     return func 
    return _decorator 

Как кажется, все, что я пробовал, означает, что вы получаете доступ только к тому или иному.

+0

Можете ли вы уточнить, что вы хотите сделать с аргументами? –

+0

@AnandSKumar Я просто хочу получить одно из значений одного из кваргов функции и сравнить его со значением, переданным в декоратор. – nazerb

+0

, чтобы вы передали аргумент ключевого слова декоратору во время определения функции и хотите проверить значение, переданное этому же аргументу ключевого слова, когда функция вызывается во время выполнения правильно? –

ответ

3

Я не уверен, что вы имеете в виду, обратившись к аргументам и функции. Я предполагаю, что вы имеете в виду аргументы, переданные функции.

Для вашего использования, для декораторов, которые принимают аргументы, вам нужна другая функция-обертка, которая проведет тестирование kwargs против kwargs, переданных функции во время выполнения.

Пример -

>>> def arg(*args, **kwargs): 
...  def _decorator(func): 
...   def _wrapper(*args1, **kwargs1): 
...    # check for funcs args 
...    for k,v in kwargs.items(): 
...     print("For key - ",k,v == kwargs1.get(k)) 
...    func(*args1, **kwargs1) 
...   return _wrapper 
...  return _decorator 
... 
>>> 
>>> @arg(l = 1) 
... def b(l): 
...  print("In B", l) 
... 
>>> b(l=1) 
For key - l True 
In B 1 
>>> b(l=2) 
For key - l False 
In B 2 

EDIT: Это для декораторов без аргументов.

Внешняя функция принимает функцию как аргумент, а внутренняя функция принимает аргументы функции.

Очень простой пример -

>>> def a(func): 
...  def x(*args, **kwargs): 
...    print(args, kwargs) 
...    func(*args, **kwargs) 
...  return x 
... 
>>> @a 
... def b(y): 
...  print("In b", y) 
... 
>>> b("Hello") 
('Hello',) {} 
In b Hello 

+0

В вашем примере, если @a имеет аргументы, такие как @a ('hello2'), как вы могли бы получить доступ к «привет» и «привет2»? – nazerb

+0

Я обновил ответ для декораторов с аргументами. –

+0

А теперь я вижу второй бит, именно то, что я искал. Благодарю. – nazerb

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