gpt4 book ai didi

python - 导入包时出现意外行为

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:24 24 4
gpt4 key购买 nike

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

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

具有以下源代码:

pkgimg/__init__.py:

import pkgimg.testing

pkgimg/testing/__init__.py:

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

pkgimg/testing/mod_a.py:

a = 123

pkgimg/testing/mod_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_amod_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。这正是我所期望的。

最佳答案

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

所以在导入pkgimp.testing.mod_b来自任何其他模块mod_b名称添加到 pkgimp.testing 。这是正常行为。

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

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

关于python - 导入包时出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22462064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com