假设我有两个Python模块:
module1.py:

import module2
def myFunct(): print "called from module1"
module2.py:
def myFunct(): print "called from module2"
def someFunct(): print "also called from module2"

如果我导入module1,重新导入module2是更好的礼节,还是仅将其称为module1.module2

例如(someotherfile.py):
import module1
module1.myFunct() # prints "called from module1"
module1.module2.myFunct() # prints "called from module2"

我也可以这样做:module2 = module1.module2。现在,我可以直接调用module2.myFunct()

但是,我可以将module1.py更改为:
from module2 import *
def myFunct(): print "called from module1"

现在,在someotherfile.py中,我可以执行以下操作:
import module1
module1.myFunct() # prints "called from module1"; overrides module2
module1.someFunct() # prints "also called from module2"

另外,通过导入*,help('module1')可以显示module2的所有功能。

另一方面,(假设module1.py使用import module2),我可以这样做:someotherfile.py:
 import module1, module2
 module1.myFunct() # prints "called from module1"
 module2.myFunct() # prints "called from module2"

再次,哪个是更好的礼节和做法?要再次导入module2,还是只引用module1的导入?

最佳答案

只是import module2。由于Python将模块对象缓存在sys.modules中,因此重新导入相对没有成本。

此外,像module1.module2.myFunct中那样链接点是对Law of Demeter的违反。也许有一天您会想要用其他不导入module1的模块module1a替换module2。通过使用import module2,您将不必重写所有出现的module1.module2.myFunct
from module2 import *通常是一个不好的做法,因为它使跟踪变量的来源变得困难。混合模块 namespace 会造成变量名冲突。例如,from numpy import *是绝对禁止的,因为这样做会覆盖Python的内置summinmaxanyallabsround

关于Python礼节: Importing Modules,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17385156/

10-12 17:03