2008-10-09 5 views
7

Я видел, что некоторые программисты Python использовать следующий стиль довольно последовательно (мы будем называть его стиль 1):'из X import a' versus 'import X; X.a»

import some_module 
# Use some_module.some_identifier in various places. 

Для поддержки этого стиля можно привести "explicit is better than implicit" изречение. Я видел другие программисты используют этот стиль (стиль 2):

from some_module import some_identifier 
# Use some_identifier in various places. 

Основное преимущество, что я вижу в стиле 2 является ремонтопригодность - особенно с duck typing идеалами я могу поменять местами some_module для some_other_module. Я также чувствую, что стиль 2 выигрывает очки с максимумом "readability counts". Хотя я склонен не соглашаться, можно всегда утверждать, что поиск и замена - это тоже хороший вариант при использовании первого стиля.

Добавление: Было отмечено, что вы могли бы использовать as решить переход от some_module к some_other_module в стиле 1. Я забыл упомянуть, что это также общее принять решение о реализации some_identifier в вашем текущего модуля, делает создание эквивалентного контейнера some_module немного неудобным.

ответ

4

Есть использует для обоих случаев, так что я не думаю, что это либо или вопрос , я бы рассмотреть возможность использования от модуля import x,y,z когда:

  • Есть довольно небольшое количество вещей, чтобы импортировать

  • Цели функций ввезенных очевидны, когда отрываются от имени модуля. Если имена довольно общие, они могут столкнуться с другими и рассказать вам немного. например. видя remove мало говорит, но os.remove, вероятно, намекает, что вы имеете дело с файлами.

  • Имена не конфликтуют. Как и выше, но более важно. Никогда сделать что-то вроде:

    from os import open 
    

import module [as renamed_module] имеет то преимущество, что она дает немного больше контекста о том, что вызывается, когда вы его используете. Недостаток заключается в том, что этот бит немного загроможден, когда модуль действительно не дает больше информации и немного менее эффективен (2 поиска вместо 1).

Он также имеет преимущества при тестировании (например, замена os.открыть с помощью mock-объекта без необходимости изменять каждый модуль) и должен использоваться при использовании изменяемых модулей, например.

import config 
config.dburl = 'sqlite:///test.db' 

Если у вас есть сомнения, я всегда буду придерживаться стиля import module.

5

С существованием следующий синтаксис:

import some_other_module as some_module 

ремонтопригодность аргумент стиля 2 уже не актуально.

Я обычно использую стиль 1. Обычно я обнаруживаю, что я явно ссылаюсь на импортированное имя пакета только несколько раз в типичной программе Python. Все остальное - это методы на объекте, которые, конечно, не требуют ссылки на импортированный пакет.

2

Обычно я использую порог, чтобы решить это. Если я хочу использовать много вещей в some_module, я буду использовать:

import some_module as sm 
x = sm.whatever 

Если есть только одна или две вещи, мне нужно:

from some_module import whatever 
x = whatever 

Это предполагает, что я не нужен whatever от some_other_module, конечно.

Я склонен использовать предложение as на импорт, чтобы я мог уменьшить свою типизацию и подставить другой модуль довольно легко в будущем.

0

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

import some_other_module as some_module 

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

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

1

Я считаю, что обозначение

from some_module import some_symbol 

лучше всего работает в большинстве случаев.Кроме того, в случае конфликта имен для символа, вы можете использовать:

from some_module import some_symbol as other_symbol 

Поскольку вопрос государств, это позволяет избежать перезаписи имя модуля все время, каждый раз с риском опечаток его. Я использую следующий синтаксис:

import module [as other_module] 

только в двух случаях:

  1. я использую слишком много функций модулей/объектов импортировать их всех
  2. модуля определяет некоторый символ, который может меняться во время выполнения
2

Я предпочитаю import X, а затем используйте X.a как можно больше.

Мои исключительные центры на глубоко вложенных модулях в большой структуре, такой как Django. Их имена модулей имеют тенденцию становиться длинными, и их примеры говорят from django.conf import settings, чтобы вы не печатали django.conf.settings.DEBUG.

Если имя модуля глубоко вложено, исключение - использовать from X.Y.Z import a.

0

лично я стараюсь не связываться слишком много с моим пространством имен, так что в большинстве случаев я просто

import module 

или импорт модуль, как моды

Только реальные разностный когда у меня есть модуль с один класс, который используется много. Если бы я sublclassed тип list, чтобы добавить некоторые funcionality там, я бы использовал

from SuperImprovedListOverloadedWithFeatures import NewLIst 
nl = NewList() 

т.д.

0

Я предпочитаю использовать только несколько членов каждого модуля, так что есть много

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) 

(я мог бы использовать from wave import open as wave_open, но я полагаю, что wave.open будет более знакомы читателю.

Смежные вопросы