在Python中__init__.py文件的作用


在Python中__init__.py文件的作用

如果一个目录中包含这样一个文件,表示这是一个包,而不是一个普通的目录。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置all变量.

例如

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在这里定义,我可以使用下面的语法开始一个新的会话。此代码与“database”包目录内部或外部执行的代码相同。

from database import Session
session = Session()

当然,这是一个小便利 - 另一种方法是Session在我的数据库包中定义一个新文件,如“create_session.py”,并使用以下命令启动新会话:

from database.create_session import Session
session = Session()