什么是

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文件应该非常薄以避免违反“显式优于隐式”的哲学。

链接地址: http://www.djcxy.com/p/1605.html

上一篇: What is

下一篇: In Python what is a global statement?