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

Я использую 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.

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

48
задан CharlesB 25 February 2013 в 15:15
поделиться

3 ответа

Ответ на заголовок вашего вопроса «да»: я рекомендую никогда не использовать 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 (может быть запутанным), я бы предпочел несколько операторов (также легче отлаживать, если какой-либо импорт вызывает проблемы, редактировать, если вы измените свой импорт в будущем, ...).

49
ответ дан 26 November 2019 в 18:58
поделиться

Python doc говорит:

Хотя некоторые модули предназначены для экспорта только имен, соответствующих определенным шаблонам при использовании import *, это по-прежнему считается плохой практикой в ​​производственном коде.

Это может иметь побочные эффекты и быть очень трудным для отладки.

Лично я использую import, а не from import, потому что я нахожу ужасно большие объявления в начале файл, и я думаю, что это делает код более читаемым.

import PyQt4

PyQt4.QtCore

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

 import PyQt4.QtCore as Qc

Надеюсь, это поможет

3
ответ дан 26 November 2019 в 18:58
поделиться

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

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

test_settings.py:
from settings import *
DEBUG = True

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

14
ответ дан 26 November 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: