我一般都被告知以下是不好的做法.
from module import *
Run Code Online (Sandbox Code Playgroud)
主要的推理(或者我已经被告知)是你可以导入你不想要的东西,它可能会影响另一个模块中类似命名的函数或类.
然而,PyQt呢
from PyQt4.QtCore import *
Run Code Online (Sandbox Code Playgroud)
我见过的每个例子都是用这种方式编写的,主要是因为从Qt导出的所有内容都以"Q"开头,因此它不会影响任何东西.
什么是共识?是不是总是不好用*进口?
编辑:
需要明确的是,这个问题特别针对使用PyQt4.它与我设计其他项目的方式无关.
基本上,我发现编码到PEP8已经提高了我的代码可读性,除了导入PyQt4之外,所以我一直忽视纯粹主义者的皱眉.但现在我的开发小组正在决定一个约定,我想知道这是否是"实用性超过纯度"的情况,或者我是否应该把它搞砸并处理怪异的PyQt4进口
from PyQt4.QtGui import QComboBox, QLineEdit, QLayout, Q;lakdfaf.......
Run Code Online (Sandbox Code Playgroud)
我的一般规则是,如果我没有写模块,我不会全部导入.我最大的担心实际上是编写可能已在导入模块中定义的局部变量.因此,为了不必输入长模块名称,我使用import作为功能.以您的模块为例,我将执行以下操作:
import PyQt4.QtCore as qt
Run Code Online (Sandbox Code Playgroud)
话虽这么说,我写了很多支持模块,我将导入所有内容.与pyqt模块一样,我使用描述性名称命名它们,以帮助显示它来自哪个模块.
编辑每条注释
当我使用import*时,我的支持模块不包含可以创建新实例的类或任何内容.它们往往是仅修改现有实例的函数组.为了帮助澄清我的观点:如果我是源代码的所有者并且我将成为主要维护者,我将使用import*否则我将使用import作为.
我使用导入功能的另一个原因是允许我模拟模块以进行调试.在我正在进行的项目中,我使用pyVisa与许多GPIB设备进行通信.当我没有连接到设备GPIB网络时,我可以使用dummy_visa模块写入stdout(以验证我发送的格式正确)并返回一个随机数(以测试我的应用程序).见下文
if visa_debug:
import dummy_visa as visa
else:
import visa
gpib = visa.Instrument("GPIB0::10")
gpib.write("MEAS:VOLT?")
Run Code Online (Sandbox Code Playgroud)
对于已在命名约定中包含命名空间的模块(例如Q*PyQT),明确的例外是完全合理的.但是,我建议明确默认仍然是"不要使用它",只需在编码指南中列出此例外.
import *当它被用作应用程序中的命名空间操作技巧时也是可以接受的(我熟悉的两种形式是在纯Python版本末尾导入的可选C加速模块,并且"展平"包命名空间__init__).关键点在于导入模块和导入的模块在同一组开发人员的控制之下,因此避免命名空间冲突完全在他们的控制范围内.
最后的例外是为了方便交互式提示.
在其他情况下,最好是导入特定名称或通过模块名称间接引用它们(或者,如果有一些常见的引用项,则同时执行以下操作:
导入模块#可以从模块导入a,b,c#访问任何东西但是我们引用了很多,所以直接检索它们