6

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

4

2 回答 2

3

引用PEP 8 风格指南

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

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

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

import myclass
import foo.bar.yourclass

强调我的。

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

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

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

于 2013-06-29T22:19:17.737 回答
2

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

此外,将点链接起来module1.module2.myFunct违反了得墨忒耳法则。也许有一天你会想用其他一些不导入的module1模块来替换。通过使用,您将避免必须重写所有出现的.module1amodule2import module2module1.module2.myFunct

from module2 import *通常是一种不好的做法,因为它很难追踪变量的来源。混合模块命名空间会产生变量名冲突。例如,from numpy import *绝对不能,因为这样做会覆盖 Python 的内置sum, min, max, any, all,absround.

于 2013-06-29T22:20:31.623 回答