在拆分django设置文件时临时修改`builtins`

时间:2016-11-28 01:44:11

标签: python django python-3.x django-1.10

我正在启动一个django 1.10项目,并希望拆分设置文件。我对任何现有的解决方案都不满意。

  1. 我不希望能够覆盖另一个文件中的string / boolean / dict设置。每个string / boolean / dict设置应仅在一个位置设置。这样可以轻松跟踪事物的定义。
  2. 我不想手动延长tuple / list设置,例如INSTALLED_APPS += (test_app)。这似乎很混乱,需要我跟踪是否在另一个文件中使用了列表或元组。

  3. 我不想要import os并在多个文件中定义BASE_DIR。 DRY。

  4. 我的解决方案在查看了许多其他内容后,将settings.py替换为包含local_settings.pycommon_settings.py__init__.py的目录。

    __init__.py,我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。如果使用这些标识符中的任何一个的函数最终出现在其中一个设置文件中并且稍后被调用,则会中断。

    我没有看到其中任何一件事发生。我有没有看到潜在的问题?

1 个答案:

答案 0 :(得分:0)

以这种方式修改builtins的主要问题是,它没有充分的理由为您的代码添加非本地推理。现在,公共/本地设置模块的行为隐含地取决于导入它们的模块中发生的情况。那太糟糕了。

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

  • 在每个模块中导入os并不是重复自己"因为每个模块都会将os导入到自己的命名空间中。这就是Python的工作方式。

  • 您只想定义BASE_DIR一次,但正确的方法是在一个模块中定义变量(比如basedir.py),然后明确将该变量(from basedir import BASE_DIR)导入到使用它的每个模块中。