Python - когда 'импорт' требуется?

Никто не использует функцию tee () под itertools?

http://docs.python.org/2/library/itertools.html#itertools.tee

>>> import itertools
>>> itertools.tee([1,2,3,4,5,6],3)
(, , )

Это разделит список на 3 итератора, цикл итератор получит подсписок равной длины

5
задан Steve Folly 22 June 2009 в 17:46
поделиться

7 ответов

import - это все об именах - в основном «голых именах», которые связаны на верхнем уровне (глобальный уровень AKA, имена уровня модуля AKA) в определенном модуле, скажем mod2 . Когда вы выполнили import mod2 , вы получите пространство имен mod2 как доступное имя (верхний уровень в вашем собственном модуле, если вы выполняете import ] как верхний уровень, что является наиболее распространенным, но локальный импорт внутри функции сделает mod2 локальной переменной этой функции и т. д.); и поэтому вы можете использовать mod2.foobar для доступа к имени foobar , которое привязано к верхнему уровню в mod2 . Если вам не нужен доступ к таким именам, тогда вам не нужно импортировать mod2 в свой собственный модуль.

4
ответ дан 18 December 2019 в 12:01
поделиться

В этом случае вы правы: show_answer () дается объект, для которого он вызывает метод "answer". Пока объект, переданный в show_answer (), имеет такой метод, не имеет значения, откуда берется объект.

Однако если вы хотите создать экземпляр Universe внутри mod2, вам придется импортировать mod1, потому что Universe не находится в пространстве имен mod2, даже после того, как mod2 был импортирован mod1.

6
ответ дан 18 December 2019 в 12:01
поделиться

Представьте, что импорт больше похож на компоновщик.
С помощью "import mod2" вы просто говорите python, что он может найти функцию в файле mod2.py

1
ответ дан 18 December 2019 в 12:01
поделиться

На самом деле, в этом случае импорт mod1 в mod2.py должен не работать.
Разве это не создаст круговую ссылку?

1
ответ дан 18 December 2019 в 12:01
поделиться

импорт в Python загружает модуль в заданное пространство имен. Таким образом, это как если бы def show_answer действительно существовал в модуле mod1.py. По этой причине mod2.py не нужно знать класс Universe, и поэтому вам не нужно импортировать mod1 из mod2.py.

1
ответ дан 18 December 2019 в 12:01
поделиться

Я мало что знаю о C ++, поэтому не могу напрямую сравнить его, но ..

import в основном загружает другой скрипт Python ( mod2.py ) в текущий скрипт (верхний уровень mod1.py ). Это не столько ссылка, сколько похоже на eval

. Например, в псевдокоде Python:

eval("mod2.py")

то же самое, что и ..

from mod2 import *

.. он выполняет mod2.py, и делает функции / классы, определенные в текущем скрипте, доступными.

Оба приведенных выше фрагмента позволят вам вызвать show_answer () (ну, eval работает не совсем так, поэтому я назвал его псевдокодом !)

import mod2

.. в основном то же самое, но вместо того, чтобы переносить все функции на «верхний уровень», он переносит их в модуль mod2, поэтому вы вызываете show_answer , выполняя ..

mod2.show_answer

Прав ли я, думая, что [импорт в mod2.py] не нужен?

Абсолютно. Фактически, если вы попытаетесь импортировать mod1 из mod2 , вы получите циклическую ошибку зависимости (поскольку mod2 затем пытается импортировать mod1 и т. на ..)

1
ответ дан 18 December 2019 в 12:01
поделиться

Фактически, согласно это объяснение , круговой import не будет работать так, как вы хотите: если вы раскомментируете import mod1 , второй модуль все равно не узнает о Вселенной .

Думаю, это вполне разумно. Если оба ваших файла нуждаются в доступе к определенному типу объекта, например Universe , у вас есть несколько вариантов:

  • если ваша программа небольшая, просто используйте один файл
  • , если он большой, вы необходимо решить, нужно ли обоим файлам знать, как реализована Universe , возможно, передача объекта еще неизвестного типа в show_answer нормально
  • , если это не так работать на вас, непременно поместите Universe в отдельный модуль и сначала загрузите его.
1
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

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