我正在使用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为所有类添加前缀。
在这一点上,我不知道我最终在我的项目中做了哪一个,尽管从我的角度来看,最后一个似乎是最痛苦的。这里的常见做法是什么?是否有技术理由使用一种风格而不是另一种风格?
答案 0 :(得分:44)
你问题标题的答案是“是”:我建议永远不要使用from ... import *
,我在另一个最近的答案中讨论了原因。简而言之,限定名称好,名字非常有限,因此“第三选项”在您出席的人中是最佳的(因为您将使用合格的名称,而不是姓名)。
(合格名称的优点,包括伪名称包括易于伪造/嘲笑以用于测试目的,减少因意外重新绑定引起的无意识错误的无效风险,能够在“跟踪类”中“半假”顶级名称准确记录你正在使用的东西并简化诸如剖析之类的活动等等的目的 - 缺点,几乎没有...也参见Python的Zen中的最后但并非最不重要的公案,{{1}在交互式解释器提示符处。)
同样好,如果你吝啬7个额外的字符来说import this
,则缩写 - QtCore.whatever
和from PyQt4 import QtCore as Cr
(然后使用from PyQt4 import QtGi as Gu
和{{1} })等。像所有缩写一样,它是简洁性和清晰度之间的风格权衡(您更愿意命名变量Cr.blah
,Gu.zorp
或count_of_all_widgets_in_the_inventory
吗?通常中间选择最好,但并非总是如此; - 。)
num_widgets
或x
语句中使用多个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)
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
,然后是QtGui
,QtWidgets
等。