[英]Imports in __init__.py
这是我的项目结构(Python 3.5.1。):
a
├── b.py
└── __init__.py
文件b.py
是空的。
文件__init__.py
是:
print(b)
如果我们运行import a
,输出是:
NameError: name 'b' is not defined
文件b.py
是空的。
文件__init__.py
是:
import ab print(b)
如果我们运行import a
,输出是:
<module 'a.b' from '/tmp/a/b.py'>
为什么程序在案例 2 中没有失败?
通常,如果我们运行import ab
那么我们只能通过ab
而不是b
来引用它。 希望有人可以帮助解释案例 2 中的命名空间发生了什么。
导入后,Python 将模块作为全局变量添加到父包中。
因此,当您导入ab
,名称b
作为全局添加到a
模块,由a/__init__.py
创建。
当使用任何机制(例如 importlib API、import 或 import-from 语句或内置
__import__()
)__import__()
子模块时,将在父模块的命名空间中放置一个绑定到子模块对象。 例如,如果包spam
有一个子模块foo
,在导入spam.foo
,spam
将有一个属性foo
绑定到子模块。
大胆强调我的。 请注意,这同样适用于 Python 2,但 Python 3 使该过程更加明确。
import
语句将模块引入作用域。 您导入了b
,所以它是一个模块对象。
阅读import
文档:
基本的导入语句(无 from 子句)分两步执行:
- 找到一个模块,必要时加载并初始化它
- 在本地命名空间中为发生 import 语句的范围定义一个或多个名称。
在第一种情况下您没有导入b
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.