2011-02-10 8 views
2

im пытается получить доступ к моим аргументаторам декора внутри функции-обертки без везения.аргументы декоратора доступа внутри функции обертки декораторов

, что я имею:

def my_decorator(arg1=False, arg2=None): 

    def decorator(method): 
     @functools.wraps(method) 
     def wrapper(method, *args, **kwargs): 
      # do something based on arg1 and arg2 
      # accessing one of the two named arguments 
      # ends up in a 'referenced before assignment' 

      arg1 = arg1 # error 
      arg2 = arg2 # error 

      newarg1 = arg1 # working 
      newarg2 = arg2 # working 

      return method(*args, **kwargs) 
     return wrapper 
    return decorator 

и я хотел бы использовать его как обычный декоратор

@my_decorator(arg1=True, arg2='a sting or whatever else') 
the_function() 

я действительно не понимаю, почему я не могу получить доступ аргументов декораторов.

ответ

2

Вы можете получить доступ к arg1 и arg2, но вы не должны назначать эти имена, даже с «расширенными» операторами назначения, поскольку это сделает их локальными переменными во внутренней функции. Сообщение об ошибке, которое вы получаете, показывает, что вы пытались сделать именно это (хотя вы не показывали свой код).

В Python 3, вы можете обойти эту проблему с помощью

nonlocal arg1, arg2 

где-то в wrapper().

+0

спасибо за указание на это. – aschmid00

0

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

В Python 3 объявить nonlocal arg1, arg2. В Python 2 вам нужно обмануть: оберните два в списки (arg1 = [arg1] во внешней функции) и используйте arg1[0] во внутренней функции. Если вы хотите объяснить, почему это работает, либо ищите ответы на вопросы Python по этой теме, либо обратитесь к документации (где-то в языковой ссылке, я считаю, я буду искать).

Ваша проблема в том, что wrapper проходит self до method. Нет self. Вам придется это взять (и даже тогда вы ограничили бы декораторы методами - почему бы не позволить self проскользнуть в *args?).

Я не понимаю, как вы читаете «обращаться до присвоения» от «глобального имени self не определен» ...

+0

Я не переназначаю эти аргументы, и я использую python2x, но я не могу их получить. он говорит мне, что они не назначены. – aschmid00

+0

@ aschmid00: Вам нужно будет показать код. – delnan

+0

@delnan: есть еще один код для показа. arg1 или arg2 недоступны внутри функции обертки. Мне не нужно переназначать их, только знаю, являются ли они истинными или ложными или что значение для arg2 – aschmid00

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