Это зависит от того, что вы делаете с arg1
и arg2
. Как правило, крышки работают отлично без дополнительной работы. Однако, если вы переназначаете их во внутренней функции, Python предполагает, что это локальная переменная, и вы должны указать это иначе.
В Python 3 объявите nonlocal arg1, arg2
. В Python 2 вы должны обмануть: оберните их в списки (arg1 = [arg1]
во внешней функции) и используйте arg1[0]
во внутренней функции. Если вы хотите объяснить, почему это работает, либо найдите вопросы по Python по этой теме, либо обратитесь к документации (где-то в справочнике по языку, я думаю, я буду искать).
Ваша проблема в том, что wrapper
передает self
на method
. Там нет self
. Вам придется принять это (и даже тогда вы ограничите декоратор методами - почему бы не позволить self
проскользнуть в *args
?).
Я не вижу, как вы читаете "ссылка перед присваиванием" из "глобального имени self
не определено" ...