假设我有两个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
的导入?
答案 0 :(得分:3)
从包含类的模块导入类时,通常可以拼写:
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的内置sum
,min
,max
,any
,{{1} },all
和abs
。