出人意料的智能python导入行为:引擎盖下发生了什么?

2024-06-01 06:42:24 发布

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

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)同时包含greecespain

我知道__init__.py在我进行第一次导入时是在后台运行的。我不明白的是python如何记住在countries名称空间中同时包含greecespain。它是否在运行from countries import spain之后将countries名称空间保存在引擎盖下的某个地方,然后运行import countries只是将其添加到本地名称空间


Tags: frompyimport名称initdir空间结构
1条回答
网友
1楼 · 发布于 2024-06-01 06:42:24

你说得对。导入模块时,python会将其保存在导入模块的列表中。当您from countries import spain然后导入根时,python知道spain是父countries的子模块。因此,当您import countries时,它只是将不需要的子模块添加到父模块中

请参见此处了解实际逻辑:https://github.com/python/cpython/blob/f32c7950e0077b6d9a8e217c2796fc582f18ca08/Lib/importlib/_bootstrap.py#L1007

相关问题 更多 >