Python礼仪:导入模块

时间:2013-06-29 22:12:51

标签: python coding-style

假设我有两个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的导入?

2 个答案:

答案 0 :(得分:3)

引用PEP 8 style guide

  

从包含类的模块导入类时,通常可以拼写:

from myclass import MyClass
from foo.bar.yourclass import YourClass
     

如果此拼写导致本地名称冲突,则拼写它们

import myclass
import foo.bar.yourclass

强调我的。

不要使用module1.module2;您依赖于module1的内部实现细节,稍后可能会更改其使用的导入。您可以直接导入module2,这样做除非模块作者另有说明。

您可以使用__all__ convention来限制从from modulename import *模块导入的内容; help()命令也尊重该列表。列出在__all__中显式导出的名称有助于清理help()文本演示文稿:

  

模块定义的公共名称是通过检查模块命名空间中名为__all__的变量来确定的。如果已定义,则它必须是一个字符串序列,这些字符串是由该模块定义或导入的名称。 __all__中给出的名称都被视为公开名称,并且必须存在。如果未定义__all__,则公共名称集包括在模块命名空间中找到的所有名称,这些名称不以下划线字符('_')开头。 __all__应包含整个公共API。它旨在避免意外导出不属于API的项目(例如在模块中导入和使用的库模块)。

答案 1 :(得分:2)

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

此外,module1.module2.myFunct中的链接点违反了Law of Demeter。也许有一天,您可能希望将module1替换为不导入module1a的其他模块module2。使用import module2,您将避免重写所有module1.module2.myFunct

from module2 import *通常是一种不好的做法,因为它很难追踪变量的来源。混合模块名称空间可以创建变量名冲突。例如,from numpy import *是一个明确的禁忌,因为这样做会覆盖Python的内置summinmaxany,{{1} },allabs