【python】项目结构下每个包的__init__.py 有什么作用

项目结构下每个包的__init__.py 有什么作用

      • 主要作用:
      • 如何编写 `__init__.py` 文件
      • 项目结构中的 `__init__.py` 文件示例

在 Python 项目中,__init__.py 文件用于将一个目录标记为一个 Python 包。

主要作用:

  1. 包的初始化__init__.py 文件可以包含包初始化时需要执行的代码,比如导入子模块、设置配置参数等。

  2. 控制可见性:通过在 __init__.py 中显式导入模块或对象,可以控制包中哪些内容对外部可见。

  3. 组织代码__init__.py 文件可以作为包的入口点,用于组织和简化导入语句。

  4. 命名空间:在 Python 3.3+ 中,即使没有 __init__.py 文件,目录也可以是包,但使用 __init__.py 可以明确地定义包的命名空间。

如何编写 __init__.py 文件

__init__.py 文件的内容可以根据包的需求进行定制。

  • 简单的包初始化

    # app/routers/__init__.py
    # 可以为空,仅用于标记这是一个包
    
  • 导入包内的模块或对象

    # app/routers/__init__.py
    from .items import router as items_router
    from .users import router as users_router
    
    # 现在,当你从 app.routers 导入时,可以直接访问 items_router 和 users_router
    
  • 设置包级别的变量或配置

    # app/utils/__init__.py
    import os
    
    # 设置一些配置变量
    DATABASE_URI = os.environ.get("DATABASE_URI", "sqlite:///default.db")
    DEBUG = os.environ.get("DEBUG", "True") == "True"
    
  • 定义包级别的函数或类

    # app/crud/__init__.py
    from sqlalchemy.orm import Session
    
    def get_db_session():
        # 这里可以是获取数据库会话的逻辑
        pass
    
    # 定义 CRUD 相关的函数
    def create_item(db: Session, item: dict):
        # 创建项目的逻辑
        pass
    
  • 使用 __all__ 控制导出

    # 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 文件可以用于导入该包内的模块或对象,或者定义包级别的变量和函数。这样做可以使得项目的其他部分更容易地引用这些模块或对象,同时也保持了代码的组织性和可维护性。

你可能感兴趣的:(python,python,fastapi,架构,设计规范)