Python 导入到_uinit_uuu.py中
这是我的项目结构(Python 3.5.1.): 案例1Python 导入到_uinit_uuu.py中,python,Python,这是我的项目结构(Python 3.5.1.): 案例1 文件b.py为空 文件\uuuu init\uuuu.py是: print(b) import a.b print(b) 如果我们运行导入,则输出为: NameError: name 'b' is not defined <module 'a.b' from '/tmp/a/b.py'> 案例2 文件b.py为空 文件\uuuu init\uuuu.py是: print(b) import a.b print
- 文件
为空b.py
- 文件
是:\uuuu init\uuuu.py
print(b)
import a.b print(b)
导入
,则输出为:
NameError: name 'b' is not defined
<module 'a.b' from '/tmp/a/b.py'>
案例2
- 文件
为空b.py
- 文件
是:\uuuu init\uuuu.py
print(b)
import a.b print(b)
导入
,则输出为:
NameError: name 'b' is not defined
<module 'a.b' from '/tmp/a/b.py'>
问题:
为什么程序在案例2中没有失败
通常,如果我们运行
import a.b
,那么我们只能通过a.b
引用它,而不能通过b
引用它。希望有人能帮助解释案例2中的名称空间发生了什么。一个import
语句将模块引入范围。您导入了b
,因此它就是一个模块对象
请阅读以下文档:
基本导入语句(no from子句)分两步执行:
- 查找模块,必要时加载并初始化它
- 在本地命名空间中为发生import语句的作用域定义一个或多个名称
在第一种情况下,您没有导入
b
。Python在导入后将模块作为全局变量添加到父包中
因此,当您导入a.b
时,名称b
作为全局名称添加到a
模块中,该模块由a/\uu init\uuuuuuuuuuupy
创建
从:
当使用任何机制加载子模块时(例如importlib API、import或import from语句或内置的\uuuu import\uuuu()
),会在父模块的命名空间中放置一个到子模块对象的绑定。例如,如果包spam
具有子模块foo
,则导入spam.foo
后,spam
将具有绑定到子模块的属性foo
我的。请注意,这同样适用于Python2,但Python3使过程更加明确。我认为这可能是因为
b
通过import a.b
语句引入了a
的命名空间。但我不确定细节。我也不知道它是否是明确支持的功能。@shx2a
和b
<代码>a应该在那里。但是为什么b
也存在呢?我能猜到的最合乎逻辑的事情是:a
被引入当前范围,然后b
被引入a
的范围。但是当前范围与执行a/\uuu init\uuuu.py
时a的范围相同。需要确认。@shx2:是的,这就是问题的重点。为什么b
也在那里?它从未被明确导入<代码>导入a.b
通常只添加a
。如果案例1失败,我不会感到非常惊讶。如果运行导入a.b;在主脚本中打印(b)
,然后它将失败。但是在这里的案例2中它并没有失败。@BarryTheHatchet:import a.b
将名称a
绑定到命名空间中。这里的特殊之处在于b
是a
的子模块,因此导入内部组件在a
的命名空间中设置名称b
。这将导致一个全局b
,其中a
的名称空间,即\uuuu init\uuuuuuuuuuuuuuuupy
。如果这是任何其他模块,b
的名称就不会像这样出现。@BarryTheHatchet:换句话说,在第二种情况下,他们也没有导入b
,但还是添加了它。