什么是
Python源代码目录中的__init__.py
是什么?
这是一个包的一部分。 这里是文档。
需要__init__.py
文件才能使Python将目录视为包含包; 这是为了防止具有通用名称的目录(例如string
)无意中隐藏模块搜索路径中稍后(更深)发生的有效模块。 在最简单的情况下, __init__.py
可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__
变量,稍后介绍。
名为__init__.py
文件用于将磁盘上的目录标记为Python包目录。 如果你有这些文件
mydir/spam/__init__.py
mydir/spam/module.py
并且mydir
在你的路径上,你可以将module.py
的代码导入为
import spam.module
要么
from spam import module
如果删除__init__.py
文件,Python将不再在该目录内查找子模块,因此尝试导入模块将失败。
__init__.py
文件通常为空,但可用于以更方便的名称导出程序包的选定部分,保存便利功能等。以上示例中,init模块的内容可作为
import spam
基于此
除了将目录标记为Python包并定义__all__
, __init__.py
允许您在包级别定义任何变量。 这样做通常很方便,如果一个包定义了一些经常导入的东西,就像API一样。 这种模式促进了对Pythonic的坚持“扁平优于嵌套”的理念。
一个例子
下面是从我的项目,我在其中频繁导入的一个例子sessionmaker
称为Session
与我的数据库进行交互。 我用几个模块编写了一个“数据库”包:
database/
__init__.py
schema.py
insertions.py
queries.py
我的__init__.py
包含以下代码:
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
由于我在这里定义Session
,我可以使用下面的语法开始一个新的会话。 这段代码将从“数据库”包目录内部或外部执行。
from database import Session
session = Session()
当然,这只是一个小小的方便 - 另一种方法是在我的数据库包中的一个新文件(如“create_session.py”)中定义Session
,然后使用以下命令启动新会话:
from database.create_session import Session
session = Session()
进一步阅读
有一个非常有趣的reddit线程覆盖了__init__.py
适当使用:
http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/
多数意见似乎是__init__.py
文件应该非常薄以避免违反“显式优于隐式”的哲学。
上一篇: What is