代码之家  ›  专栏  ›  技术社区  ›  Colin

是否应避免通配符导入?

  •  42
  • Colin  · 技术社区  · 15 年前

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

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

    5 回复  |  直到 13 年前
        1
  •  58
  •   Alex Martelli    15 年前

    你的问题标题的答案是“是”:我建议永远不要使用 from ... import * 好的

    (与barenames相关的限定名的优点包括易于为测试目的伪造/模拟,减少了意外重新绑定导致的未被注意到的错误的风险,能够“半伪造”一个“跟踪类”中的顶级名,以便准确记录您正在使用的内容,并简化了分析等活动,等等--缺点,几乎没有。。。另见《蟒蛇禅》中最后但并非最不重要的一句话, import this 在交互式口译员提示下)。

    同样好,如果你不愿意多说7个字的话 QtCore.whatever ,是缩写-- from PyQt4 import QtCore as Cr from PyQt4 import QtGi as Gu (然后使用 Cr.blah Gu.zorp )或者类似的。像所有的缩写一样,它是简洁和清晰之间的一种风格折衷(你愿意命名一个变量吗 count_of_all_widgets_in_the_inventory , num_widgets x ? 通常情况下,中间的选择是最好的,但并不总是;-)。

    顺便说一句,我不会用一个以上 as from import 语句(可能会混淆),我宁愿有多个语句(如果任何导入出现问题,也更容易调试,如果将来更改导入,也更容易编辑,…)。

        2
  •  20
  •   Tomasz Wysocki    15 年前

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

    settings.py:
    FOO = 1
    BAR = 2
    DEBUG = False
    
    test_settings.py:
    from settings import *
    DEBUG = True
    

    在这种情况下 成为优势。

        3
  •  3
  •   funnydman    6 年前

    Python doc 说:

    尽管某些模块设计为只导出后面的名称 生产代码实践。

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

    就我个人而言,我正在使用 import 而不是 from import

    import PyQt4
    
    PyQt4.QtCore
    

    如果模块名太长,可以使用 as 关键字。例如:

    import PyQt4.QtCore as Qc
    
        4
  •  1
  •   xioxox    13 年前

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

    在qt4.py中:

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

    那就这样用吧

     import qt4
     app = qt4.QApplication(...)
    
        5
  •  0
  •   sunqiang    15 年前


    有时我会选择“第一个选项”进行快速而肮脏的编码,当代码越来越长时,我会选择“第二个选项”。

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

    " 仅供参考, parentheses for multi-line import 这里很方便。

        6
  •  0
  •   Christian Tismer    6 年前

    我太反对了 import * 一般情况下。 如果是 PySide2

    from PySide2 import *
    

    是从中导入所有已知模块的模式 导入非常方便,因为导入总是正确的。 常数是根据 CMAKE 发电机。很有帮助

    对于高级用法,使用 使用 PySide2.__all__ 变量,它实现了 功能。的要素 PySide2.全部__ 所以先来 QtCore ,那么 QtGui , QtWidgets , ... 等等。