Подмодуль импорта основного модуля - PullRequest
5 голосов
/ 21 сентября 2011

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

Ситуация следующая: В папке mod у меня есть файлы __init__.py и sub.py. Они содержат следующие данные: __init__.py

print "mod"

sub.py:

import __init__
print "sub"

Теперь давайте сделаем следующее:

>>> import mod
mod
>>> import mod.sub
mod
sub

Но при выполнении import mod.sub, почему mod/__init__.py выполняется снова? Он был уже импортирован. Та же странная особенность существует, если мы просто позвоним:

>>> import mod.sub
mod
mod
sub

Могу ли я изменить поведение, изменив import __init__? Эта линия, скорее всего, кажется мне неправильной.

Ответы [ 3 ]

7 голосов
/ 21 сентября 2011

Вы можете проверить, что происходит, используя словарь sys.modules.Python решает перезагрузить модуль в зависимости от ключей в этом словаре.

Когда вы запускаете import mod, он создает одну запись, mod в sys.modules.

Когда вы запускаете import mod.sub, после вызова import __init__ Python проверяет, находится ли ключ mod.__init__ в sys.modules, но такого ключа нет, поэтому он снова импортируется.

Суть в том, что Pythonрешает повторно импортировать модуль по ключам, присутствующим в sys.modules, а не потому, что фактический модуль уже был импортирован.

1 голос
/ 21 сентября 2011

вы должны заменить

import __init__

на

import mod
0 голосов
/ 21 сентября 2011

Для полноты я нашел другое решение, играющее с относительным импортом:

Заменить

import __init__

на

from . import __init__

Но я не понимаю, почемуработает.

edit: это на самом деле не работает.результирующий __init__ - это не модуль mod, а что-то еще типа method-wrapper.Теперь я в полном замешательстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...