跳到主要内容

项目结构

问题

Python 项目应该如何组织目录结构?

答案

src layout(推荐)

myproject/
├── src/
│ └── myapp/
│ ├── __init__.py
│ ├── main.py
│ ├── models/
│ ├── services/
│ ├── api/
│ └── utils/
├── tests/
│ ├── conftest.py
│ ├── test_models.py
│ └── test_services.py
├── pyproject.toml
├── uv.lock
├── Dockerfile
├── .github/
│ └── workflows/ci.yml
└── README.md

分层架构

src/myapp/
├── api/ # 路由层(Controller)
│ ├── __init__.py
│ ├── users.py
│ └── deps.py # 依赖注入
├── services/ # 业务逻辑层
│ └── user_service.py
├── repositories/ # 数据访问层
│ └── user_repo.py
├── models/ # 数据模型
│ ├── domain.py # 领域模型
│ └── schemas.py # Pydantic 模型
├── core/ # 核心配置
│ ├── config.py
│ └── database.py
└── main.py # 应用入口

配置管理

src/myapp/core/config.py
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
app_name: str = "MyApp"
debug: bool = False
database_url: str
redis_url: str = "redis://localhost"
secret_key: str

model_config = {"env_file": ".env"}

settings = Settings()

常见面试问题

Q1: src layout 和 flat layout 的区别?

答案

结构说明优点缺点
src layout代码在 src/防止未安装包被意外导入多一层目录
flat layout代码在根目录简单直接测试可能导入到未安装的本地包

Python 社区推荐 src layoutpyproject.toml 配置 [tool.setuptools.packages.find] where = ["src"]

Q2: conftest.py 的作用?

答案

pytest 自动加载 conftest.py 中的 fixture,无需导入。可以在不同目录放多个 conftest.py,内层覆盖外层。

相关链接