0

演示:

from module1 import func1
from module1 import func2

问题:module1 是否执行了两次?这是进口的好方法吗?谢谢!

4

3 回答 3

6

SO2.py

print 'SO2 is running'
a = 'cabbage'
b = 'python-is-awesome'

SO.py

from SO2 import a
from SO2 import b

运行后者时:

SO2 is running

只有一次 ;)。


根据PEP 8可以这样做:

from SO2 import a, b
于 2013-09-24T13:29:15.870 回答
2

模块缓存在导入系统中,因此只加载一次,除非它们被显式重新加载。当 python 尝试导入一个模块时,它首先尝试在 中找到它sys.modules,其中包含对所有先前加载的模块的引用。这对于包也是一样的。要获得更深入的解释,我建议阅读导入机器的优秀文档

于 2013-09-24T13:47:19.363 回答
1

更一般地说,Python 只加载一个模块一次,这是第一次需要它——无论是“导入表单”还是执行“需要”的普通导入语句。任何后续导入只会注意到模块已经加载。

模块初始化仅在加载时完成一次。

如果你需要刷新一个模块的内容,你可以重新加载它。在 Python 2 上,有一个 reload(m) 内置函数来重新加载模块 m。在 Python 3 中,这已移至 imp 模块和 imp.reload(m)。在 Python 3.4 中,imp 被弃用,取而代之的是一个名为“importlib”的新模块(从 3.1 开始)。重新加载模块时,初始化将再次运行。

看:

就“最佳实践”而言,我并不总是“pythonic”。我同意每个导入行一个模块上的 PEP 8 位置,但希望模块也按字母顺序列出。

我不特别喜欢“import from”语句。如果 module.func1 将在当前源代码中的某些特定功能中大量使用,我更喜欢添加:

def myfunc(*a, **k): 
    func1 = module.func1
    ... etc.

...所以很明显,在那个函数中,只有func1意味着module.func1.

于 2013-09-24T13:59:12.057 回答