gpt4 book ai didi

python - 装饰链

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:46 24 4
gpt4 key购买 nike

我正在基于 Django 的 @permission_required 构建一些装饰器装饰器。这些装饰器只是简单地调用带有不同参数的 permission_required 装饰器。

例如:

def permission_required_ajax(perm):
return permission_required(perm, raise_exception=True)

这很好用,我有几个这样的例子。

问题是当我的装饰器根本不接受任何参数时:

def special_permission():
return permission_required_ajax('special_permission')

这行不通。当我用 @special_permission 装饰器装饰函数时,出现以下错误:

TypeError: special_permission() takes 0 positional arguments but 1 was given

我错过了什么?

最佳答案

您仍然需要调用您的装饰器工厂:

@special_permission()
def function():
# ...

@ 符号后产生的任何表达式都用作装饰器;调用装饰器,传入装饰函数。

换句话说,装饰器是语法糖:

def function():
# ...
special_permission()(function)

如果您停止调用 (),该函数将改为传递给您的包装器。

或者,让您的装饰器接受该函数,并将其直接传递给 permission_required_ajax() 调用生成的装饰器:

def special_permission(func):
return permission_required_ajax('special_permission')(func)

然后在不调用的情况下使用它(它现在是装饰器,而不是装饰器工厂):

@special_permission  # no () call now
def function():
# ...

关于python - 装饰链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31699478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com