• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

在分割Django设置文件时临时修改`builtins`

python 来源:aaronasterling 8次浏览

我正在启动一个Django 1.10项目,并且想要分割设置文件。我对任何现有的解决方案都不满意。在分割Django设置文件时临时修改`builtins`

  1. 我不希望能够覆盖在另一个从一个文件string/boolean/dict设置。每个string/boolean/dict设置应该只设置在一个地方。这可以很容易地跟踪事物的定义。
  2. 我不想手动扩展tuple/list设置,例如, INSTALLED_APPS += (test_app)。这看起来很乱,需要我跟踪是否在其他文件中使用了列表或元组。

  3. 我不想在import os和多个文件中定义BASE_DIR。干。

我的解决方案,已经看了许多人一样,是用含有local_settings.pycommon_settings.py__init__.py一个目录替换settings.py

__init__.py,I import os和计算BASE_DIR。然后我

import builtins 
builtins.BASE_DIR = BASE_DIR 
builtins.os = os 

from .common_settings import * 
from . import local_settings 

# At this point both modules have run and we no longer need to be messing 
# with the builtins namespace. 
del builtins.BASE_DIR 
del builtins.os 
del builtins 

我然后遍历dir(local_settings)和惹globals()实现了前两个要求(我可以张贴整个事情,如果提出要求,但我很感兴趣,我使用的builtins)。

这种使用builtins太邪恶了吗?什么可以打破它。显然,如果任一标识符与builtins的更高版本的属性冲突,那么这段代码将会破坏python。如果使用这些标识符中的任何一个的函数结束在其中一个设置文件中,并且稍后调用它,则会中断。

虽然我没有看到这两种情况。有没有我没有看到的潜在问题?

===========解决方案如下:

以这种方式修改builtins的主要问题是,它无缘无故地将非本地推理添加到您的代码中。现在通用/本地设置模块的行为隐含地取决于导入模块的行为。那很糟。

基本上,你需要摆脱你的要求#3。

  • 每个模块中导入os不是“重复自己”,因为每个模块导入os到它自己的命名空间。这就是Python的工作原理。

  • 你说得对想只定义BASE_DIR一次,但要做到这一点,正确的做法是在一个模块中定义的变量(比如basedir.py),然后明确地导入变量(from basedir import BASE_DIR)到使用各个模块它。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)