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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否应该避免使用通配符?相关的知识,希望对你有一定的参考价值。

我正在使用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为所有类添加前缀。

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

答案

你问题标题的答案是“是”:我建议永远不要使用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子句(可能会令人困惑),我宁愿有多个语句(如果有任何导入问题也更容易调试,如果更改导入则编辑在将来, ...)。

另一答案

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

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

test_settings.py:
from settings import *
DEBUG = True

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

另一答案

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

我希望它有所帮助

另一答案

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

在qt4.py中:

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

然后像这样使用它

 import qt4
 app = qt4.QApplication(...)
另一答案

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

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

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

以上是关于是否应该避免使用通配符?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 Outlook 发送代码片段?

架构丰富的代码片段也应该用于产品列表吗?

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

避免mysql注入应该避免都有哪些特殊字符

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

是否应该避免使用 LINQ,因为它很慢? [关闭]