为什么bazi-skill排盘不会错:黄金用例回归测试与参考表一致性设计详解
【免费下载链接】bazi-skill四柱八字命理分析项目地址: https://gitcode.com/gh_mirrors/ba/bazi-skill
bazi-skill 是一个四柱八字排盘与命理分析工具,核心排盘脚本 pai_pan.py 仅用 Python 标准库实现。它能"排盘不会错",靠的不是运气,而是两件事:黄金用例回归测试(test_pai_pan.py)和参考表一致性设计(代码常量与 references/ 下的 Markdown 表共用同一张表)。本文面向新手,用通俗的方式讲清这套设计。
一、八字排盘到底容易在哪些地方出错?
八字排盘看似只是"查表",实则踩坑点极多。以下是最常见的 6 个翻车现场:
| 易错点 | 正确规则 | 常见错误 |
|---|---|---|
| 年柱分界 | 以立春精确时刻为界 | 误以为正月初一或 2 月 4 日零点换年 |
| 月柱分界 | 以十二"节"(立春、惊蛰…)为界 | 误用"中气"或节气近似日期 |
| 日柱日界 | 23:00 起(夜子时)用次日日柱 | 全天都用当日日柱 |
| 大运方向 | 阳男阴女顺排,阴男阳女逆排 | 男女方向记反 |
| 农历换算 | 定气定朔、无中气之月为闰月 | 查现成万年历、闰月标错 |
| 神煞查法 | 年支/日支三合等固定口径 | 各查各的、口径不一 |
bazi-skill 的处理思路是:每一条规则都配一个"锚点命例"——一个已知标准答案的具体出生日期,只要算出来和锚点一致,规则就没错。
二、黄金用例回归测试:一个"锚点命例"守住全局
回归测试的核心文件是 scripts/test_pai_pan.py。它不直接调用内部函数,而是像真实用户一样运行排盘脚本、解析标准输出的文本报告,再逐项断言,确保"用户看到什么,测试就验证什么"。
黄金命例:1990-05-15 午时男
全部测试围绕一个基准命例展开(见 test_golden_1990_wushi_male):
- 输入:阳历 1990 年 5 月 15 日,午时,男
- 标准答案:年柱庚午、月柱辛巳、日柱庚辰、时柱壬午,大运顺排
- 神煞:应命中"天乙贵人、将星",而不应出现"驿马、桃花"(命局地支无申、无卯)
为什么连"不该出现的神煞"也要断言?——防止神煞计算从"漏报"悄悄变成"多报"。
边界用例清单
除黄金命例外,测试还覆盖了最容易翻车的 8 类边界场景:
| 测试用例 | 守住什么规则 |
|---|---|
| 立春前出生:1990-02-03 10:00 | 年柱必须是己巳,绝不能是庚午 |
| 夜子时 23:30 | 日柱用次日辛巳,标记"夜子时" |
| 早子时 00:30 | 日柱仍是庚辰,标记"早子时" |
| 阴年男:辛未年 | 大运逆排 |
| 阳年女:庚午年 | 大运逆排 |
| 时辰未知 | 时柱输出"未知",年月日三柱完整 |
| 农历对照:四月廿一 | 与阳历 1990-05-15 四柱完全一致 |
| 已故年份:2010 年 | 流年列表到 2010 为止,不出现更晚年份 |
另有神煞专项测试(ShenshaTests):用"日干甲见丑→天乙贵人""日柱甲子→旬空戌亥"这类表驱动小用例,直接验证查表函数。
实际运行
python3 scripts/test_pai_pan.py,11 个测试全部通过(Ran 11 tests ... OK),耗时约 3 秒,无需任何第三方依赖。
三、算法锚点注释:把"标准答案"写进代码文档
打开 scripts/pai_pan.py,文件开头就有一段"算法锚点(供 QA 对照)",把每条规则的正确答案钉死在代码里:
- 日柱:公历儒略日换算六十甲子,锚点
1990-05-15 = 庚辰; - 年柱:立春分界,锚点
1990-02-03 10:00 必须是己巳,不是庚午; - 月柱:十二节分界,锚点
1990-05-15(立夏后、芒种前)= 辛巳月; - 时柱:五鼠遁元,锚点
庚日午时 = 壬午(对照 references/shichen-table.md); - 大运:
1990-05-15 男(阳年)必须顺排(对照 references/dayun-rules.md); - 节气时刻:用太阳视黄经精算(立春=315°),明确禁止写死"立春大约 2 月 3-5 日";
- 神煞:与 references/shensha-table.md 同一张表。
这套做法的价值:任何人改代码后,只要跑一遍回归测试,锚点不一致会立刻失败。标准答案不需要背,测试替你记着。
四、参考表一致性设计:代码和文档"共用同一张表"
排盘工具最常见的"文档与结果对不上",源于文档一套表、代码另一套表。bazi-skill 的做法是:
- 藏干表:代码里的地支藏干常量直接标注"与 references/wuxing-tables.md 同一张表"(CANGGAN);
- 十神:推导规则与参考表中的十神推导规则(十神定义及生克关系)一致,以日干为基准;
- 神煞:天乙、驿马、桃花等 20 余项查法常量(TIANYI 等)与 references/shensha-table.md 同口径,测试用例
test_shensha_table_driven专门回归这一条(链接)。
这样文档就是代码的"人话版":用户拿排盘结果对照 references/wuxing-tables.md 里的十神、藏干表,一定能对上号。
同时,SKILL.md 明确规定:四柱、大运、流年、神煞一律以脚本输出为准,禁止口算或凭记忆中的万年历改盘——人机两侧用同一口径,从流程上杜绝"AI 自由发挥改盘"。
五、新手如何亲自验证一遍?
整个过程只需两行命令,本机有python3(3.6+)即可,无需 pip 安装任何东西:
# 1. 跑黄金用例回归测试,看到 OK 即说明排盘正确 python3 scripts/test_pai_pan.py # 2. 亲手排一个盘,对照测试结果 python3 scripts/pai_pan.py --solar 1990-05-15 --shichen 午 --sex 男第二步输出的四柱应当是 庚午 / 辛巳 / 庚辰 / 壬午,大运方向为顺排,与回归测试的断言完全一致。
六、这套设计对普通用户意味着什么?
- 边界不糊弄:立春前后、节气交界出生,脚本会给出警告并严格采用一套年柱/月柱,不会让你面对"两种可能";
- 时柱不确定也有明确行为:只做六字分析,不瞎猜时柱(SKILL.md 边界情况表);
- 结果可复查:任何一次排盘,你都能用 references/ 下的对照表(五行十神、时辰、大运、神煞)逐项核对;
- 改错有护栏:未来若有人修改算法,11 个黄金用例就是护栏,回归不通过就不能发布。
一句话总结:bazi-skill 用"锚点命例 + 回归测试 + 代码文档同表"三层设计,把八字排盘里最容易出错的节气分界、子时日界、大运顺逆、神煞查法全部钉死在可验证的标准答案上——这就是它排盘不会错的原因。
命理分析仅供传统文化学习与娱乐参考,请理性看待。
【免费下载链接】bazi-skill四柱八字命理分析项目地址: https://gitcode.com/gh_mirrors/ba/bazi-skill
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考