Python导入是confusing,但我认为我最终理解了它们,直到我偶然发现了这种行为(在3.9.1中)。这里发生了什么
以这个包结构为例:
countries/
├── __init__.py # from . import greece
├── greece.py
└── spain.py
如果我执行import countries
,则命名空间dir(countries)
只包含greece
,如预期的那样
但如果我以以下内容开始我的课程:
from countries import spain
import countries
命名空间dir(countries)
同时包含greece
和spain
我知道__init__.py
在我进行第一次导入时是在后台运行的。我不明白的是python如何记住在countries
名称空间中同时包含greece
和spain
。它是否在运行from countries import spain
之后将countries
名称空间保存在引擎盖下的某个地方,然后运行import countries
只是将其添加到本地名称空间
你说得对。导入模块时,python会将其保存在导入模块的列表中。当您
from countries import spain
然后导入根时,python知道spain
是父countries
的子模块。因此,当您import countries
时,它只是将不需要的子模块添加到父模块中请参见此处了解实际逻辑:https://github.com/python/cpython/blob/f32c7950e0077b6d9a8e217c2796fc582f18ca08/Lib/importlib/_bootstrap.py#L1007
相关问题 更多 >
编程相关推荐