63

我正在使用 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 前缀。

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

4

6 回答 6

64

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

(合格名称wrtbarenames的优点包括易于伪造/模拟以用于测试目的,降低因意外重新绑定引起的未注意到错误的无效风险,能够“半伪造”“跟踪类”中的顶级名称以进行日志记录正是你正在使用的东西和简化诸如分析等活动 - 缺点,几乎没有......另请参阅 Python 之禅中最后但并非最不重要的 koan,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_inventory,num_widgets还是x?通常中间选择是最好的,但并非总是如此;-)。

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

于 2010-09-01T05:17:18.943 回答
24

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

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

test_settings.py:
from settings import *
DEBUG = True

在这种情况下,大多数缺点都import *变成了优点。

于 2010-09-01T05:24:26.620 回答
3

Python 文档说:

尽管某些模块设计为在您使用 import * 时仅导出遵循某些模式的名称,但在生产代码中仍被认为是不好的做法。

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

就个人而言,我使用import而不是from import因为我在文件开头发现了可怕的大声明,我认为它使代码更具可读性

import PyQt4

PyQt4.QtCore

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

import PyQt4.QtCore as Qc
于 2010-09-01T05:09:14.840 回答
1

我对我使用的 PyQt 模块使用“import *”,但我将它们放在自己的模块中,所以它不会污染用户的命名空间。例如

在 qt4.py 中:

从 PyQt4.QtCore 导入 *
 从 PyQt4.QtGui 导入 *

然后像这样使用它

导入qt4
 应用程序 = qt4.QApplication(...)
于 2013-02-25T16:06:58.740 回答
0

PyQt4 的导入是一个特例。
有时我会选择“第一个选项”来进行快速而肮脏的编码,而当代码越来越长时,我会转为“第二个选项”。
命名空间冲突在这里可能没什么大不了的,我还没有看到其他包的名称以大“Q”开头。每当我完成一个 PyQt4 脚本时。将“从 PyQt4.QtGui import *”转换为…… 像 ”

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

" 仅供参考,多行导入的括号在这里很方便。

于 2010-09-02T07:07:53.127 回答
0

import *在一般情况下,我绝对反对。在 的情况下PySide2,少数例外情况之一适用:

from PySide2 import *

是从中导入所有已知模块的模式PySide2。这个导入很方便,因为导入总是正确的。常数是从CMAKE生成器计算出来的。在交互式控制台中快速尝试某些东西时非常有用,而且在自动化测试中也是如此。

PySide2.__all__对于高级用法,直接使用实现此功能的变量也很有意义。的元素PySide2.__all__是按依赖排序的,所以先来QtCore,然后QtGuiQtWidgets,... 等等。

于 2019-06-28T08:26:54.350 回答