Никто не использует функцию tee () под itertools?
http://docs.python.org/2/library/itertools.html#itertools.tee
>>> import itertools
>>> itertools.tee([1,2,3,4,5,6],3)
(, , )
Это разделит список на 3 итератора, цикл итератор получит подсписок равной длины
import
- это все об именах - в основном «голых именах», которые связаны на верхнем уровне (глобальный уровень AKA, имена уровня модуля AKA) в определенном модуле, скажем mod2
. Когда вы выполнили import mod2
, вы получите пространство имен mod2
как доступное имя (верхний уровень в вашем собственном модуле, если вы выполняете import
] как верхний уровень, что является наиболее распространенным, но локальный импорт
внутри функции сделает mod2
локальной переменной этой функции и т. д.); и поэтому вы можете использовать mod2.foobar
для доступа к имени foobar
, которое привязано к верхнему уровню в mod2
. Если вам не нужен доступ к таким именам, тогда вам не нужно импортировать mod2
в свой собственный модуль.
В этом случае вы правы: show_answer () дается объект, для которого он вызывает метод "answer". Пока объект, переданный в show_answer (), имеет такой метод, не имеет значения, откуда берется объект.
Однако если вы хотите создать экземпляр Universe внутри mod2, вам придется импортировать mod1, потому что Universe не находится в пространстве имен mod2, даже после того, как mod2 был импортирован mod1.
Представьте, что импорт больше похож на компоновщик.
С помощью "import mod2" вы просто говорите python, что он может найти функцию в файле mod2.py
На самом деле, в этом случае импорт mod1
в mod2.py
должен не работать.
Разве это не создаст круговую ссылку?
импорт в Python загружает модуль в заданное пространство имен. Таким образом, это как если бы def show_answer действительно существовал в модуле mod1.py. По этой причине mod2.py не нужно знать класс Universe, и поэтому вам не нужно импортировать mod1 из mod2.py.
Я мало что знаю о 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
и т. на ..)
Фактически, согласно это объяснение , круговой import
не будет работать так, как вы хотите: если вы раскомментируете import mod1
, второй модуль все равно не узнает о Вселенной
.
Думаю, это вполне разумно. Если оба ваших файла нуждаются в доступе к определенному типу объекта, например Universe
, у вас есть несколько вариантов:
Universe
, возможно, передача объекта еще неизвестного типа в show_answer
нормально Universe
в отдельный модуль и сначала загрузите его.