Python的: '进口*' VS的execfile(Python: 

2019-07-30 16:33发布

在一些我的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

这两个工作的打算,但我很好奇是否我错过任何陷阱,一般哪种方法更值得推荐的是,为什么。

Answer 1:

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

使用execfile也将导致所有你可能有进口量的settings_local.py文件中的模块范围进行重新评估settings.py文件。 采用import *会包含在所有项目settings_local.py模块范围。 净效果是相同的(包括在所有项目settings_local.py模块范围被包括在settings.py ),但方法是不同的。

最后,这是正常的模块的模块来执行,而不是包括在内。 是合理的代码,以包括诸如os.path.dirname(__file__) 如果任何代码都用这个,你会混淆它的代码将不再是笔者可能合理预期模块中执行。

根据我的经验,人们使用importexecfile 。 Django是非常“约定优于配置”。 按照约定。



Answer 2:

另一个不同之处:得到的execfile上下文字典; 默认情况下,全球范围内或指定的字典。 这可能会允许一些奇怪的事情

dont_do_this.py

# Probably not a good thing to do
z=x+1  # an expression that involves an un-defined field

明显,

from dont_do_this import *

失败。

然而,

d={'x':1}
execfile( 'dont_do_this.py', d )

是OK并且导致d=={'x':1, 'z':2}

注意

x=1
execfile( 'dont_do_this.py' )

是OK,并在不同的结果z被加入到全局。



Answer 3:

第一个版本( from settings_local import * )是每个人都希望看到。 它也将让代码分析器找到该模块。



文章来源: Python: 'import *' vs execfile