假设我在 python 代码库中有以下连续行:
from foo import BAR # succeeds
log.info(f"{dir(BAR)=}") # succeeds
import foo.BAR # succeeds
log.info(f"{dir(foo.BAR)=}") # fails, AttributeError no field BAR in module foo
中间没有其他代码。如果我刻意想要创造这样的效果,我会怎么做呢?我知道这是可能的,因为我正在 Python 3.11 下运行的大型代码库中观察它,但我不知道如何进行。 python 导入系统的什么功能让这两种形式的导入有所不同? 似乎
import foo.BAR
的能力必须要求 foo.BAR
存在,我们甚至首先使用 from foo import BAR
确认它存在并记录 的字段BAR
。
foo/__init__.py
存在且为空。 foo/BAR.py
存在并包含顶级项目,例如函数和类。
foo.BAR
需要是 模块 才能使 import foo.BAR
工作。BAR
是 foo
的 attribute,则不会。例如:
# foo.py
BAR = 'baz'
您不能
import foo.BAR
以上。但是,您可以from foo import BAR
以上。