繁体   English   中英

在 __init__.py 中导入

[英]Imports in __init__.py

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

a
├── b.py
└── __init__.py

情况1

  • 文件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创建。

Python 3导入系统文档

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

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

import语句将模块引入作用域。 您导入了b ,所以它是一个模块对象。

阅读import文档:

基本的导入语句(无 from 子句)分两步执行:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM