是否应该避免使用通配符?

时间:2010-09-01 04:54:59

标签: python pyqt pyqt4 pylint python-import

我正在使用PyQt并遇到了这个问题。如果我的导入语句是:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

然后pylint会发出数百个“未使用的导入”警告。我很犹豫要把它们关闭,因为可能有其他未使用的导入实际上很有用。另一种选择是这样做:

from PyQt4.QtCore import Qt, QPointF, QRectF
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ...

我最终在QtGui线上有9节课。还有第三种选择,即:

from PyQt4 import QtCore, QtGui

然后每当我使用它们时,用QtCore或QtGui为所有类添加前缀。

在这一点上,我不知道我最终在我的项目中做了哪一个,尽管从我的角度来看,最后一个似乎是最痛苦的。这里的常见做法是什么?是否有技术理由使用一种风格而不是另一种风格?

6 个答案:

答案 0 :(得分:44)

你问题标题的答案是“是”:我建议永远不要使用from ... import *,我在另一个最近的答案中讨论了原因。简而言之,限定名称​​好,名字非常有限,因此“第三选项”在您出席的人中是最佳的(因为您将使用合格的名称,而不是姓名)。

(合格名称的优点,包括伪名称包括易于伪造/嘲笑以用于测试目的,减少因意外重新绑定引起的无意识错误的无效风险,能够在“跟踪类”中“半假”顶级名称准确记录你正在使用的东西并简化诸如剖析之类的活动等等的目的 - 缺点,几乎没有...也参见Python的Zen中的最后但并非最不重要的公案,{{1}在交互式解释器提示符处。)

同样好,如果你吝啬7个额外的字符来说import this,则缩写 - QtCore.whateverfrom PyQt4 import QtCore as Cr(然后使用from PyQt4 import QtGi as Gu和{{1} })等。像所有缩写一样,它是简洁性和清晰度之间的风格权衡(您更愿意命名变量Cr.blahGu.zorpcount_of_all_widgets_in_the_inventory吗?通常中间选择最好,但并非总是如此; - 。)

顺便说一下,我不会在单个num_widgetsx语句中使用多个as子句(可能会令人困惑),我宁愿有多个语句(也更容易如果任何导入产生问题,请调试,如果将来更改导入则进行编辑,...)。

答案 1 :(得分:11)

import *也有很好的案例。即。 Django开发人员常常有很多配置文件并使用import *链接它们:

settings.py:
FOO = 1
BAR = 2
DEBUG = False

test_settings.py:
from settings import *
DEBUG = True

在这种情况下,import *的大多数缺点都会成为优势。

答案 2 :(得分:3)

Python doc说:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.

它可能有副作用而且很难调试

Personnaly,我使​​用的是import而不是from import,因为我在文件的开头发现了很糟糕的大声明,我认为它使代码更具可读性

import PyQt4

PyQt4.QtCore

如果模块名称太长,可以使用as关键字在本地重命名。例如:

 import PyQt4.QtCore as Qc

我希望它有所帮助

答案 3 :(得分:1)

我对我使用的PyQt模块使用“import *”,但我将它们放在自己的模块中,因此它不会污染用户的命名空间。 e.g。

在qt4.py中:

 from PyQt4.QtCore import *
 from PyQt4.QtGui import *

然后像这样使用它

 import qt4
 app = qt4.QApplication(...)

答案 4 :(得分:0)

导入PyQt4是一种特殊情况 有时我会选择“第一个选项”进行快速和脏的编码,并在代码变长和变长时将其变为“第二个选项”。
命名空间碰撞在这里可能不是什么大问题,我没有看到其他package'name以一个大的“Q”开头。每当我完成一个PyQt4脚本。将“从PyQt4.QtGui import *”转换为......喜欢“

from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
                         QVBoxLayout)

” 仅供参考,parentheses for multi-line import在这里很方便。

答案 5 :(得分:0)

在一般情况下,我绝对反对import *。 对于PySide2,一种罕见的例外情况适用:

from PySide2 import *

是从PySide2导入所有已知模块的模式。这个 导入非常方便,因为导入始终是正确的。 该常数是从CMAKE生成器计算得出的。非常有帮助 在交互式控制台中快速尝试某些功能时,还可以进行自动化测试。

对于高级用法而言, 直接使用PySide2.__all__变量,它实现了 特征。 PySide2.__all__的元素按相关性排序, 因此首先出现QtCore,然后是QtGuiQtWidgets等。