ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ECC Python Patterns 规则解析:Cursor 代理编码规范的 Protocol、Dataclass 与上下文管理器实践

ECC Python Patterns 规则解析:Cursor 代理编码规范的 Protocol、Dataclass 与上下文管理器实践 ECC Python Patterns 规则解析Cursor 代理编码规范的 Protocol、Dataclass 与上下文管理器实践【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC本文以 ECC 仓库中的 Cursor 规则文件 python-patterns.md 为核心完整解读这条Python 模式规则的 frontmatter 触发机制、三大核心模式Protocol 鸭子类型、Dataclass 作为 DTO、上下文管理器与生成器并沿该规则自带的 Reference 指引结合 python-patterns 技能 与 rules 分层体系 深入展开帮助你在 Cursor 等代理环境中配置一套可落地的 Python 编码规范。规则文件定位agent harness 中的轻量标准 深度引用设计ECC 是一个 agent harness 性能优化系统其核心产出之一是可安装到 Claude Code、Codex、Opencode、Cursor 等代理工具的规则rules与技能skills。python-patterns.md 属于其中的Cursor 侧 Python 模式规则文件开头自述This file extends the common patterns rule with Python specific content.即它是通用模式规则common patterns在 Python 语言上的扩展层。这种common 层 语言层的分层组织方式在 rules/README.md 中有完整定义rules/common/存放无语言相关性的通用原则各语言目录则存放框架特定的模式、工具与代码示例语言特定规则在与通用规则冲突时优先生效specific overrides general。Frontmatter 的三个关键字段该规则文件的 YAML frontmatter 决定了它在 Cursor 中的加载行为--- description: Python patterns extending common rules globs: [**/*.py, **/*.pyi] alwaysApply: false ---字段取值作用descriptionPython patterns extending common rules向代理说明该规则的用途便于其在上下文预算中做相关性判断globs**/*.py,**/*.pyi文件模式匹配只有当会话中编辑或打开的文件命中.py/.pyi时才注入该规则alwaysApplyfalse不做全局常驻注入避免无关会话中白白消耗上下文 token这个组合体现了一个务实的上下文工程思路规则按需挂载。当你处理 Python 文件时代理才会看到这条规则当你处理 TypeScript 时它完全不会出现在提示词里。这也与 ECC 仓库中其他 Python 规则的触发方式保持一致例如 python-coding-style.md 和 python-hooks.md 使用了完全相同的 globs 配置。需要注意的一点是同一套规则在仓库中存在两个门面。.cursor/rules/ 下的是 Cursor 格式frontmatter 用globsalwaysApply而 rules/python/ 目录下是面向 Claude 等工具的对应实现例如 rules/python/patterns.md 与 Cursor 版本内容一致但 frontmatter 使用paths字段。从源码结构看两套目录是同一规则体系在不同代理工具上的镜像维护时需要保持一致。核心内容一Protocol鸭子类型规则文件的第一节要求用typing.Protocol定义接口原文给出的最小示例是from typing import Protocol class Repository(Protocol): def find_by_id(self, id: str) - dict | None: ... def save(self, entity: dict) - dict: ...这段代码的关键点在于Repository是一个协议而不是抽象基类。任何结构上具备find_by_id(id: str) - dict | None与save(entity: dict) - dict两个方法的对象都会被类型检查器视为Repository的实例无需显式继承。这就是 Python 的鸭子类型在静态类型系统下的正式表达。方法签名中的...Ellipsis表示只声明契约、不提供实现是 Protocol 的标准写法。返回值使用dict | None的 PEP 604 联合类型语法Python 3.10 原生支持若目标版本为 3.9需配合from __future__ import annotations或改用Optional[dict]。这与 common patterns 规则 中的Repository Pattern原则直接对应将数据访问封装在一致接口之后业务逻辑依赖抽象接口而非存储机制从而方便替换数据源和使用 mock 测试。Cursor 规则把这条通用原则翻译成了 Python 的具体写法——Protocol 就是 Python 版的接口。python-patterns 技能 中给出了协议在实际函数签名中如何被消费的完整示例from typing import Protocol class Renderable(Protocol): def render(self) - str: Render the object to a string. def render_all(items: list[Renderable]) - str: Render all items that implement the Renderable protocol. return \n.join(item.render() for item in items)这里render_all的参数类型标注为list[Renderable]意味着任何实现了render() - str的对象都能传入调用方不关心具体类型。配合 python-coding-style.md 中所有函数签名都要加类型注解的要求Protocol 让依赖接口与完整类型覆盖两条规则同时成立。核心内容二Dataclass 作为 DTO规则文件的第二节规定数据传输对象DTO使用dataclass实现原文示例from dataclasses import dataclass dataclass class CreateUserRequest: name: str email: str age: int | None None该示例覆盖了 dataclass 的三个要点字段声明即契约name、email为必填age为可选并带默认值None。dataclass会自动生成__init__、__repr__、__eq__等方法省去手写样板代码。可选字段用int | None None表达类型与默认值一一对应静态检查器能识别可为空语义。不可变性的升级路径python-coding-style.md 进一步要求优先使用不可变数据结构做法是dataclass(frozenTrue)冻结后的实例字段不可再赋值适合作为 API 请求/响应体from dataclasses import dataclass dataclass(frozenTrue) class User: name: str email: strpython-patterns 技能 在此之上补充了两个工程化细节值得在实际 DTO 设计中直接套用。带校验的 dataclass利用__post_init__在构造后做轻量校验把非法输入挡在对象创建的第一时间dataclass class User: email: str age: int def __post_init__(self): # Validate email format if not in self.email: raise ValueError(fInvalid email: {self.email}) # Validate age range if self.age 0 or self.age 150: raise ValueError(fInvalid age: {self.age})不可变的值类型用 NamedTuple对于像坐标这类纯值对象NamedTuple天然不可变且更省内存from typing import NamedTuple class Point(NamedTuple): Immutable 2D point. x: float y: float def distance(self, other: Point) - float: return ((self.x - other.x) ** 2 (self.y - other.y) ** 2) ** 0.5核心内容三上下文管理器与生成器规则文件第三节的原文是两条简洁原则Use context managers (withstatement) for resource managementUse generators for lazy evaluation and memory-efficient iteration这两条原则在 python-patterns 技能 中被展开为可执行的具体写法。上下文管理器Context Managerswith语句保证资源在块结束时必然释放即使块内抛出异常。技能中给出的对照示例# Good: Using context managers def process_file(path: str) - str: with open(path, r) as f: return f.read() # Bad: Manual resource management def process_file(path: str) - str: f open(path, r) try: return f.read() finally: f.close()对于跨越多条语句的原子操作如数据库事务技能给出了类形式的上下文管理器实现其中__exit__返回值False表示不吞掉异常这一细节是事务正确性的一部分class DatabaseTransaction: def __init__(self, connection): self.connection connection def __enter__(self): self.connection.begin_transaction() return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: self.connection.commit() else: self.connection.rollback() return False # Dont suppress exceptions # Usage with DatabaseTransaction(conn): user conn.create_user(user_data) conn.create_profile(user.id, profile_data)轻量场景则可以用contextlib.contextmanager装饰器 yield快速实现例如计时器from contextlib import contextmanager contextmanager def timer(name: str): Context manager to time a block of code. start time.perf_counter() yield elapsed time.perf_counter() - start print(f{name} took {elapsed:.4f} seconds)生成器Generators生成器用yield实现惰性求值让大文件、大数据集的处理保持恒定内存占用def read_large_file(path: str) - Iterator[str]: Read a large file line by line. with open(path) as f: for line in f: yield line.strip() # Usage for line in read_large_file(huge.txt): process(line)技能在内存与性能一节还强调聚合场景应使用生成器表达式而非中间列表——sum(x * x for x in range(1_000_000))相比sum([x * x for x in range(1_000_000)])不会构造百万级中间列表。这与规则文件中memory-efficient iteration的表述正好呼应。Reference 层规则指向的 python-patterns 技能规则文件末尾明确写道See skill:python-patternsfor comprehensive patterns including decorators, concurrency, and package organization.这体现了 rules/README.md 中定义的分工模型Rules 定义做什么标准、约定、检查清单Skills 提供怎么做深度、可执行的参考材料。skills/python-patterns/SKILL.md 全文约 750 行是这条短规则的完整展开版其覆盖范围可归纳为主题核心要点核心原则可读性优先、显式优于隐式、EAFP 异常处理风格类型注解基础注解、Python 3.9 内置泛型、类型别名与 TypeVar、Protocol 鸭子类型错误处理捕获具体异常而非裸except、raise ... from e异常链、自定义异常层级AppError基类装饰器functools.wraps计时装饰器、参数化装饰器、类装饰器并发ThreadPoolExecutorI/O 密集、ProcessPoolExecutorCPU 密集、asyncio异步 I/O包组织src/布局、import 顺序stdlib → 三方 → 本地、__init__.py显式导出__all__内存性能__slots__省内存、生成器处理大数据、循环中用join代替字符串拼接工具链black/isort/ruff/mypy/pytest/bandit/pip-audit命令集与pyproject.toml配置反模式清单可变默认参数、type()判断、 None、import *、裸except其中反模式清单与规则文件形成互补——规则告诉代理该用 Protocol/Dataclass/with技能告诉代理别犯这些错# Bad: Mutable default arguments def append_to(item, items[]): items.append(item) return items # Good: Use None and create new list def append_to(item, itemsNone): if items is None: items [] items.append(item) return items如果你希望在 Cursor 之外例如 Claude Code获得同样完整的 Python 指导可以直接阅读该技能文件在 Cursor 侧则通过这条 rules 文件按需触发再由代理在需要时检索技能内容。配套规则与自动校验闭环.cursor/rules/ 下的 Python 规则族不止 patterns 一个文件三者构成一个闭环python-patterns.md本文主体设计模式层——Protocol、DTO、资源管理python-coding-style.md风格层——PEP 8、全量类型注解、不可变结构优先以及工具约定black格式化、isort排序 import、rufflintpython-hooks.md自动化层——在PostToolUse钩子中编辑.py文件后自动运行 black/ruff 格式化与 mypy/pyright 类型检查并对编辑文件中的print()语句发出警告应改用logging模块。从源码结构看钩子机制依托仓库 hooks/ 与 .cursor/hooks/ 下的脚本体系实现如after-file-edit.js规则文件只声明期望的行为实际执行由钩子适配器完成。这意味着规则不只是给代理看的文字约定还可以被工具链强制执行——写错的 import 顺序会在编辑后立刻被 isort 纠正类型错误会在编辑后立刻被 mypy 报出。安装与使用方式ECC 规则的安装方式在 rules/README.md 中给出两条路径。方式一安装脚本推荐# 安装 common Python 语言规则 ./install.sh python安装脚本位于 install.sh支持一次安装多语言./install.sh typescript python。方式二手动安装# 创建 ECC 规则命名空间 mkdir -p ~/.claude/rules/ecc # 先装通用规则所有项目必需 cp -r rules/common ~/.claude/rules/ecc/ # 再装 Python 语言规则 cp -r rules/python ~/.claude/rules/ecc/README 特别强调必须整体复制目录不要用/*拍平——common 层与语言层存在同名文件如patterns.md拍平后语言特定文件会覆盖通用规则并破坏语言文件中../common/相对引用。项目级安装则使用项目根目录下的.claude/rules/ecc同构命名空间。对于 Cursor 用户仓库直接提供了 scaffolds/cursor/ 脚手架含hooks.json与规则文件.cursor/rules/目录本身即是 Cursor 格式规则的参考实现可直接对照其 frontmatter 格式为自己的项目编写同类规则。适用前提与边界说明本文涉及的规则文件与技能均以当前仓库实际内容为准dict | None、int | None等 PEP 604 语法要求 Python 3.10或在 3.9 中启用from __future__ import annotations技能中对 3.9 与更早版本的兼容写法有单独说明。.cursor/rules/与rules/python/是同一规则体系的两个工具门面内容语义一致但 frontmatter 字段不同globs/alwaysApply对应paths引用时应注意各自面向的代理工具。规则只约束编码时的写法不绑定任何特定框架若项目使用 FastAPI 等具体框架仓库在 rules/python/ 下另有fastapi.md等框架级规则可扩展同一分层体系。技能中的工具链命令black、ruff、mypy 等需自行安装相应 CLI 后方可运行pyproject.toml配置示例见技能文件内Python Tooling Integration一节。小结python-patterns.md 是一条典型的轻量规则 深度引用设计约 40 行的正文以globs按需注入规定了 Python 代码的三条模式基线——Protocol 定义接口、dataclass 承载 DTO、with/生成器管理资源——而 750 行的 python-patterns 技能 承接了装饰器、并发、包组织、反模式清单等全部深度内容。配合 python-coding-style.md 的风格约定与 python-hooks.md 的自动化校验这套规则在 Cursor 等代理环境中形成了注入 → 生成/审查代码 → 自动格式化与类型检查的完整闭环是 ECC 分层规则体系common 层 语言层 工具门面在 Python 方向上的完整落地。【免费下载链接】ECCThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.项目地址: https://gitcode.com/GitHub_Trending/ev/ECC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表