按模块拆分的 beancount 源码笔记,一模块一篇,只描述上游怎么做、为什么这么做,不涉及本项目的设计取舍。
共同约定
97472138(2026-08-22),18 篇全部一致。文件:起-止行 (名称),行号逐条核对过。正文里出现的其它
commit 号是被引用的历史提交,不是基线。| # | 篇目 | 覆盖源文件 | 讲什么 |
|---|---|---|---|
| 01 | amount.py:Amount,金额 = 数值 + 币种 | core/amount.py |
把数值和币种绑成不可拆、不可改的值对象,是最底层的业务类型 |
| 02 | number.py:Decimal、统一入口 D() 与 MISSING 哨兵 | core/number.py |
金额一律用 Decimal,绝不用浮点;D()
是唯一构造入口 |
| 03 | position.py:Position、Cost 与 CostSpec | core/position.py |
三个不可变记录:批次身份、账本里可留白的匹配规格、持仓值类型 |
| 04 | inventory.py:Inventory 库存容器 | core/inventory.py、utils/invariants.py |
以 (currency, cost)
索引持仓,管加减仓判定与两条结构不变量 |
| 05 | convert.py:持仓的四种口径与换算 | core/convert.py |
units/cost/weight/value
四种取值口径,外加换汇;weight 定义配平语义 |
| 06 | display_context.py:显示精度的统计与渲染 | core/display_context.py、core/distribution.py |
按币种统计小数位分布,预生成格式串对齐输出;只管渲染不参与计算 |
| 07 | interpolate.py:残差、容差与自动补数的量化 | core/interpolate.py |
残差怎么算、多大的残差算平(按币种推断容差)、补出的数要不要取整 |
| 08 | parser 数字层:从账本文本到 Decimal 与 Amount | parser/lexer.l、parser/tokens.c、parser/grammar.y、parser/grammar.py |
词法正则 → C 层构造 Decimal →
语法规则定角色;「没写」也要能往下游传 |
| 09 | booking.py 与 booking_full.py:批次匹配与缺失数字的补全 | parser/booking.py、parser/booking_full.py |
把不完整的交易补全:批次匹配与插值这两件互相依赖的事怎么交错 |
| 10 | booking_method.py:STRICT、FIFO、LIFO、HIFO、NONE 与被禁用的 AVERAGE | parser/booking_method.py |
候选批次有多个时扣哪一批,收拢成七个同签名函数由账户声明选择 |
| 11 | ops/balance.py 与 ops/pad.py:余额断言与自动补齐 | ops/balance.py、ops/pad.py |
balance 拿运行余额和用户抄的数字比对,pad
自动生成补齐分录 |
| 12 | ops/validation.py:插件处理完毕后的指令流校验 | ops/validation.py |
插件跑完后检查整条指令流是否自洽——账户开启区间、平账、Balance 自相矛盾 |
| 13 | loader.py:加载流水线与插件执行顺序 | loader.py |
唯一加载入口,决定阶段顺序、内置与用户插件的先后、选项合并、结果缓存 |
| 14 | data.py 与 compare.py:指令数据结构、排序与比较 | core/data.py、core/compare.py、core/flags.py |
12 种指令的 NamedTuple
定义与排序键,是整条管线的公共数据模型 |
| 15 | account.py:账户名的语法、遍历与文件系统映射 | core/account.py |
账户不是对象就是字符串:名字语法、父子层级遍历、映射到目录路径 |
| 16 | account_types.py:五大账户类型与正负号约定 | core/account_types.py |
资产/负债/权益/收入/费用五个根类别,决定名字合法性、正负号含义、报表归属 |
| 17 | getters.py:从指令流提取账户、币种与时间信息 | core/getters.py |
十几个彼此独立的横切汇总函数:用过哪些账户、币种、标签、跨了哪几年 |
| 18 | prices.py:价格表的构建与查询 | core/prices.py |
把离散的 price 指令建成按币种对索引的
PriceMap,再按日期查价 |