导入包时出现意外行为

2024-10-02 00:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中遇到了一个意外的导入行为,我不明白。希望你能帮我澄清这种行为。假设项目结构如下:

.
└── pkgimp
    ├── __init__.py
    └── testing
        ├── __init__.py
        ├── mod_a.py
        └── mod_b.py

源代码如下:

pkgimg/\uuu init\uuuuu.py

import pkgimg.testing

打包/测试/\uu init\uuuuuu.py

from mod_a import a
from mod_b import b # <- no import of c

包装/测试/mod\u a.py

a = 123

包装/测试/mod\u b.py

b = "foo"
c = "bar" # <- not imported

当我用import pkgimp导入包并用dir(pkgimp.testing)打印加载的模块时,我看到了我没有导入的mod_amod_b模块

我得到的是:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'a', 'b', 'mod_a', 'mod_b']

我假设只有ab将被导入,而既不是mod_a也不是mod_b

此外,我还可以访问从未导入过的c

>>> pkgimp.testing.mod_b.c
'bar'

我知道,模块中的所有内容都将在导入时进行评估。但是,我想,使用from M import x只会给我x而不是整个模块的引用

例如,当我运行以下代码时:

>>> from pkgimp.testing.mod_b import b
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'b']

Python只导入b而不是模块mod_b。这是我所期望的


Tags: 模块namefrompyimportmodpackagedoc
1条回答
网友
1楼 · 发布于 2024-10-02 00:27:12

导入包中的模块后,总是作为包的属性添加

因此,当从任何其他模块导入pkgimp.testing.mod_b时,mod_b名称被添加到pkgimp.testing。这是正常的行为

在上一个示例中,您将模块中的特定名称导入到本地命名空间中。如果您要通过sys.modules['pkgimp.testing.mod_b']检查mod_b模块,您会发现c仍然定义在该对象上;整个模块被加载到内存中,对b的引用被添加到本地名称空间中

在这种情况下,sys.modules['pkgimp.testing']也将有一个mod_b属性,它是对pkgimp.testing.mod_b模块对象的引用

相关问题 更多 >

    热门问题