为什么django的设置对象是LazyObject?

时间:2012-06-28 05:27:21

标签: python django lazy-evaluation django-settings

在django.conf中查看我注意到设置是这样实现的:

class LazySettings(LazyObject):     
...

使设置对象变得懒惰的理由是什么?

3 个答案:

答案 0 :(得分:8)

查看Django编码风格的this section。原因在那里解释(引用如下)。

除了性能之外,第三方模块还可以在导入时修改设置。应延迟访问设置以确保首先进行此配置。

  

模块一般不应使用存储的设置   顶层的django.conf.settings(即在模块时评估)   是进口的)。对此的解释如下:

     

手动配置设置(即不依赖于   允许并且可能使用DJANGO_SETTINGS_MODULE环境变量   如下:

from django.conf import settings
     

settings.configure({},SOME_SETTING ='foo')但是,如果有任何设置   在settings.configure行之前访问,这将无法正常工作。   (在内部,设置是一个配置自身的LazyObject   如果尚未访问设置,则自动进行访问   已配置)。

     

因此,如果有一个模块包含如下代码:

from django.conf import settings
from django.core.urlresolvers import get_callable

default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW)
     

...然后导入   此模块将导致配置设置对象。那   表示第三方导入模块的能力   顶级与配置设置的能力不兼容   手动对象,或在某些情况下使其变得非常困难。

     

而不是上面的代码,必须有一定程度的懒惰或间接   使用,例如django.utils.functional.LazyObject,   django.utils.functional.lazy()lambda

答案 1 :(得分:3)

它是一个代理对象,它抽象实际的设置文件,并使其重量轻,直到您实际访问所需的设置。一旦开始访问属性,它就会按需加载。我们的想法是减少加载设置的开销,直到您需要它们为止。

答案 2 :(得分:0)

我认为目的是从开发人员的角度简化设置。因此,每个项目都可以拥有自己的settings.py文件,而无需定义所有其他Django设置。 LazySettings包装器类型结合了Django global_settings.py和您的本地设置。它允许开发人员决定他想要覆盖哪些设置,他希望保留默认值或他想要添加的设置。

LazySettings类可能是一个错误的名称,因为我觉得它并不是真的很懒。完成from django.conf import settings之类的操作后,整个设置对象都在您的范围内。