Я использую 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.
На данный момент я не знаю, какой из них я делаю в своем проекте, хотя последний кажется самым болезненным с моей точки зрения. Каковы общие практики здесь? Есть ли техническая причина использовать один стиль над другим?
Ответ на заголовок вашего вопроса «да»: я рекомендую никогда не использовать from ... import *
, и я обсуждал причины в другом очень недавнем ответе. Вкратце, полные имена — это хорошо, bar-имена очень ограничены, поэтому «третий вариант» является оптимальным (поскольку вы будете использовать полные имена, а не bar-имена) среди тех, кого вы представляете.
(Преимущества квалифицированных имен по сравнению с именами barenames включают простоту подделки/насмешки в целях тестирования, сведенный к нулю риск незамеченных ошибок, вызванных случайной повторной привязкой, возможность «полуподделки» верхнего имени в «классе трассировки» для цель регистрации именно того, что вы используете, и облегчения таких действий, как профилирование и т. д. - недостатков почти нет... см. также последний, но не менее важный коан в Zen of Python, import this
в интерактивном интерпретаторе).
Не менее хорошо, если вы пожалеете 7 дополнительных символов, чтобы сказать QtCore.whatever
, сокращая -- из PyQt4 импортировать QtCore как Cr
и из PyQt4 импортировать QtGi как Gu
(затем используйте Cr.blah
и Gu.zorp
) или подобные. Как и все сокращения, это стиль компромисса между краткостью и ясностью (вы бы предпочли назвать переменную count_of_all_widgets_in_the_inventory
, num_widgets
или x
? лучше, но не всегда ;-).
Кстати, я бы не стал использовать более одного предложения as
в одном операторе from
или import
(может быть запутанным), я бы предпочел несколько операторов (также легче отлаживать, если какой-либо импорт вызывает проблемы, редактировать, если вы измените свой импорт в будущем, ...).
Python doc говорит:
Хотя некоторые модули предназначены для экспорта только имен, соответствующих определенным шаблонам при использовании import *, это по-прежнему считается плохой практикой в производственном коде.
Это может иметь побочные эффекты и быть очень трудным для отладки.
Лично я использую import
, а не from import
, потому что я нахожу ужасно большие объявления в начале файл, и я думаю, что это делает код более читаемым.
import PyQt4
PyQt4.QtCore
Если имя модуля слишком длинное и может быть локально переименовано с помощью ключевого слова as
. Например:
import PyQt4.QtCore as Qc
Надеюсь, это поможет
Есть также хорошие случаи для импорта *
. т.е. разработчики Django обычно имеют много файлов конфигурации и связывают их с помощью import *:
settings.py:
FOO = 1
BAR = 2
DEBUG = False
test_settings.py:
from settings import *
DEBUG = True
В этом случае большинство недостатков import *
становятся преимуществами.