Следует ли избегать импорта подстановочных знаков?

Я использую PyQt, и я сталкиваюсь с этой проблемой. Если мои операторы импорта:

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

то pylint дает сотни предупреждений «Неиспользуемый импорт». Я не решаюсь просто отключить их, потому что могут быть другие неиспользуемые импорт, которые действительно полезны для просмотра. Другим вариантом было бы сделать это:

 from PyQt4.QtCore import Qt, QPointF, QRectF from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ... 

и я получаю 9 классов на линии QtGui. Существует третий вариант:

 from PyQt4 import QtCore, QtGui 

а затем префикс всех классов с QtCore или QtGui всякий раз, когда я их использую.

На данный момент я агностик относительно того, какой из них я делаю в своем проекте, хотя последнее кажется самым болезненным с моей точки зрения. Каковы общие практики здесь? Есть ли техническая причина использовать один стиль над другим?

  • Как импортировать класс Python, который находится в каталоге выше?
  • Как импортировать файл python из подмодуля git
  • В Python, что происходит при импорте внутри функции?
  • Предотвращение кэширования Python импортированными модулями
  • Импорт модулей Python - Явный и неявный относительный импорт
  • кошмар с относительным импортом, как работает pep 366?
  • Как загружается загрузка модуля в CPython?
  • Почему Python запускает мой модуль, когда я его импортирую, и как его остановить?
  • 5 Solutions collect form web for “Следует ли избегать импорта подстановочных знаков?”

    Ответ на ваш вопрос «да»: я рекомендую никогда не использовать from ... import * , и я обсуждал причины в другом очень недавнем ответе. Вкратце, квалифицированные имена хороши , баренеймы очень ограничены, поэтому «третий вариант» является оптимальным (поскольку вы будете использовать квалифицированные имена, а не имена) среди присутствующих.

    (Преимущества квалифицированных имен wrt barenames включают в себя простоту подделки / издевательств для целей тестирования, сводящуюся к аннулированному риску незаметных ошибок, вызванных случайным переуплотнением, возможность «полуфайла» верхнего имени в «классе трассировки» для ведения журнала именно то, что вы используете, и облегчение таких действий, как профилирование, и т. д. – недостатки, почти ничего … см. также последний, но не наименее koan в Zen of Python, import this в приглашении интерактивного интерпретатора ).

    В равной степени хорошо, если вы жалеете 7 дополнительных персонажей, чтобы сказать QtCore.whatever бы 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 стиля между лаконичностью и ясностью (вы бы скорее count_of_all_widgets_in_the_inventory переменную count_of_all_widgets_in_the_inventory , num_widgets или x ? Часто средний выбор был бы лучшим, но не всегда ;-).

    BTW, я бы не использовал более одного предложения в одном from оператора или from import (может быть, запутанным), я бы предпочел иметь несколько операторов (также легче отлаживать, если какой-либо импорт дает проблему, редактировать, если вы меняете свой импорт в будущем, …).

    Есть также хорошие случаи для import * . то есть. разработчикам Django часто приходится иметь много файлов конфигурации и связывать их с помощью import *:

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

    В этом случае большинство недостатков import * становятся преимуществами.

    Документ Python говорит:

    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 

    Если имя модуля слишком длинное и его можно переименовать локально с ключевым словом. Например:

      import PyQt4.QtCore as Qc 

    Я надеюсь, что это помогает

    Я использую «import *» для модулей PyQt, которые я использую, но я помещаю их в свой собственный модуль, поэтому он не загрязняет пространство имен пользователя. например

    В qt4.py:

      от импорта PyQt4.QtCore *
      от импорта PyQt4.QtGui *
    

    Затем используйте его так

      импорт qt4
      app = qt4.QApplication (...)
    

    импорт для PyQt4 – особый случай.
    иногда я выбираю «первый вариант» для быстрого и грязного кодирования и превращаю его в «второй вариант», когда код увеличивается дольше и дольше.
    столкновение пространства имен, возможно, не имеет большого значения здесь, я не вижу, что другое имя пакета начинается с большого «Q». и всякий раз, когда я заканчиваю скрипт PyQt4. конвертировать "из PyQt4.QtGui import *" в sth. как "

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

    «просто FYI, круглые скобки для многострочного импорта удобны здесь.

    Python - лучший язык программирования в мире.