应该避免通配符导入吗?

2024-05-01 03:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在这一点上,我不知道我最终在我的项目中做哪一个,虽然最后一个似乎是最痛苦的从我的角度来看。这里常见的做法是什么?是否有技术上的原因使用一种样式而不是另一种?


Tags: fromimport警告语句qtpyqtpylint行上
3条回答

对于import *也有很好的例子。例如,Django开发人员通常有许多配置文件,并使用import*链接它们:

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

test_settings.py:
from settings import *
DEBUG = True

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

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

(与裸名相关的限定名的优点包括易于为了测试而伪造/模仿,减少了由于意外重新绑定而导致未注意到的错误的风险,能够在“跟踪类”中“半伪造”顶级名,以便准确地记录您正在使用的内容并简化分析等活动,等等——缺点,几乎没有。。。另请参见Python禅中最后但并非最不重要的koan,import this在交互式解释器提示下)。

同样好的是,如果你不喜欢这7个额外的字符,比如QtCore.whatever,那就是缩写--from PyQt4 import QtCore as Crfrom PyQt4 import QtGi as Gu(然后使用Cr.blahGu.zorp)等。与所有缩写词一样,它是简洁性和清晰性之间的一种样式权衡(您愿意命名变量count_of_all_widgets_in_the_inventorynum_widgets,还是x)?通常中间的选择是最好的,但并不总是如此;-)。

顺便说一句,我不会在一个fromimport语句中使用多个as子句(可能会令人困惑),我宁愿有多个语句(如果任何导入有问题,也更容易调试,如果以后更改导入,则可以编辑,…)。

Python doc说:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practice in production code.

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

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

import PyQt4

PyQt4.QtCore

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

import PyQt4.QtCore as Qc

相关问题 更多 >