【问题标题】:Using exec vs import in python在 python 中使用 exec 与 import
【发布时间】:2012-11-22 10:50:30
【问题描述】:

在 django 中使用local_settings.py 文件来补充settings.py 是很常见的,这样每台机器都可以有不同的设置。通常人们会这样做。

try:
    from local_settings import *
except ImportError:
    print "No local settings found!"

但设置文件通常包含较大的列表,例如INSTALLED_APPS。如果我想添加一个应用程序,我宁愿不将整个列表复制到local_settings.py 并对其进行修改(使代码可读性降低,并且更新settings.py 不再影响任何重写INSTALLED_APPS 的机器)。所以我想我可以这样做:

try:
    f = open('local_settings.py','r')
    exec f.read()
except IOError:
    print "No local settings found!"

现在local_settings.py 不再需要重写整个INSTALLED_APPS 变量:

INSTALLED_APPS.append('debug_toolbar')

我的印象是,无论何时您使用execeval,您都可能做错了什么。所以我的问题是,这有什么问题吗?有更好的方法吗?

【问题讨论】:

  • 您希望拥有可修改的默认值并不排除使用import。为什么您认为需要使用exec 来完成此操作?

标签: python django settings


【解决方案1】:

这是我的技巧:

settings.py

try:
    from local_settings import *
except ImportError:
    sys.exit("FATAL: No local settings file found.")

local_settings.py

import settings

settings.INSTALLED_APPS += ('django_extensions',)

【讨论】:

  • 这不是周期性导入吗?不导入local_settings 不导入设置就无法导入设置...
  • 我把try 声明放在settings.py 的底部,所以INSTALLED_APPS 已经定义好了。这样你也可以覆盖设置(例如settings.DEBUG = True
  • 我切换到了这种方法(在我上一条评论之前),所以我知道它有效。我只是不明白这是如何避免周期性导入问题的。您的评论很好地解释了这一点,谢谢。非常迷人。
【解决方案2】:

有一个更好的方法:在local_settings.py中导入INSTALLED_APPS,复制它,然后添加到副本中:

import settings

INSTALLED_APPS = settings.INSTALLED_APPS[:] + ['debug_toolbar']

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多