[英]Python Etiquette: Importing Modules
假设我有两个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
的导入?
引用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的项目(例如在模块中导入和使用的库模块)。
只需import module2
。 重新导入是相对无成本的,因为Python在sys.modules中缓存模块对象。
此外,如module1.module2.myFunct
中的链接点违反了Demeter法则 。 也许有一天你会想更换module1
与其他一些模块module1a
不导入module2
。 通过使用import module2
,您将避免重写所有出现的module1.module2.myFunct
。
from module2 import *
通常是一种不好的做法,因为它很难追踪变量的来源。 混合模块名称空间可以创建变量名冲突。 例如, from numpy import *
是一个明确的from numpy import *
,因为这样做会覆盖Python的内置sum
, min
, max
, any
, all
, abs
和round
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.