使受影响函数的装饰器返回false?

时间:2013-11-20 23:15:06

标签: python django decorator

我有一个Django函数read_detail,它根据是否允许用户读取页面返回True或False。该函数在具有不同逻辑的几个不同类中重复,但是我认为有一个逻辑将始终相同,如果用户是超级用户则返回True。我想这样设置:

@is_superuser
def read_detail()

如果用户是超级用户,@is_superuser将强制read_detail()返回True,并且不会进行进一步的评估。然后我可以避免跨类重复这一点逻辑。这可能吗?

2 个答案:

答案 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_iftrue_unless等。对我来说非常有用。