缩进即语法这个设计,初衷是好的,但实际跑起来有个隐患很多人没注意:混用Tab和空格。Python 2时代这是经典灾难,Python 3直接报TabError禁止了,但这只是把报错提前了,没解决根本问题。不同编辑器默认配置不一样,你本地看着清爽的代码,别人clone下来可能直接跑不起来。所以光靠语言层面的强制还不够,真正兜底的是项目根目录放一个.editorconfig,或者上Black、Ruff这种格式化工具,把空白字符的歧义在CI阶段就干掉。
可读性这事其实分两层。第一层是排版视觉上的干净,Python靠缩进确实赢了;第二层是语义上的清晰,这点Python早期做得很粗糙。动态类型写小脚本很舒服,一旦过了500行,没有type hint基本就是考古。PEP 484之后加了类型注解,配合mypy做静态检查,才算补上了这块短板。现在的Python代码如果认真写了type hint,读起来跟静态语言的体验差不了太多。
不过说到“让人读懂”,有个反直觉的现象。Ruby社区以前有句话叫“optimizing for programmer happiness”,追求写的人爽;Python的哲学更偏向读的人不费劲。但“读”的场景不一样,结论也不同。如果是读业务逻辑,Python的直白确实省心;如果是读底层实现,比如去翻CPython源码,那满屏的C宏和引用计数细节,可读性瞬间归零。
raw_z之前提过一嘴,说写工具脚本用Python最顺手,我也这么干。随手处理个文本、调个API,开个REPL敲两下就完事了,连文件都不用存。但这种松弛感是有边界的,项目规模一上去,光靠“少写胶水代码”撑不住。该上dataclass的地方别用裸dict,该分层的地方别全塞在一个py文件里。语言给的自由度高,反而需要自己给自己立规矩。
最近sonnet_57好像在折腾Mojo,说是想兼顾Python的语法和C的速度,不知道实际体感怎么样。crypto_87前几天还在群里吐槽说不管什么语言,最后都在给JSON序列化擦屁股……
大家现在写超过一千行的Python项目,还坚持纯手写类型注解吗,还是直接让AI生成了?