Python*导入

12 python pyqt python-import

我一般都被告知以下是不好的做法.

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)

aru*_*l84 9

这可能会变成一场宗教战争.这是一个问题,你是想要明确,还是想避免过于冗长.一般来说,遵循PythonZen,最好是明确的,但有时人们只是觉得列出特定模块的每个导入都不切实际.


Ada*_*wis 5

我的一般规则是,如果我没有写模块,我不会全部导入.我最大的担心实际上是编写可能已在导入模块中定义的局部变量.因此,为了不必输入长模块名称,我使用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)


nco*_*lan 5

对于已在命名约定中包含命名空间的模块(例如Q*PyQT),明确的例外是完全合理的.但是,我建议明确默认仍然是"不要使用它",只需在编码指南中列出此例外.

import *当它被用作应用程序中的命名空间操作技巧时也是可以接受的(我熟悉的两种形式是在纯Python版本末尾导入的可选C加速模块,并且"展平"包命名空间__init__).关键点在于导入模块和导入的模块在同一组开发人员的控制之下,因此避免命名空间冲突完全在他们的控制范围内.

最后的例外是为了方便交互式提示.

在其他情况下,最好是导入特定名称或通过模块名称间接引用它们(或者,如果有一些常见的引用项,则同时执行以下操作:

导入模块#可以从模块导入a,b,c#访问任何东西但是我们引用了很多,所以直接检索它们