我可以在不更改访问语法的情况下用 lambda 替换属性吗?

Can I replace an attribute with a lambda WITHOUT changing access syntax?

我有一个布尔值在我刚刚加入的系统中使用(它是 Django 的 settings.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 或函数,使消费者无需函数调用语义即可访问该对象?

您可以修改设置 class 并将 DEBUG 设置为描述符:

def DEBUG(self):
    return return_bool_or_throw_exception_if_caller_forbidden()

settings.__class__.DEBUG = property(DEBUG)