是否应该避免使用通配符?

问题描述 投票:42回答:5

我正在使用PyQt并遇到了这个问题。如果我的import语句是:

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为所有类添加前缀。

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

python pyqt pyqt4 pylint python-import
5个回答
44
投票

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

(合格名称的优点,包括伪名称,包括易于伪造/模拟以用于测试目的,减少因意外重新绑定引起的无意识错误的无效风险,能够在“跟踪类”中“半假”顶级名称以进行日志记录正是你正在使用和简化诸如剖析之类的活动等等 - 缺点,几乎没有...也参见Python的Zen中的最后但并非最不重要的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_widgetsx?中间选择通常是最好的,但并非总是如此;-)。

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


10
投票

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

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

test_settings.py:
from settings import *
DEBUG = True

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


3
投票

Python doc说:

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

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

Personnaly,我使​​用import而不是from import,因为我在文件的开头发现了糟糕的大声明,我认为它使代码更易读

import PyQt4

PyQt4.QtCore

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

 import PyQt4.QtCore as Qc

我希望它有所帮助


1
投票

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

在qt4.py中:

 from PyQt4.QtCore import *
 from PyQt4.QtGui import *

然后像这样使用它

 import qt4
 app = qt4.QApplication(...)

0
投票

导入PyQt4是一个特例。 有时我会为快速和脏编码选择“第一选项”,并在代码变得越来越长时将其变为“第二选项”。 命名空间碰撞在这里可能不是什么大问题,我没有看到其他package'name以一个大的“Q”开头。每当我完成一个PyQt4脚本。将“从PyQt4.QtGui import *”转换为......喜欢 ”

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

“只是仅供参考,parentheses for multi-line import在这里很方便。

© www.soinside.com 2019 - 2024. All rights reserved.