Spaces:
Sleeping
Sleeping
File size: 4,819 Bytes
a5fd608 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | # Agent 编码规范
## 防御性编程精简
避免过度防御性编程,遵循以下原则:
### 1. None 检查
- **不要**进行显式的 None 检查
- 信任输入数据,让程序在真正的错误点上失败
- 避免 `if x is not None:` 这样的防御性代码
```python
# ❌ 避免
def process(data):
if data is not None:
return data.value
return None
# ✅ 推荐
def process(data):
return data.value
```
### 2. 类型检查
- **不要**使用 `isinstance`、`type()`、`typeof` 等进行运行时类型检查
- 依靠类型提示和静态类型检查工具(如 mypy)
- 让 Duck Typing 发挥作用
```python
# ❌ 避免
def calculate(obj):
if isinstance(obj, int):
return obj * 2
elif isinstance(obj, str):
return obj * 2
else:
raise TypeError("不支持的类型")
# ✅ 推荐
def calculate(obj: int | str) -> int | str:
return obj * 2
```
### 3. 异常处理
- **不要**滥用 try-catch 来压制异常
- **不要**用 try-catch 让程序"容错"运行
- 只在真正需要处理异常的地方捕获
- 让未处理的异常自然抛出,暴露真正的问题
```python
# ❌ 避免 - 压制异常
import logging
logger = logging.getLogger(__name__)
def parse_config(path):
try:
with open(path) as f:
return json.load(f)
except Exception as e:
logger.error(f"加载配置失败: {e}")
return {} # 返回空配置让程序继续运行
# ✅ 推荐 - 让异常传播
def parse_config(path):
with open(path) as f:
return json.load(f)
# ✅ 或仅在必要时转换异常类型
def parse_config(path):
try:
with open(path) as f:
return json.load(f)
except json.JSONDecodeError as e:
raise ConfigError(f"配置文件格式错误: {e}") from e
```
### 4. 原则总结
1. **早失败(Fail Fast)** - 让错误尽早暴露,不要试图掩盖
2. **信任调用方** - 假设调用方会提供正确的输入
3. **清晰错误信息** - 让异常信息直接指出问题所在
4. **代码简洁** - 减少不必要的检查代码,专注于业务逻辑
---
**核心信条**:清晰的代码比健壮的代码更重要。让错误暴露,让问题可见。
## 编辑文件时的精准修改原则
在进行代码编辑时,**只修改必要的部分**,不要进行任何无关改动:
### 禁止的无关改动
- **不要**调整代码缩进或格式
- **不要**重排 import 语句的顺序
- **不要**添加或删除空行
- **不要**修改注释(除非任务明确要求)
- **不要**修改变量名、函数名等标识符(除非任务明确要求)
- **不要**进行任何代码重构(除非任务明确要求)
### ✅ 正确示例
如果任务是将 `import config` 改为 `from mini_gpt import config`:
```python
# 修改前
import config
from typing import Callable
# 修改后 - 只修改 import 语句,其他保持不变
from mini_gpt import config
from typing import Callable
```
### ❌ 错误示例
#### 示例1:无关地调整 import 顺序
```python
# 修改前
import config
from typing import Callable
# 错误 - 无关地调整了 import 顺序
from typing import Callable
from mini_gpt import config
```
#### 示例2:无关地修改函数参数格式
```python
# 修改前
def my_function(
param1,
param2,
param3,
):
pass
# 错误 - 任务只要求修改函数体,却无关地修改了参数格式
def my_function(
param1, # 调整了缩进宽度
param2,
param3 # 去掉了尾部逗号
):
pass
```
**原则**:最小化改动范围,只改必须改的地方。
## 运行单元测试
本项目使用 pytest 运行单元测试,必须在 `mini-gpt` conda 环境中执行。
### 运行命令
```bash
/Users/run/anaconda3/envs/mini-gpt/bin/python -m pytest test/ -v
```
### 重要提示
1. **必须使用 mini-gpt 环境** - 基础环境缺少 tensorflow 依赖,会导致测试收集失败
2. **不要添加 `pytest.importorskip("tensorflow")`** - 这些测试依赖 tensorflow,跳过会掩盖真正的问题
## Python 代码风格
### 禁止尾逗号
**任何情况下都不应出现尾逗号**(trailing comma)。
```python
# ❌ 避免 - 尾逗号
my_list = [
1,
2,
3,
]
# ✅ 推荐
my_list = [
1,
2,
3
]
# ❌ 避免 - 函数参数尾逗号
def my_func(
arg1,
arg2,
):
pass
# ✅ 推荐
def my_func(
arg1,
arg2
):
pass
# ❌ 避免 - 字典尾逗号
my_dict = {
"key1": "value1",
"key2": "value2",
}
# ✅ 推荐
my_dict = {
"key1": "value1",
"key2": "value2"
}
```
## 禁止命令行参数
永远不要在代码中使用命令行参数(如 `argparse`、`sys.argv` 等)。配置应通过代码中硬编码实现。 |