«из X импортировать a» против «импортировать X»;X.a'
-
06-07-2019 - |
Вопрос
Я видел, как некоторые программисты Python довольно последовательно использовали следующий стиль (мы назовем его стилем 1):
import some_module
# Use some_module.some_identifier in various places.
В поддержку этого стиля можно привести «явное лучше неявного» Максим.Я видел, как другие программисты использовали этот стиль (стиль 2):
from some_module import some_identifier
# Use some_identifier in various places.
Основное преимущество, которое я вижу в стиле 2, — это удобство обслуживания, особенно при утка печатает В идеалах я, возможно, захочу заменить some_module на some_other_module.Я также чувствую, что стиль 2 приносит очки с «читабельность имеет значение» Максим.Хотя я склонен не согласиться, всегда можно возразить, что поиск и замена — такой же хороший вариант при использовании первого стиля.
Приложение: Было отмечено, что вы можете использовать as
решить проблему перехода с some_module
к some_other_module
в стиле 1.Я забыл упомянуть, что также принято решение реализовать some_identifier
в вашей текущий модуль, который делает создание эквивалента some_module
контейнер немного неудобный.
Решение
В обоих случаях есть применение, поэтому я не думаю, что это проблема «или-или».Я бы рассмотрел возможность использования модуля import x,y,z
когда:
Есть довольно небольшое количество вещей для импорта.
Назначение импортируемых функций становится очевидным, если отделить их от имени модуля.Если имена довольно общие, они могут противоречить другим и мало что вам сказать.например.видя
remove
мало что вам скажет, ноos.remove
вероятно, намекнет, что вы имеете дело с файлами.Названия не конфликтуют.Аналогично предыдущему, но более важно. Никогда сделайте что-то вроде:
from os import open
import module [as renamed_module]
имеет то преимущество, что дает немного больше контекста о том, что вызывается, когда вы его используете.Его недостатком является то, что он немного более загроможден, когда модуль на самом деле не предоставляет больше информации, и немного менее эффективен (2 поиска вместо 1).
Однако он также имеет преимущества при тестировании (например.замена os.open макетным объектом без необходимости изменения каждого модуля), и его следует использовать при использовании изменяемых модулей, например.
import config
config.dburl = 'sqlite:///test.db'
Если есть сомнения, я бы всегда выбрал import module
стиль.
Другие советы
При наличии следующего синтаксиса:
import some_other_module as some_module
аргумент ремонтопригодности стиля 2 больше не актуален.
Я склонен использовать стиль 1. Обычно я нахожу, что я явно ссылаюсь на имя импортированного пакета только несколько раз в типичной программе на Python. Все остальное - это методы объекта, которые, конечно, не должны ссылаться на импортированный пакет.
Я обычно использую порог, чтобы решить это. Если я хочу использовать много вещей в some_module
, я буду использовать:
import some_module as sm
x = sm.whatever
Если мне нужна только одна или две вещи:
from some_module import whatever
x = whatever
Это предполагает, что мне, конечно, не нужно что-либо
из some_other_module
.
Я склонен использовать предложение as
при импорте, чтобы в будущем можно было легко сократить количество набираемых тегов и заменить другой модуль.
Я предпочитаю импортировать X
, а затем максимально использовать X.a
.
Мое исключение сосредоточено на глубоко вложенных модулях в такой большой среде, как Django. Их имена модулей имеют тенденцию становиться длинными, и все их примеры говорят из настроек импорта django.conf
, чтобы вы не вводили django.conf.settings.DEBUG
везде.
Если имя модуля глубоко вложено, исключение составляет использование из X.Y.Z import a
.
Я считаю, что запись
from some_module import some_symbol
работает лучше всего в большинстве случаев. Кроме того, в случае столкновения имени для символа, вы можете использовать:
from some_module import some_symbol as other_symbol
Как говорится в вопросе, он избегает перезаписи имени модуля все время, каждый раз с риском его опечатки. Я использую синтаксис:
import module [as other_module]
Только в двух случаях:
<Ол>Лично я стараюсь не слишком сильно возиться со своим пространством имен, поэтому в большинстве ситуаций я просто делаю это.
import module
или модуль импорта как мод
Единственная реальная разница заключается в том, что у меня есть модуль с одним классом, который часто используется.Если бы я подклассифицировал list
введите, чтобы добавить туда немного функциональности, я бы использовал
from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()
и т. д.
Я склонен использовать только несколько членов каждого модуля, поэтому есть много
from john import cleese
from terry import jones, gilliam
в моем коде. Я импортирую целые модули (такие как os
или wx
), если я ожидаю использовать большую часть модуля, а имя модуля короткое. Я также импортирую целые модули, если есть конфликт имен или я хочу напомнить читателю, с чем связана эта функция.
import michael
import sarah
import wave
gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)
(Я мог бы использовать из импорта волн open как wave_open
, но я уверен, что wave.open
будет более знакомым для читателя.
Вас может заинтересовать вопрос переполнения стека Почему «import x; xy» ведет себя не так, как «x import y», и первый сбой, когда пакет x. init не завершен? .
Я верю в новые версии Python (2.5+? должны проверить мои факты ...), которые вы можете даже сделать:
import some_other_module as some_module
Таким образом, вы все равно можете перейти со стилем 1 и позже поменять другой модуль.
Я думаю, что это в целом соответствует тому, насколько сильно вы хотите загромождать пространство имен. Вы просто будете использовать одно или два имени в модуле? Или все они ( from x import *
не всегда плохи, просто в целом)?