我有一个Django函数read_detail
,它根据是否允许用户读取页面返回True或False。该函数在具有不同逻辑的几个不同类中重复,但是我认为有一个逻辑将始终相同,如果用户是超级用户则返回True。我想这样设置:
@is_superuser
def read_detail()
如果用户是超级用户,@is_superuser
将强制read_detail()
返回True,并且不会进行进一步的评估。然后我可以避免跨类重复这一点逻辑。这可能吗?
答案 0 :(得分:0)
class is_superuser(object):
def __init__(self, fn):
self.fn = fn
self.is_super = False
def __call__(self, *args, **kwargs):
if self.is_super: return True
return self.fn(*args, **kwargs)
>>> @is_superuser
... def blah():
... return "baz"
...
>>> blah()
'baz'
>>> blah.is_super = True
>>> blah()
True
答案 1 :(得分:0)
我会沿着
的路线将谓词逻辑与装饰器分离def true_if(predicate):
return lambda fun: lambda *a, **k: predicate() or fun(*a, **k)
然后
def is_superuser():
return ...your logic....
@true_if(is_superuser)
def read_detail():
同样,您可以定义false_if
,true_unless
等。对我来说非常有用。