У меня есть такой декоратор:
def dec(default):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
default = default or ['abc']
return func(*args, **kwargs)
return wrapper
return decorator
# use:
# decor = dec(default=['123'])
# @decor
# def something(default...
Так что я получаю эту ошибку, фактически мой линтер дает ее мне еще до того, как я запускаю код, но я получаю ее и во время тестирования:
local variable 'default' defined in enclosing scope on line x referenced before assignment
Что я делаю неправильно в этом декораторе, так что я не могу использовать внешние аргументы внутри оболочки?
Должен ли я явно передавать его оболочке до *args, **kwargs
? Как я должен это сделать, если я возвращаю саму функцию декоратора, не вызывая ее? return decorator
другие примеры, которые я могу найти, похоже, не имеют этой проблемы ( Как создать декоратор с дополнительными параметрами? )
это python 3 вещь? в основном это были python 2. может быть, в py3 мне нужно явно определить их как global default
?
потому что @wraps
не так ли? этот пример, который я нашел, кажется, работает нормально, но он не использует @wraps. хотя мне нужно его использовать.
def d(msg=None):
def decorator(func):
def newfn():
msg = msg or 'abc'
return func()
return newfn
return decorator
@d('This is working')
def hello():
print 'hello world !'
@d()
def hello2():
print 'also hello world'
что мне делать?