garage项目代码贡献规范与技术指南
前言
garage作为一个强化学习研究框架,其代码质量与规范程度直接影响着研究工作的可复现性和可扩展性。本文将详细介绍garage项目的代码规范、开发流程和最佳实践,帮助开发者快速掌握项目贡献的正确方式。
开发环境配置
在开始贡献代码前,需要正确配置开发环境。关键步骤包括安装pre-commit钩子,它能在提交代码前自动执行代码格式检查:
pre-commit install -t pre-commit
pre-commit install -t pre-push
pre-commit install -t commit-msg
这些钩子会在每次git commit时自动运行,检查代码风格、语法等问题,避免将格式错误的代码提交到仓库。
代码风格规范
Python代码风格
garage严格遵循PEP8规范,并在此基础上增加了一些项目特有的规则:
-
导入排序:按PEP8分组后按字母顺序排列
- 标准库导入
- 第三方库导入
- 本地应用/库导入
-
字符串引号:优先使用单引号,除非字符串内包含单引号
-
字符串格式化:统一使用f-string
# 推荐 name = "World" greeting = f'Hello, {name}!' # 不推荐 greeting = 'Hello, {}!'.format(name)
-
抽象基类:必须使用abc模块
import abc class Robot(abc.ABC): @abc.abstractmethod def beep(self): pass
模块导入规范
-
便利导入:在
__init__.py
中添加一级导入的快捷方式# garage/foo/__init__.py from garage.foo.bar import Bar
-
避免循环导入:同一包内的导入使用绝对路径
# 正确 from garage.foo.baz import Baz # 错误(可能导致循环导入) from garage.foo import Baz
-
第三方库导入:导入整个模块而非具体对象
# 正确 import numpy as np import tensorflow as tf # 错误 from numpy import array
文档规范
文档字符串(Docstring)
所有公开方法必须提供符合Google风格的文档字符串:
def sample_action(self, observation):
"""Sample an action given an observation.
Args:
observation (numpy.ndarray): Observation from the environment with
shape :math:`(O^*)` where :math:`O^*` means any shape.
Returns:
numpy.ndarray: Sampled action with shape :math:`(A^*)`.
Raises:
RuntimeError: If the policy is not initialized.
"""
张量形状标注
强化学习涉及大量张量操作,必须明确标注形状:
| 符号 | 说明 | |------|------| | N
| 批次维度 | | T
| 时间维度 | | S^*
| 可变形状 | | \bullet
| 展平操作符 |
示例:
def process_trajectories(trajs):
"""处理轨迹数据
Args:
trajs (list[numpy.ndarray]): 轨迹列表,每个元素的形状为 :math:`([T], S^*)`
Returns:
numpy.ndarray: 处理后的轨迹,形状为 :math:`(N \bullet [T], S^*)`
"""
测试要求
garage采用严格的测试驱动开发:
- 新功能:必须包含单元测试
- Bug修复:必须添加重现Bug的测试用例
- 测试位置:所有测试放在
garage/tests/
目录下 - 命名规范:测试文件以
test_
开头
示例测试结构:
def test_sample_action():
policy = MyPolicy()
obs = np.zeros((10,))
action = policy.sample_action(obs)
assert action.shape == (5,)
Git工作流规范
garage采用线性提交历史,禁止合并提交:
基本准则
- 不要使用GitHub的"Update branch"按钮
- 不要使用
git merge
命令 - 不要直接在master分支上提交
- 定期将特性分支变基到最新master
常用操作示例
-
创建特性分支:
git checkout master git pull rlworkgroup master git checkout -b my-feature
-
变基更新分支:
git checkout my-feature git fetch rlworkgroup git rebase rlworkgroup/master
-
提交信息格式:
简要描述(50字符以内) 详细说明(每行72字符) - 变更原因 - 主要修改 - 影响范围
代码审查流程
提交的PR需要满足以下条件才能被合并:
- 基于最新的master分支
- 通过所有CI测试
- 符合提交信息规范
- 获得至少一位贡献者的批准
- 获得维护者的批准
建议开发者在请求维护者审查前,先确保满足前3项条件,以提高审查效率。
总结
garage项目通过严格的代码规范和质量控制,确保框架的稳定性和可维护性。开发者在贡献代码时,应当:
- 遵循PEP8和项目特定规范
- 编写完整的文档和测试
- 使用正确的Git工作流
- 通过pre-commit检查
- 按照审查流程提交PR
这些实践不仅适用于garage项目,也是高质量开源项目开发的通用准则。掌握这些规范将有助于开发者更好地参与开源社区贡献。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考