Вопрос

Я видел, как некоторые программисты 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 будет более знакомым для читателя.

    Я верю в новые версии Python (2.5+? должны проверить мои факты ...), которые вы можете даже сделать:

    import some_other_module as some_module
    

    Таким образом, вы все равно можете перейти со стилем 1 и позже поменять другой модуль.

    Я думаю, что это в целом соответствует тому, насколько сильно вы хотите загромождать пространство имен. Вы просто будете использовать одно или два имени в модуле? Или все они ( from x import * не всегда плохи, просто в целом)?

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top