Skip to main content
 首页 » 编程设计

python之为什么 python 在导入 A.B.C 时将 'A' 放入全局命名空间

2025年05月04日13over140

我正在阅读有关 import 在 python 中如何工作的信息。

当我这样做时:

import A.B.C 
  1. A、A.B、A.B.C 放在 sys.modules 中。预期。
  2. A 的 __init__,A.B 的 __init__ 被执行。预期。

但令人惊讶的是:当我打印 globals() 时,只有 A 被放入命名空间,而 'A.B.C' 没有。我希望“A.B.C”在全局命名空间中。

这意味着,我可以访问 A 的 __init__ 中定义的 A.x。

为什么import是这样实现的?

请您参考如下方法:

只有objects/names 被放入全局命名空间。 A.B.C 不是有效名称。

在你上面的例子中,对象是 A 的模块对象,它的名字是 A 。

在这种特殊情况下,如果您这样做 -

dir(A) 

你会在其中看到 B ,这意味着它是模块对象 A 的一个属性。如果你这样做 -

hasattr(A,'B') 

它会返回 True。

同样,如果你这样做 - dir(A.B) ,你将能够在其中看到 C 和 C是 A.B 的属性。


一个非常简单的例子来说明这一点-

我的目录结构-

shared/ 
      __init__.py 
      pkg/ 
         __init__.py 
         b.py 

然后在代码中我做 -

>>> import shared.pkg.b 
>>> dir(shared) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'pkg'] 
>>> hasattr(shared,'pkg') 
True 
>>> 
>>> dir(shared.pkg) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'b'] 
>>> hasattr(shared.pkg,'b') 
True