导入__init__.py

时间:2016-03-16 12:32:25

标签: python

这是我的项目结构(Python 3.5.1。):

a
├── b.py
└── __init__.py
<案例1
  • 档案b.py为空。

  • 档案__init__.py是:

    print(b)
    

如果我们运行import a,则输出为:

NameError: name 'b' is not defined
<案例2
  • 档案b.py为空。

  • 档案__init__.py是:

    import a.b
    print(b)
    

如果我们运行import a,则输出为:

<module 'a.b' from '/tmp/a/b.py'>

问题

为什么程序2中的程序失败?

通常,如果我们运行import a.b,那么我们只能通过a.b引用它,而不是b。希望有人可以帮助解释案例2中命名空间发生的事情。

2 个答案:

答案 0 :(得分:3)

Python在导入后将模块作为全局变量添加到父包中。

因此,当您导入a.b时,名称b已作为全局添加到由a创建的a/__init__.py模块中。

来自Python 3 import system documentation

  

当使用任何机制(例如importlib API,import或import-from语句或内置__import__())加载子模块时,绑定将放置在父模块的命名空间中,并附加到子模块对象即可。例如,如果包spam具有子模块foo,则在导入spam.foo后,spam将具有绑定到子模块的属性foo

大胆强调我的。请注意,这同样适用于Python 2,但Python 3使该过程更加明确。

答案 1 :(得分:-1)

import语句将模块带入范围。您导入了b,因此它是一个模块对象。

阅读import的文档:

  

基本的import语句(no from子句)分两步执行:

     
      
  • 找到一个模块,必要时加载并初始化
  •   
  • 在本地命名空间中为import语句的范围定义一个或多个名称。
  •   

在第一种情况下,您没有导入b