beancount 源码解读

按模块拆分的 beancount 源码笔记,一模块一篇,只描述上游怎么做、为什么这么做,不涉及本项目的设计取舍。

共同约定

篇目

# 篇目 覆盖源文件 讲什么
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.pyutils/invariants.py (currency, cost) 索引持仓,管加减仓判定与两条结构不变量
05 convert.py:持仓的四种口径与换算 core/convert.py units/cost/weight/value 四种取值口径,外加换汇;weight 定义配平语义
06 display_context.py:显示精度的统计与渲染 core/display_context.pycore/distribution.py 按币种统计小数位分布,预生成格式串对齐输出;只管渲染不参与计算
07 interpolate.py:残差、容差与自动补数的量化 core/interpolate.py 残差怎么算、多大的残差算平(按币种推断容差)、补出的数要不要取整
08 parser 数字层:从账本文本到 Decimal 与 Amount parser/lexer.lparser/tokens.cparser/grammar.yparser/grammar.py 词法正则 → C 层构造 Decimal → 语法规则定角色;「没写」也要能往下游传
09 booking.py 与 booking_full.py:批次匹配与缺失数字的补全 parser/booking.pyparser/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.pyops/pad.py balance 拿运行余额和用户抄的数字比对,pad 自动生成补齐分录
12 ops/validation.py:插件处理完毕后的指令流校验 ops/validation.py 插件跑完后检查整条指令流是否自洽——账户开启区间、平账、Balance 自相矛盾
13 loader.py:加载流水线与插件执行顺序 loader.py 唯一加载入口,决定阶段顺序、内置与用户插件的先后、选项合并、结果缓存
14 data.py 与 compare.py:指令数据结构、排序与比较 core/data.pycore/compare.pycore/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,再按日期查价

按主题速查