Следует ли избежать импорта подстановки?
-
26-09-2019 - |
Вопрос
Я использую PYQT и бегаю в эту проблему. Если мои операторы импорта:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
Затем пилинт дает сотни предупреждений «неиспользованного импортного». Я нерешительно, чтобы просто отключить их, потому что может быть другой неиспользованный импорт, который на самом деле полезно видеть. Другой вариант будет делать это:
from PyQt4.QtCore import Qt, QPointF, QRectF
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ...
И я в конечном итоге 9 классов на линии Qtgui. Есть третий вариант, который есть:
from PyQt4 import QtCore, QtGui
а затем префикс всех классов с помощью QTCORE или QTGUI, когда я их использую.
На данный момент я агностик, насколько я в конечном итоге делаю в моем проекте, хотя последний кажется самым болезненным с моей точки зрения. Какие обычные практики здесь? Есть ли технические основания использовать один стиль над другим?
Решение
Ответ на заголовок вашего вопроса - «Да»: я рекомендую никогда не использовать from ... import *
, И я обсудил причины в другом очень недавнем ответе. Кратко, квалифицированные имена хорошо, Бараменты очень ограничены, поэтому «третий вариант» является оптимальным (как вы будете использовать квалифицированные имена, а не барамеры) среди тех, которые вы представляете.
(Преимущества квалифицированных наименований WRT 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
Заявление (может быть запутано), я бы предпочел бы иметь несколько заявлений (также проще отлаживать, если какой-либо импорт предоставляет проблему, редактировать, если вы измените свой импорт в будущем, ...).
Другие советы
Есть также хорошие случаи для import *
. Отказ т.е. Предварительно для разработчиков Django есть много конфигурационных файлов и цепочки их, используя импорт *:
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.
Он может иметь побочные эффекты и быть очень трудно отлаживать
Персоналы, я использую import
скорее, чем from import
потому что я нахожу ужасные большие декларации в начале файла, и я думаю, что он сохраняет код более читабельным
import PyQt4
PyQt4.QtCore
Если имя модуля слишком длинное и можно переименовать локально с помощью as
ключевое слово. Например:
import PyQt4.QtCore as Qc
Я надеюсь, что это помогает
Я использую «импорт *» для модулей PYQT, которые я использую, но я помещаю их в свой собственный модуль, поэтому он не загрязняет пространство имен пользователя. например
В Qt4.py:
От Pyqt4.qtcore Импорт * из PYQT4.QTGUI Импорт *
Тогда используйте это так
Импорт qt4 app = qt4.qapplication (...)
Импорт для PYQT4 - это особый случай.
Иногда я выберу «первый вариант» для быстрой и грязного кодирования и поверните его на «второй вариант», когда код растет дольше и дольше.
Столкновение пространства имен, может быть, не очень хорошая сделка, я не видел, что другие Package'name начинается с большого «Q». И всякий раз, когда я заканчиваю сценарий PYQT4. Конвертировать "из pyqt4.qtgui" Импорт * "на sth. подобно "
from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
QVBoxLayout)
"Просто FYI, скобки для многострочного импорта здесь удобно.
Я слишком абсолютно против import *
в общем случае. На случай, если PySide2
, Один из редких исключений применяется:
from PySide2 import *
это шаблон для импорта всех известных модулей из PySide2
. Отказ Этот импорт очень удобный, потому что импорт всегда правильный. Константа вычисляется из CMAKE
генератор. Очень полезно, когда быстро попробовать что-то в интерактивной консоли, но и в автоматизированном тестировании.
Для расширенного использования, это также имеет смысл использовать PySide2.__all__
Переменная напрямую, которая реализует эту функцию. Элементы PySide2.__all__
заказывается зависимостью, поэтому сначала приходит QtCore
, тогда QtGui
, QtWidgets
, ... и так далее.