我可以用lambda替换属性而不改变访问语法吗?

时间:2015-02-12 20:41:32

标签: python testing lambda

我有一个布尔在我刚刚加入的系统中使用(它是Django的设置.DEBUG,但这并不重要,因为这将是方便进行测试。)

我想阻止非django使用此属性。使用我的系统的开发人员应该获得异常,告诉他们使用不同的属性:

settings.DEBUG = lambda: return_bool_or_throw_exception_if_caller_forbidden()

麻烦的是,切换到lambda需要访问者改变:

#instead of:
if settings.DEBUG:
#now:
if settings.DEBUG():

但这需要在Django代码中更改DEBUG的所有读取,这在我的情况下是不可接受的。我可以提供一个没有参数的lambda或函数,以便消费者可以在没有函数调用语义的情况下访问它吗?

1 个答案:

答案 0 :(得分:2)

您可以修补设置类并将DEBUG设置为描述符:

def DEBUG(self):
    return return_bool_or_throw_exception_if_caller_forbidden()

settings.__class__.DEBUG = property(DEBUG)