开发指南
文档规范
本项目的文档面向中文研究用户和维护者,所有新增 README、Sphinx 页面、GUI 描述、CLI help 与 docstring 均使用中文。Python docstring 采用 Google style,以便 sphinx.ext.napoleon 自动解析。
模块级 docstring
每个 src/ 生产模块都必须包含模块级 docstring,并放在文件第一条语句。建议结构:
"""FacadeBridge -- e2m2e 算法层直调的薄封装。
直接调用 algorithm 层而非 Facade 门面,因为 Facade 返回的 DesignOrbitResponse
剥离了轨道数据(只返回标量汇总),而 GUI 需要完整的 Orbit 对象用于可视化。
详见 docs/adr/0011-algorithm-layer-direct-call.md。
"""
不同模块类型的重点如下:
类型 |
必写内容 |
|---|---|
数据层( |
数据类的字段含义、与持久化(catalog / output)的对应关系 |
执行层( |
调用的 e2m2e 算法、返回 DTO 的字段、异常翻译、落盘布局 |
前端( |
组件职责、props 语义、与 IPC/画布的交互 |
Rust 壳( |
命令语义、sidecar 进程与协议边界、状态生命周期 |
工具脚本( |
用途、参数、输出 |
函数与类 docstring
公共函数、公共类和 dataclass 使用单行摘要 + Args / Returns / Raises 的 Google-style 格式。不要在 Args 中重复 type hint,只写含义、单位和约束。
def load_orbit(path: Path) -> dict:
"""读取轨道 JSON 文件并返回原始载荷。
Args:
path: 轨道 JSON 文件路径。
Returns:
解析后的 JSON 字典,包含 `states`、`times` 和 `period` 等键。
Raises:
FileNotFoundError: 输入文件不存在。
ValueError: JSON 内容缺少轨道状态字段。
"""
main() 和 parse_args() 也需要 docstring:parse_args() 说明返回解析后的命名空间;main() 说明执行完整脚本流程且通常不返回值。私有 helper 可以使用较短 docstring,但仍应说明单位、边界或失败条件。
CLI help 文本(工具脚本)
scripts/ 下的独立工具脚本(download_kernels.py、smoke_mcp_serve.py)
使用 argparse。help 文本必须回答三个问题:参数控制什么、默认值是什么、单位是什么。示例:
parser.add_argument(
"--position-tol",
type=float,
default=1e-3,
help="多重打靶位置连续性容差,默认 1e-3 km。",
)
无量纲 CR3BP 参数应注明为无量纲;角度单位写 rad 或度;时间单位写 TU、天或秒。布尔开关说明开启后的行为。
国际化
界面 i18n 在前端 frontend/src/i18n.ts:中英两份字符串字典,t(key) 取用,
语言选择存 localStorage、重启保留。新增界面文本时同步向两个字典各加一条键值;
新增语种则追加一份字典。(PyQt 时代的 tools/update_i18n.py 与 src/app/i18n/
已随旧 UI 删除。)
Sphinx 文档
Sphinx 源文件位于 docs/source/,叙事文档通过 MyST Markdown 接入。
uv run --extra docs python -m sphinx -b html docs/source docs/build/html
提交前应至少确认构建无 ERROR,并尽量清理 WARNING。若新增/删除叙事页面,请在 docs/source/index.rst 的对应 toctree 中增删条目。
README
README.md为中文主文档(双语机制已撤销)。代码块、命令、路径、模块名一律不翻译。
日志与打印
本项目使用 Python logging 模块而非 print() 进行输出。
日志级别
级别 |
数值 |
说明 |
|---|---|---|
|
10 |
详细调试信息 |
|
20 |
一般信息 |
|
30 |
警告(默认级别) |
|
40 |
错误 |
|
50 |
严重错误 |
默认日志级别为 WARNING,只有更高级别的日志会输出。
使用规范
脚本入口模块应配置 logging:
import logging
logging.basicConfig(
level=logging.INFO,
format="%(levelname)s: %(message)s",
)
logger = logging.getLogger(__name__)
使用 logger.info()、logger.debug() 等代替 print()。这使得:
可通过调整日志级别控制输出详细程度
支持日志处理器(如写入文件)
输出带有时间戳、模块名等上下文信息
调试模式
运行脚本时设置环境变量可临时调整日志级别:
# 显示 INFO 及以上
set PYTHONLOGLEVEL=INFO
# 显示所有日志(包括 DEBUG)
set PYTHONLOGLEVEL=DEBUG