是否应避免通配符导入?
- 2024-12-25 08:51:00
- admin 原创
- 109
问题描述:
我正在使用 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 前缀。
目前,我还不知道最终该在我的项目中采用哪种方式,尽管从我的角度来看,最后一种方式似乎是最痛苦的。这里的常见做法是什么?是否有技术原因导致使用一种风格而不是另一种风格?
解决方案 1:
对你的问题标题的回答是“是”:我建议永远不要使用from ... import *
,我在另一个最近的回答中讨论了原因。简而言之,合格的名称很好,裸名非常有限,因此在你提出的选项中,“第三个选项”是最佳的(因为你将使用合格的名称,而不是裸名)。
(与裸名相比,限定名称的优点包括易于伪造/模拟以进行测试、减少甚至消除意外重新绑定导致的未被注意到的错误的风险、能够“半伪造”“跟踪类”中的顶级名称,以便准确记录您正在使用的内容并简化诸如分析等活动,等等 - 缺点几乎没有……另请参阅 Python 之禅中最后一个但并非最不重要的公案,import this
在交互式解释器提示符下)。
同样好的是,如果您不愿意多用 7 个字符来表示QtCore.whatever
,可以缩写 -- from PyQt4 import QtCore as Cr
and from PyQt4 import QtGi as Gu
(然后使用Cr.blah
and Gu.zorp
)或类似的缩写。像所有缩写一样,这是在简洁性和清晰度之间的风格权衡(您更愿意将变量命名为count_of_all_widgets_in_the_inventory
、num_widgets
还是x
?通常中间的选择是最好的,但并非总是如此;-)。
as
顺便说一句,我不会在单个from
或语句中使用多个子句import
(可能会造成混淆),我宁愿使用多个语句(如果任何导入出现问题,也更容易调试,如果您在将来更改导入,可以更容易地进行编辑,...)。
解决方案 2:
也有很好的案例import *
。例如,Django 开发人员通常拥有许多配置文件并使用 import * 将它们链接起来:
settings.py:
FOO = 1
BAR = 2
DEBUG = False
test_settings.py:
from settings import *
DEBUG = True
在这种情况下大多数的缺点import *
就变成了优点。
解决方案 3:
Python 文档说:
尽管某些模块被设计为在使用 import * 时仅导出遵循某些模式的名称,但在生产代码中这仍然被认为是不好的做法。
它可能会产生副作用并且很难调试
就我个人而言,我使用import
而不是 ,from import
因为我发现文件开头的声明非常大,我认为它可以让代码更具可读性
import PyQt4
PyQt4.QtCore
如果模块名太长,可以用as
关键字进行本地重命名。例如:
import PyQt4.QtCore as Qc
解决方案 4:
PyQt4 的导入是一个特殊情况。
有时我会选择“第一个选项”进行快速而粗糙的编码,当代码变得越来越长时,它会变成“第二个选项”。
命名空间冲突在这里可能不是什么大问题,我还没有看到其他包的名称以大“Q”开头。每当我完成一个 PyQt4 脚本时。将“从 PyQt4.QtGui 导入 *”转换为某事,例如“
from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
QVBoxLayout)
“仅供参考,这里使用多行导入的括号很方便。
解决方案 5:
我对我使用的 PyQt 模块使用“import *”,但我将它们放在自己的模块中,因此它不会污染用户的命名空间。例如
在 qt4.py 中:
从 PyQt4.QtCore 导入 *
从 PyQt4.QtGui 导入 *
然后像这样使用
导入 qt4
应用程序 = qt4.QApplication(…)
解决方案 6:
import *
在一般情况下,我绝对反对。但有PySide2
一个罕见的例外情况适用:
from PySide2 import *
是从 导入所有已知模块的模式PySide2
。这种导入非常方便,因为导入始终是正确的。常数是从CMAKE
生成器计算出来的。在交互式控制台中快速尝试某些操作时非常有用,在自动化测试中也非常有用。
对于高级用法,直接使用变量也是有意义的PySide2.__all__
,它实现了此功能。的元素PySide2.__all__
按依赖性排序,因此首先是QtCore
,然后是QtGui
,,QtWidgets
...等等。
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)