mcpField
M
moai-lang-python

moai-lang-python

github.com/modu-ai开发1.2k75 次安装今天更新
代码仓库

关于 moai-lang-python

面向使用 Web 应用、异步代码和数据工具的开发者的 Python 3.13+ 技能,整合 FastAPI、Django、数据验证、ORM、测试与类型提示指导。

主要功能

  1. 01Python 3.13+ 语言特性
  2. 02FastAPI 和 Django 模式
  3. 03Pydantic 验证与 SQLAlchemy 异步用法
  4. 04pytest 夹具与参数化测试
  5. 05现代类型提示与包管理

适用场景

  1. 01构建异步 Web API
  2. 02验证应用数据
  3. 03编写异步和参数化测试
  4. 04管理 Python 项目依赖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/modu-ai/moai-adk --skill moai-lang-python

安装后在 Claude Code 中输入/moai-lang-python确认已加载。

附带文件references/examples.mdreferences/reference.md

详细介绍

快速参考(30 秒)

Python 3.13 及以上版本开发专家——FastAPI、Django、异步模式、pytest 和现代 Python 特性。

自动触发:扩展名为 .py 的 Python 文件、pyproject.toml、requirements.txt、pytest.ini,以及有关 FastAPI 或 Django 的讨论

核心能力:

  • Python 3.13 特性:通过 PEP 744 使用 JIT 编译器、通过 PEP 703 使用无 GIL 模式,以及使用 match 和 case 语句进行模式匹配
  • Web 框架:FastAPI 0.115 及更高版本、Django 5.2 LTS
  • 数据验证:Pydantic v2.9 的 model_validate 模式
  • ORM:SQLAlchemy 2.0 异步模式
  • 测试:使用 pytest 的夹具、异步测试和 parametrize 装饰器
  • 包管理:使用 pyproject.toml 的 poetry、uv、pip
  • 类型提示:Protocol、TypeVar、ParamSpec 和现代类型模式
  • 异步:asyncio、异步生成器和任务组
  • 数据科学:numpy、pandas 和 polars 基础知识
快速模式

FastAPI 端点模式:

从 fastapi 导入 FastAPI 和 Depends,并从 pydantic 导入 BaseModel。创建一个 FastAPI 应用实例。定义一个继承自 BaseModel 的 UserCreate 模型类,其中包含 name 和 email 字符串字段。在 users 路径创建一个异步 post 端点,接收一个 UserCreate 参数,并通过 await 调用 UserService.create 返回一个 User。

Pydantic v2.9 验证模式:

从 pydantic 导入 BaseModel 和 ConfigDict。定义一个继承自 BaseModel 的 User 类。使用 ConfigDict 设置 model_config,将 from_attributes 设为 True,并将 str_strip_whitespace 设为 True。添加 id 整数字段、name 字符串字段和 email 字符串字段。使用 model_validate 从 ORM 对象创建实例,使用 model_validate_json 从 JSON 数据创建实例。

pytest 异步测试模式:

导入 pytest,并使用 pytest.mark.asyncio 装饰器标记测试函数。创建一个异步测试函数,并将 async_client 作为夹具参数传入。向 users 端点发送 post 请求,并附带包含 name 字段的 JSON 请求体。断言响应的 status_code 等于 201。


实施指南(5 分钟)

Python 3.13 新特性

通过 PEP 744 使用 JIT 编译器:

  • 实验性功能,默认禁用
  • 将 PYTHON_JIT 环境变量设为 1 即可启用
  • 可通过 enable-experimental-jit 构建选项启用
  • 可提升 CPU 密集型代码的性能
  • 使用 copy-and-patch JIT,将专用字节码转换为机器码

通过 PEP 703 使用无 GIL 模式:

  • 可用的实验性自由线程构建版本为 python3.13t
  • 支持真正的线程并行执行
  • 可通过官方 Windows 和 macOS 安装程序获取
  • 最适用于 CPU 密集型多线程应用
  • 目前不建议用于生产环境

使用 match 和 case 进行模式匹配:

创建一个 process_response 函数,接收一个响应字典并返回一个字符串。对 response 使用 match 语句。对于包含 status 为 ok 且带有 data 字段的 case,返回包含该数据的成功消息。对于包含 status 为 error 且带有 message 字段的 case,返回错误消息。对于 status 匹配 pending 或 processing 且满足守卫条件的 case,返回进行中消息。对于使用下划线的默认 case,返回未知响应。

FastAPI 0.115+ 模式

异步依赖注入:

从 fastapi 导入 FastAPI、Depends,从 sqlalchemy.ext.asyncio 导入 AsyncSession,并从 contextlib 导入 asynccontextmanager。创建一个用 asynccontextmanager 装饰的 lifespan 异步上下文管理器,并让它接收 FastAPI 应用。在 lifespan 中,启动时调用 await init_db,然后 yield,最后在关闭时调用 await cleanup。创建 FastAPI 应用时传入 lifespan 参数。定义一个异步 get_db 函数,返回 AsyncSession 的 AsyncGenerator,并使用 async with 处理 async_session,然后 yield 该会话。创建一个用于获取用户的 get 端点,包含 user_id 路径参数,并使用 Depends 和 get_db 注入数据库会话。调用 await get_user_by_id,并用该用户返回 UserResponse.model_validate。

基于类的依赖:

创建一个 Paginator 类,其 init 方法接受 page(默认值为 1)和 size(默认值为 20)。将 self.page 设为 1 和 page 中的较大值,将 self.size 设为 100 和 1 与 size 中较大值的较小值,并将 self.offset 设为 page 减 1 后乘以 size。创建一个 list_items 端点,使用 Depends 注入 Paginator 以获取分页参数,并使用 get_page 和 offset、size 返回条目。

Django 5.2 LTS 特性

复合主键:

创建一个 OrderItem 模型,其中包含一个指向 Order、删除时使用 CASCADE 的 ForeignKey,一个指向 Product、删除时使用 CASCADE 的 ForeignKey,以及一个用于 quantity 的 IntegerField。在 Meta 类中,将 pk 设为包含 order 和 product 字段的 models.CompositePrimaryKey。

带查询参数的 URL 反向解析:

从 django.urls 导入 reverse。调用 reverse,传入搜索视图名称、包含 q 设为 django 且 page 设为 1 的查询字典,以及设为 results 的 fragment。结果是包含查询字符串和片段的搜索路径。

Shell 中的模型自动导入:

运行 python manage.py shell,所有已安装应用中的模型都会自动导入,无需显式导入语句。

Pydantic v2.9 深度模式

使用 Annotated 创建可复用的验证器:

从 typing 导入 Annotated,从 pydantic 导入 AfterValidator 和 BaseModel。定义一个 validate_positive 函数,接收整数 v 并返回整数。如果 v 小于或等于 0,则抛出错误消息为 must be positive 的 ValueError。否则返回 v。将 PositiveInt 创建为由 int 和使用 validate_positive 的 AfterValidator 构成的 Annotated。模型字段 price 和 quantity 使用 PositiveInt。

使用模型验证器进行跨字段验证:

从 pydantic 导入 BaseModel 和 model_validator,并从 typing 导入 Self。创建一个 DateRange 模型,其中 start_date 和 end_date 为 date 字段。添加一个 model_validator 装饰器,并将 mode 设为 after。在返回 Self 的 validate_dates 方法中,检查 end_date 是否早于 start_date;如果是,则抛出 ValueError,否则返回 self。

ConfigDict 最佳实践:

创建一个 BaseSchema 模型,并将 model_config 设为 ConfigDict。将 from_attributes 设为 True,以支持 ORM 对象;将 populate_by_name 设为 True,以允许使用别名;将 extra 设为 forbid,以拒绝未知字段;将 str_strip_whitespace 设为 True,以清理字符串。

SQLAlchemy 2.0 异步模式

引擎和会话设置:

从 sqlalchemy.ext.asyncio 导入 create_async_engine、async_sessionmaker 和 AsyncSession。使用 create_async_engine 和 postgresql+asyncpg 连接字符串创建引擎,将 pool_pre_ping 设为 True,并将 echo 设为 True。使用 async_sessionmaker 创建 async_session,传入引擎,将 class_ 设为 AsyncSession,并将 expire_on_commit 设为 False,以防止出现分离实例错误。

仓储模式:

创建一个 UserRepository 类,其 init 方法接收一个 AsyncSession。定义一个异步 get_by_id 方法,执行带有 user_id where 子句的 select 查询,并返回 scalar_one_or_none 结果。定义一个异步 create 方法,从 UserCreate model_dump 创建一个 User,将其添加到会话中,提交、刷新并返回该用户。

流式处理大型结果:

创建一个接收 AsyncSession 的异步 stream_users 函数。调用 await db.stream 和 select User 查询。使用 async for 遍历 result.scalars 并 yield 每个用户。

pytest 高级模式

使用 pytest-asyncio 的异步 fixture:

从 httpx 导入 pytest、pytest_asyncio 和 AsyncClient。使用 pytest_asyncio.fixture 装饰 fixture。创建一个 async_client fixture,在 AsyncClient 上使用 async with,并传入 app 和 base_url,然后 yield 客户端。创建一个 db_session fixture,在 async_session 和 session.begin 上使用 async with,yield 会话并调用 await session.rollback。

参数化测试:

使用 pytest.mark.parametrize 装饰器,参数名为 input_data 和 expected_status。提供由字典和预期状态码组成的元组作为测试用例。为 valid、empty_name 和 missing_name 用例添加 ids。测试函数接收 async_client、input_data 和 expected_status,向 users 端点发起请求,并断言 status_code 与预期值一致。

Fixture 工厂:

创建一个 user_factory fixture,返回一个异步函数。内部函数接收 db(类型为 AsyncSession)和关键字参数。设置包含 name 和 email 的默认值字典。使用管道运算符将默认值与 kwargs 合并来创建 User,将其添加到 db,提交并返回该用户。

类型提示的现代模式

用于结构化类型的 Protocol:

从 typing 导入 Protocol 和 runtime_checkable。应用 runtime_checkable 装饰器。定义一个带有泛型类型 T 的 Repository Protocol。添加抽象异步 get 方法,接收 int 类型的 id 并返回 T 或 None;添加异步 create 方法,接收 dict 类型的 data 并返回 T;添加异步 delete 方法,接收 int 类型的 id 并返回 bool。

用于装饰器的 ParamSpec:

从 typing 导入 ParamSpec、TypeVar 和 Callable,并从 functools 导入 wraps。将 P 定义为 ParamSpec,将 R 定义为 TypeVar。创建一个 retry 装饰器函数,接收默认值为 3 的 times,并返回一个可调用的包装器。内部装饰器使用 wraps 包装函数,包装器按指定的次数循环,尝试 await 该函数,并在最后一次尝试时重新抛出异常。

包管理

使用 Poetry 的 pyproject.toml:

在 tool.poetry 部分中,设置名称、版本和 Python 版本约束。在 dependencies 下添加 fastapi、pydantic 和带有 asyncio extra 的 sqlalchemy。在 dev dependencies 下添加 pytest、pytest-asyncio 和 ruff。配置 ruff 的 line-length 和 target-version。在 ini_options 中将 pytest asyncio_mode 设为 auto。

快速包管理器 uv:

使用来自 astral.sh 的安装脚本,通过 curl 安装 uv。使用 uv venv 创建虚拟环境。使用 uv pip install 从 requirements.txt 安装依赖。使用 uv add 命令添加依赖。


高级实现(10 分钟以上)

如需全面了解以下内容:

  • Docker 和 Kubernetes 的生产部署模式
  • 高级异步模式,包括任务组和信号量
  • 使用 numpy、pandas 和 polars 进行数据科学集成
  • 性能优化技术
  • 遵循 OWASP 模式的安全最佳实践
  • CI/CD 集成模式

请参阅:

  • reference.md:完整参考文档
  • examples.md:可用于生产环境的代码示例

Context7 库映射

  • tiangolo/fastapi:FastAPI 异步 Web 框架
  • django/django:Django Web 框架
  • pydantic/pydantic:使用类型注解进行数据验证
  • sqlalchemy/sqlalchemy:SQL 工具包和 ORM
  • pytest-dev/pytest:测试框架
  • numpy/numpy:数值计算
  • pandas-dev/pandas:数据分析库
  • pola-rs/polars:快速 DataFrame 库

可搭配使用

  • moai-domain-backend:REST API 和微服务架构
  • moai-domain-database:SQL 模式和 ORM 优化
  • moai-workflow-testing:DDD 和测试策略
  • moai-essentials-debug:AI 驱动的调试
  • moai-foundation-quality:TRUST 5 质量原则

故障排除

常见问题:

Python 版本检查:

使用带有版本标志的 python 运行命令,确认版本为 3.13 或更高。使用带有 -c 标志的 python 输出 sys.version_info,以获取详细的版本信息。

异步会话分离错误:

在会话配置中将 expire_on_commit 设为 False。或者,在提交后对对象调用 await session.refresh。

pytest asyncio 模式警告:

在 pyproject.toml 的 tool.pytest.ini_options 下,将 asyncio_mode 设为 auto,并将 asyncio_default_fixture_loop_scope 设为 function。

Pydantic v2 迁移:

parse_obj 方法现为 model_validate。parse_raw 方法现为 model_validate_json。from_orm 功能要求在 ConfigDict 中将 from_attributes 设为 True。


最后更新:2026-01-11 状态:活跃(v1.1.0)

评论

支持 Markdown