项目结构
问题
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 layout,pyproject.toml 配置 [tool.setuptools.packages.find] where = ["src"]。
Q2: conftest.py 的作用?
答案:
pytest 自动加载 conftest.py 中的 fixture,无需导入。可以在不同目录放多个 conftest.py,内层覆盖外层。