Skip to content

与 2002 年的 ChinesePython 对照 ​

★ ChinesePython 这个名字不是新的 —— 2002 年有人用过它 (基于 Python 2.1.1,改了 parser 与报错)。这里是 2026 年的第二次实现。 下面这份对照是逐文件数出来的,不是听说的。

对照的是 2001–2002 年那份真实源码(作者 Glace,基线 Python 2.1.3)。

不是听说的,是逐文件数出来的。

一、一句话区别 ​

那一版改的是「解释器自己说的话」;这一版先把「名字」改掉。

2002 版这里
基线Python 2.1.3CPython 3.14.7
关键字直接改进 Grammar/Grammar(繁体,约 24 个)Tools/peg_generator/pegen/zh_keywords.py → 并进生成表,35 硬 + 3 软,简繁不论,全用简体
报错文案硬编码在 C 里(errors.c 15 处、pythonrun.c 57 处、traceback.c 8 处…)显示层翻译,CHINESEPYTHON_ERRORS 可一键还原
回溯改了 Python/traceback.c 的格式串改了 Lib/traceback.py 的渲染,str(e)/e.args/type.__name__ 一律不动
方法别名直接往类型里塞(str 44 个、list 9 个、file 14 个)234 条,查表层(不塞 tp_dict)
内置名改了 bltinmodule.c(3792 个汉字)74 条别名,英文名一个不少
异常类名保持英文,只翻 exceptions.c 里的 docstring类名保持英文;另给 72+13 个别名(except 中文名 接得住)
显示能不能还原不能 —— 中文直接替换了英文能,=en 完全还原
库加了自己的 Lib/chdict/;Lib/ 基本没动Lib/ 是显示层 + 深拷贝派生的独立汉语库(文本折行/统计)
规模改 243 个文件、加 65 个上游 Python/ 仓 30+ 个文件改动,产品仓 40+ 个工具/文档

二、那一版做到了什么(值得敬重的地方) ​

  1. 真的改进了语法层:Grammar/Grammar 里写的是 'def' | '函數' | '定義',注释还留着 # Modified by Glace. Chinese keywords added. 06/2001。
  2. 两种编码都支持:文件头 #--BIG5-- / #--GBK-- 标记,配套 Include/chineseencode.h。2001 年的 Windows 上这是必须的。
  3. 异常类名一个都没动 —— 跟这里的红线完全一致。它翻的是 Python/exceptions.c 里的 docstring。
  4. 报错文案是真·硬编码进 C 的,Python/errors.c 15 处、pythonrun.c 57 处、 tokenizer.c 10 处、traceback.c 8 处。
  5. 它自己写了一份路线图 chinese/howto.txt,如实列了没做完的事。

三、那一版没做到什么(它自己的 howto.txt 里写着的) ​

  • Objects/ 里那些「友好的 dunder」没做;
  • 方法别名只做了 str/list/file 三个类型;
  • compile.c / ceval.c / exceptions.c / errors.c / modsupport.c 里还有大量英文报错没翻;
  • 内置函数没有中文名;
  • Lib/ 没有中文文件;
  • __doc__ 没有翻译。

这份「没做完」清单,正好就是这里这几个月在做的事。

四、最关键的一个差别:能不能还原 ​

那一版的 Lib/traceback.py 跟原版 逐字节相同(10589 → 10589,0 个汉字)—— 因为中文直接替换在 C 里,Python 层根本没插手的余地。后果:

  • 没有显示层,也没有英文回退;
  • 想让报错变回英文?只能重新编一份解释器。

这里反过来:中文只在显示时出现,str(e) / e.args / type.__name__ 一个字没动, CHINESEPYTHON_ERRORS=en 一键还原。代价是「中文」这一层要靠渲染来做, 好处是老代码和第三方库永远不会因为汉化而坏。

五、名字上有没有继承 ​

故意不一样的多,一样的少。 一样的只有三个:

英文2002 版这里
def定義定义
pass忽略略过
assert斷言断言

故意不同的(这里都是简体 + 按「原名有没有英文对应」重定):

英文2002 版这里为什么
if如如果「如」单字太短,容易跟标识符撞
break中斷跳出跟 continue 成对
return傳回返回更常见
import載入导入跟 from→来自 成对
while只要每当「只要」有歧义
class概念/類別类型跟 type 的软关键字统一
lambda匿名函數匿名函数简体

一句话:那一版是繁体、按 2001 年的用词习惯定的; 这里是简体、按「运算符/关键字原本有没有英文对应」这条铁律重新定的, 并且全都记在 本项目的名字总表 里,860 条,改哪一条都有据可查。

六、这一版比那一版多出来的东西 ​

  1. 总判据:拿 CPython 自带的 Lib/test 做三方对照(原生 / 英文模式 / 中文模式), 「我们改坏的」必须恒等于 0。那一版没有这种判据(2001 年也没这个条件)。
  2. 项目仓库:860 个中文名字,750 个被自动探针真调过一遍, 未覆盖的 110 个逐条写原因。那一版只有「加了多少个汉字」。
  3. 一键还原(CHINESEPYTHON_ERRORS=en/both)。
  4. 汉语库:文本折行 / 统计 —— 英文名和中文名同一个对象, 官方 Lib/test/test_textwrap.py 68 个用例、test_statistics.py 399 个用例照跑。
  5. 决策记录:相关记录 到 相关记录,每条都写「谁在守它、想改要动哪里」。

七、说句公道话 ​

2001 年,没有 GitHub 上随手可查的 CPython 源码,没有 3.14 的 ast 模块, 没有 32 核并行跑 1148 个测试文件的机器 —— Glace 是一个人硬改 C 源码做到的。 它留下的 howto.txt 那份「没做完清单」,二十多年后还有人照着往下做, 这件事本身就很了不起。

原创部分:自定义许可(源码可见 · 禁止再发布)· 联系作者 QQ:1396257961