аргументы в декораторе недоступны в области декоратора? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть такой декоратор:

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'

что мне делать?

...