子模块导入主模块

发布于 2024-12-05 22:51:40 字数 632 浏览 0 评论 0原文

首先,如果这个问题已经在其他地方被问过,我很抱歉。我真的搜索过,但没有找到任何东西。

情况如下: 在文件夹 mod 中,我有文件 __init__.pysub.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__ 来更改行为吗?在我看来,这句话最有可能是错误的。

First of all, my apologies if this question has already be asked elsewhere. I really searched for it, but didn't find anything.

The situation is the following:
In a folder mod, I have the files __init__.py and sub.py.
They contain the following data:
__init__.py:

print "mod"

sub.py:

import __init__
print "sub"

Now let's do the following:

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

But when doing import mod.sub, why is mod/__init__.py executed again? It had been imported already.
The same strange feature exists if we just call:

>>> import mod.sub
mod
mod
sub

Can I change the behaviour by changing the import __init__? This is the line that seems most likely wrong to me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱花坊 2024-12-12 22:51:40

您实际上可以使用字典 sys.modules 来检查正在发生的情况。 Python 根据字典中的键决定重新加载模块。

当您运行 import mod 时,它会在 sys.modules 中创建一个条目 mod

当您运行 import mod.sub 时,在调用 import __init__ 之后,Python 会检查键 mod.__init__ 是否在 sys 中.modules,但是没有这个键,所以再次导入。

最重要的是,Python 决定通过 sys.modules 中存在的键重新导入模块,而不是因为实际的模块已经导入。

You can actually inspect what is going on by using the dictionary sys.modules. Python decides to reload a module depending on the keys in that dictionary.

When you run import mod, it creates one entry, mod in sys.modules.

When you run import mod.sub, after the call to import __init__, Python checks whether the key mod.__init__ is in sys.modules, but there is no such key, so it is imported again.

The bottom line is that Python decides to re-import a module by keys present in sys.modules, not because the actual module had already been imported.

她比我温柔 2024-12-12 22:51:40

你应该替换

import __init__

import mod

you should replace

import __init__

by

import mod
伊面 2024-12-12 22:51:40

为了完整起见,我找到了另一个处理相对导入的解决方案:

替换

import __init__

from . import __init__

但我不明白为什么这有效。

编辑:这实际上不起作用。生成的__init__不是模块mod,而是method-wrapper类型的其他东西。现在我完全困惑了。

For completeness, I found another solution playing around with relative imports:

Replace

import __init__

by

from . import __init__

But I don't understand why this works.

edit: This actually doesn't work. the resulting__init__ is not the module mod, but something else of the type method-wrapper. Now I'm totally confused.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文