是否应避免通配符导入?

2024-12-25 08:51:00
admin
原创
145
摘要:问题描述:我正在使用 PyQt,遇到了这个问题。如果我的导入语句是:from PyQt4.QtCore import * from PyQt4.QtGui import * 然后 pylint 会给出数百个“未使用的导入”警告。我犹豫着是否要关闭它们,因为可能还有其他未使用的导入实际上很有用。另一个选择是这样...

问题描述:

我正在使用 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 Crand from PyQt4 import QtGi as Gu(然后使用Cr.blahand Gu.zorp)或类似的缩写。像所有缩写一样,这是在简洁性和清晰度之间的风格权衡(您更愿意将变量命名为count_of_all_widgets_in_the_inventorynum_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...等等。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3998  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2749  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   85  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   96  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   83  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用