【发布时间】:2021-03-21 03:12:09
【问题描述】:
我正在尝试创建一个可以使用或不使用参数的装饰器。到目前为止我有这个:
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():
但是,我在if permissions: 处不断收到一个错误,即未设置权限。我正在使用a guide,尽管我在很多地方都看到过相同风格的代码。
【问题讨论】:
-
您的函数
wrapper包含一个赋值permissions = ...,因此permissions被解释为一个局部变量;要么你需要在wrapper的顶部写nonlocal permissions,要么在外部函数中重新赋值,要么重新赋值给不同的变量。