Python礼仪:导入模块

Rus*_*hal 6 python coding-style

假设我有两个Python模块:

module1.py:

import module2
def myFunct(): print "called from module1"
Run Code Online (Sandbox Code Playgroud)

module2.py:

def myFunct(): print "called from module2"
def someFunct(): print "also called from module2"
Run Code Online (Sandbox Code Playgroud)

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

例如(someotherfile.py):

import module1
module1.myFunct() # prints "called from module1"
module1.module2.myFunct() # prints "called from module2"
Run Code Online (Sandbox Code Playgroud)

我也可以这样做:module2 = module1.module2.现在,我可以直接打电话module2.myFunct().

但是,我可以module1.py改为:

from module2 import *
def myFunct(): print "called from module1"
Run Code Online (Sandbox Code Playgroud)

现在,someotherfile.py我可以这样做:

import module1
module1.myFunct() # prints "called from module1"; overrides module2
module1.someFunct() # prints "also called from module2"
Run Code Online (Sandbox Code Playgroud)

此外,通过导入*,help('module1')显示了所有的功能module2.

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

 import module1, module2
 module1.myFunct() # prints "called from module1"
 module2.myFunct() # prints "called from module2"
Run Code Online (Sandbox Code Playgroud)

再说一遍,哪个礼仪和练习更好?要module2再次导入,还是仅仅参考module1进口?

unu*_*tbu 2

只是import module2。重新导入的成本相对较低,因为 Python 将模块对象缓存在sys.modules中。

此外,将点链接起来module1.module2.myFunct违反了德米特法则。也许有一天您会想要替换module1为其他一些module1a不导入的模块module2。通过使用import module2,您将避免重写所有出现的module1.module2.myFunct.

from module2 import *这通常是一种不好的做法,因为它使得很难追踪变量的来源。混合模块名称空间可能会造成变量名称冲突。例如,是from numpy import *明确禁止的,因为这样做会覆盖 Python 的内置summinmaxanyallabsround