【发布时间】:2021-05-22 15:41:19
【问题描述】:
假设有两个文件a.py 和b.py。里面有以下内容:
# a.py
from b import foo
foo()
# b.py
import os
def foo():
print(os.cwd())
这很好用,但为什么a.py 无法隐式看到b.py 的导入供自己使用:
# a.py
import b
def bar():
print(os.cpu_count()) # fails
b.foo()
bar()
# b.py
import os
def foo():
print(os.cwd())
我正在阅读 import system 文档,但无法弄清楚这一点。 os 导入存在于 b.py 的命名空间中,但它对 a.py 不可用,我不确定为什么。 globals() 方法是在模块级别,所以给定rules,模块之间是否没有共享导入(不使用__all__ 和* 导入)?每个模块都有自己的导入命名空间吗?
【问题讨论】:
-
os仅在b内部导入。这意味着os是该文件的本地文件。但是,因为您已经导入了b,所以您可以使用b.os访问os。除非您发出星型导入,例如:from b import *,否则它们将拥有自己的命名空间。 -
每个模块都有自己的命名空间句号。
import做了两件事:如果模块尚不存在,则将其拉入导入缓存中, 并 将引用(指向该缓存)添加到当前模块的__globals__(即当前模块的命名空间)。 -
@HampusLarsson, ...sure,
from os import *表示您没有从当前模块的命名空间中添加对os的引用(而是添加对os.__all__中每个元素的单独引用),但这并不意味着模块仍然有自己的命名空间,这就是我解释你最后一句话的方式。