gpt4 book ai didi

django - 与装饰器和正常功能相同的条件?

转载 作者:行者123 更新时间:2023-12-01 02:35:55 24 4
gpt4 key购买 nike

我想根据正则表达式模式检查某个参数值,并且只有在它们匹配时才继续。这发生在我的应用程序中的许多地方,所以我决定让一个函数进行检查并在需要时调用该函数。现在,在大多数情况下,我需要在 View 开始时执行该检查,因此我将其创建为装饰器,如下所示:

def validate(f):
def _inner(request, argument=None):
if argument is None:
return HttpResponse(content="No argument given", status=400)
elif not re.match('^SOME_REGEX$', argument):
return HttpResponse(content="Invalid argument", status=400)
else:
return f(request, argument)
return _inner

但在其他情况下,我需要从 调用该检查器。内一个函数,作为嵌套条件的一部分。看来我不能直接调用它,例如 validate(argument) .有什么方法可以使用与装饰器和普通函数相同的代码?还是我必须输入两次?

最佳答案

你当然不必输入两次,你可以创建一个 validate接受一个值并验证它的函数:

def validate(argument):
return re.match('^SOME_REGEX$', argument)

然后编写一个调用 validate 的装饰器根据需要发挥作用:
def requires_valid(f):
def _inner(request, argument=None):
if argument is None:
return HttpResponse(content="No argument given", status=400)
elif not validate(argument):
return HttpResponse(content="Invalid argument", status=400)
else:
return f(request, argument)
return _inner

显然,我不知道您的用例,因此您可能希望移动 None 的检查。进入 validate但关键是,您不必重复相同的正则表达式两次。

如果你想深入研究更深层次的魔法并坚持使用相同的函数作为装饰器和验证器,你可以尝试这样的事情:
def validate(f):
if callable(f):
def _inner(request, argument=None):
if argument is None:
return HttpResponse(content="No argument given", status=400)
elif not validate(argument):
return HttpResponse(content="Invalid argument", status=400)
else:
return f(request, argument)
return _inner
else:
return re.match('^SOME_REGEX$', f)

但是我建议不要这样做,因为您有一个函数可以执行两种截然不同的操作,具体取决于参数的类型。这导致代码更难理解。 (“你用这个接受字符串并返回 bool 的函数装饰了一个 View ?!”)

关于django - 与装饰器和正常功能相同的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289078/

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