项目结构下每个包的__init__.py 有什么作用
- 主要作用:
- 如何编写 `__init__.py` 文件
- 项目结构中的 `__init__.py` 文件示例
在 Python 项目中,
__init__.py
文件用于将一个目录标记为一个 Python 包。
主要作用:
-
包的初始化:
__init__.py
文件可以包含包初始化时需要执行的代码,比如导入子模块、设置配置参数等。 -
控制可见性:通过在
__init__.py
中显式导入模块或对象,可以控制包中哪些内容对外部可见。 -
组织代码:
__init__.py
文件可以作为包的入口点,用于组织和简化导入语句。 -
命名空间:在 Python 3.3+ 中,即使没有
__init__.py
文件,目录也可以是包,但使用__init__.py
可以明确地定义包的命名空间。
如何编写 __init__.py
文件
__init__.py
文件的内容可以根据包的需求进行定制。
-
简单的包初始化
python"># app/routers/__init__.py # 可以为空,仅用于标记这是一个包
-
导入包内的模块或对象
python"># app/routers/__init__.py from .items import router as items_router from .users import router as users_router# 现在,当你从 app.routers 导入时,可以直接访问 items_router 和 users_router
-
设置包级别的变量或配置
python"># app/utils/__init__.py import os# 设置一些配置变量 DATABASE_URI = os.environ.get("DATABASE_URI", "sqlite:///default.db") DEBUG = os.environ.get("DEBUG", "True") == "True"
-
定义包级别的函数或类
python"># app/crud/__init__.py from sqlalchemy.orm import Sessiondef get_db_session():# 这里可以是获取数据库会话的逻辑pass# 定义 CRUD 相关的函数 def create_item(db: Session, item: dict):# 创建项目的逻辑pass
-
使用
__all__
控制导出python"># app/routers/__init__.py from .items import router as items_router from .users import router as users_router__all__ = ["items_router", "users_router"]
这允许你控制从包中导入时哪些名称是可见的。
项目结构中的 __init__.py
文件示例
假设你有一个 FastAPI 项目,其结构如下:
fastapi_project/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── dependencies.py
│ ├── exceptions.py
│ ├── middlewares.py
│ ├── routers/
│ │ ├── __init__.py
│ │ ├── items.py
│ │ ├── users.py
│ │ └── ... (其他路由文件)
│ ├── schemas/
│ │ ├── __init__.py
│ │ ├── item.py
│ │ ├── user.py
│ │ └── ... (其他模型文件)
│ ├── crud/
│ │ ├── __init__.py
│ │ ├── item_crud.py
│ │ ├── user_crud.py
│ │ └── ... (其他 CRUD 文件)
│ └── utils/
│ ├── __init__.py
│ ├── utils.py
│ └── ... (其他工具文件)
└── requirements.txt
在这个结构中,每个包的 __init__.py
文件可以用于导入该包内的模块或对象,或者定义包级别的变量和函数。这样做可以使得项目的其他部分更容易地引用这些模块或对象,同时也保持了代码的组织性和可维护性。