Python 无法获取接受参数的装饰程序

Python 无法获取接受参数的装饰程序,python,python-decorators,Python,Python Decorators,我正在尝试创建一个可以使用或不使用参数的装饰器。到目前为止,我有: def logged_in(func=None, *, permissions=None): if func is None: return partial(logged_in, permissions=None) @wraps(func) def wrapper(*args, **kwargs) -> Callable: nonlocal permissions

我正在尝试创建一个可以使用或不使用参数的装饰器。到目前为止,我有:

def logged_in(func=None, *, permissions=None):
    if func is None:
        return partial(logged_in, permissions=None)

    @wraps(func)
    def wrapper(*args, **kwargs) -> Callable:
        nonlocal permissions
        if not g.get('user'):
            response.unauthorized()
        if permissions:
            if type(permissions) == str:
                permissions = [permissions]
            if not g.user.admin and not bool(
                set(g.user.permissions) & set(permissions)
            ):
                response.forbidden()
        return func(*args, **kwargs)

    return wrapper
我称之为

@logged_in(permissions=['asdf'])
def my_method():

但是,如果权限:未设置权限,则我在
处不断收到一个错误。虽然我在许多地方看到过相同风格的代码,但我仍在使用。

权限在外部范围(
登录
)中定义,并在内部范围(
包装器
)中分配给。在Python中,我们必须声明这样的情况


函数
wrapper
包含赋值
permissions=…
,因此
permissions
被解释为局部变量;您需要在
包装器
的顶部写入
非本地权限
,或者在外部函数中进行重新分配,或者对其他变量进行重新分配。这样做正确吗?我发现的教程中没有一个是这样做的,所以我不知道我的代码是否错误,或者我是否应该使用不同的解决方案。
nonlocal
绝对是惯用的Python。“奇怪”的是,您可能正在重新分配到
权限
,而基础教程可能没有这样做。对不起,我不明白您在这里重新分配的意思。我把它当作情妇,但就这样?我在后面的函数中使用,您需要
permissions=[permissions]
,这就是为什么您需要
非本地
。如果你不给参数赋值,没有也没关系。啊,我明白你的意思了。但在此之前它失败了。事实上,我只是添加了非本地权限,即使我尝试
@logged\u登录(permissions=['asdf'])时,权限也始终是无的。
def wrapper(*args, **kwargs) -> Callable:
    nonlocal permissions
    ...