是否应避免通配符导入?

2024-12-25 08:51:00
admin
原创
109
摘要:问题描述:我正在使用 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...等等。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用