gpt4 book ai didi

Python: 'import *' 与 execfile

转载 作者:太空狗 更新时间:2023-10-29 17:55:55 24 4
gpt4 key购买 nike

在我的一些 Django 应用程序中,我使用 settings_local.py 文件来覆盖在不同环境(例如开发、测试和生产)中不同的设置。我最初使用以下代码将其内容包含在 settings.py 中:

try:
from settings_local import *
except ImportError:
sys.stderr.write("The settings_local.py file is missing.\n")
DEBUG=False

我最近找到了 execfile 函数并切换到如下内容:

try:
execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
sys.stderr.write("The settings_local.py file is missing.\n"
DEBUG=False

两者都按预期工作,但我很好奇我是否遗漏了任何陷阱,以及通常更推荐哪种方法以及为什么。

最佳答案

使用execfile 函数将导致每次评估设置文件时都评估Python 源文件(.py)。您每次都在执行 Python 解析器。使用 import 不一定会这样做(可能使用 .pyc 文件)。通常,您第一次在 Python(至少是 cPython)中运行项目时,它会被编译为字节码,而不会再次重新编译。你正在打破它。这不一定是问题,但您应该意识到这一点。

使用 execfile 还会导致在 settings 的模块范围内重新评估 settings_local.py 文件中的所有导入.py 文件。使用 import * 会包含 settings_local.py 模块范围内的所有项目。最终效果是相同的(settings_local.py 模块范围中包含的所有项目都包含在 settings.py 中)但方法不同。

最后,模块作为模块执行而不是包含是正常的。代码包含诸如 os.path.dirname(__file__) 之类的内容是合理的。如果任何代码确实使用了它,您会混淆它,因为代码将不再在作者可能合理预期的模块中执行。

根据我的经验,人们使用 import 而不是 execfile。 Django 非常“约定优于配置”。遵守约定。

关于Python: 'import *' 与 execfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com