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

news/2025/1/11 2:00:44/

项目结构下每个包的__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 文件的内容可以根据包的需求进行定制。

  • 简单的包初始化

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


http://www.ppmy.cn/news/1562123.html

相关文章

如何限制大量请求并发

前言: 1、主流浏览器在 HTTP/1.1 下对同一域名的最大并发请求数通常是 6~8 个。超过限制的请求会进入队列,等待空闲的连接。 2、可以利用Promise模拟任务队列,控制并发请求数量,以避免对服务器造成过大的压力。(先进先…

Win11+WSL2+Ubuntu24.04安装Genesis并实现正常运行

什么是Genesis Genesis是一款由卡内基梅隆大学、马里兰大学、斯坦福大学、麻省理工学院等全球顶尖研究机构联合开发的开源生成式物理引擎。于2024年12月19日正式开源。它专为机器人、嵌入式 AI 和物理 AI 应用设计,能够模拟各种物理现象(如刚体、液体、…

识日 1.2.8 | 完全免费的日语学习软件,小清新风格

识日是一款免费的日语学习软件,界面简洁美观,支持主题色设置。它提供了日语50音学习、单词查询、日语词典等功能,并有详细的发音和笔画展示。用户可以通过多种模式背单词,如快速模式、洗脑模式(重复朗读单词&#xff0…

REVERSE-COMPETITION-CCSSSC-2025

REVERSE-COMPETITION-CCSSSC-2025 donntyouseeHappyLockkernel_traffic donntyousee elf64,ida反编译不太行,有花指令,直接调汇编 读输入 读输入前有条打印”plz input your flag”,肯定是在.init_array,确实有很多 …

vulhub-deathnote靶场实战

扫描靶机地址 访问网址访问不到,扫描端口 namp -sS -sV -T5 -A -p- 192.168.249.128 目录扫描: dirsearch -u 192.168.8.6 -i 200 gobuster gobuster dir -u http://192.168.8.6 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x …

AI赋能金融服务:效率与安全的新高度

引言 金融服务行业正经历着前所未有的变革。日益增长的客户需求、日趋复杂的金融产品以及日益严峻的监管环境,都对金融机构提出了更高的要求。它们面临着提升效率、有效管控安全风险以及优化用户体验等诸多挑战。传统的人工操作模式已难以满足快速发展的市场需求。…

『SQLite』SELECT语句查询数据

通过 SQLite 的 SELECT 语法从指定数据库表中查询数据。 查询数据 SELECT 语句查询数据。 查询案例 sqlite_master 表简介 该表是 SQLite 数据库用于存储创建表、索引等的一张表。 注意 上述内容详讲见文章:SQLite 的 SELECT 操作(内含案例&#xff…

GAN的应用

5、GAN的应用 ​ GANs是一个强大的生成模型,它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布,也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…