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

Я использую 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 всякий раз, когда я их использую.

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

Ответ 1

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

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

В равной степени хорошо, если вы несете 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

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

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

test_settings.py:
from settings import *
DEBUG = True

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

Ответ 3

Док 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

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

 import PyQt4.QtCore as Qc

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

Ответ 4

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

В qt4.py:

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

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

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

Ответ 5

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

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

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

Ответ 6

Я тоже абсолютно против import * в общем случае. В случае PySide2 одно из редких исключений:

from PySide2 import *

это шаблон для импорта всех известных модулей из PySide2. Этот импорт очень удобен, потому что импорт всегда корректен. Константа вычисляется из генератора CMAKE. Очень полезно, когда быстро что-то пробует в интерактивной консоли, но также и в автоматическом тестировании.

Для расширенного использования также имеет смысл использовать переменную PySide2.__all__ напрямую, которая реализует эту функцию. Элементы PySide2.__all__ упорядочены по зависимости, поэтому сначала идет QtCore, затем QtGui, QtWidgets ,... и так далее.