繁体   English   中英

Python礼仪:导入模块

[英]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的内置summinmaxanyallabsround

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM