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
...