我可以在不更改访问语法的情况下用 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)
我有一个布尔值在我刚刚加入的系统中使用(它是 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)