文章摘要
文章核心内容:当前Python类型检查器众多(如Mypy、Pyright等),给库维护者带来负担。作者建议优先在测试套件中运行多种类型检查器,而非仅检查源代码,因为用户更关注公共API的交互体验而非内部开发实践。正确的做法是至少对源代码运行一个类型检查器,但重点应放在测试代码的类型检查上。
文章总结
标题:现在真的需要同时运行五种类型检查器吗?
文章核心内容:
- 现状与问题:
- Python生态中存在多种类型检查器(Mypy、Pyrefly、Pyright、ty、Zuban等)
- 库维护者面临选择困境:是否需要在代码中同时支持所有检查器
- 关键建议(逆向思维):
- 常见误区:只在源代码上运行类型检查,而忽略测试套件
- 正确做法:优先在测试套件上运行多种类型检查器,源代码只需保证至少一种
- 原因:用户更关心公共API的类型安全性,而非内部实现细节
- Polars案例研究:
- 该数据科学库通过添加Pyrefly支持时发现:
- 需要修改部分代码实现
- 发现了一个中等优先级bug
- 但多检查器支持导致代码出现大量类型忽略注释(示例显示7行代码需要4个不同注释)
- 解决方案:确保主要检查器都能正确处理公共API的测试用例即可
- 类型检查器差异:
- 不同检查器在规范模糊处有不同设计倾向:
- 严格派(如Pyrefly):宁可误报也要防范潜在错误
- 宽松派:允许渐进式类型标注
- 推荐Pyrefly因其严格性、速度和规范符合性
- 最终建议:
- 不必强求源代码支持所有5种检查器
- 应将精力集中在确保测试套件能通过多检查器验证
- 这样既能保证用户体验,又可避免代码污染
(注:删减了部分技术细节和外部链接,保留了核心论证逻辑和典型案例)
评论总结
以下是评论内容的总结,按主要观点分类呈现:
【Python类型系统的争议】 1. 反对Python类型检查的观点: - 认为Python类型系统是临时拼凑的,运行多个类型检查器很荒谬(评论5) "The fact that this article seems to honestly recommend people run 5 different type checkers..."(评论5) - 类型爱好者正在"毁掉"Python,类型系统像是被强加的议程(评论9) "the type-addicted people are ruining python"(评论9)
- 支持严格类型检查的观点:
- 建议直接改用静态类型语言以获得性能优势(评论3) "wouldn’t it be best to switch to a statically typed language..."(评论3)
- Python类型系统不成熟,不适合大型代码库(评论11) "I find it immature and not well-suited for large codebases"(评论11)
【开发工具选择】 1. 对现有工具的不满: - 批评mypy速度慢且功能有限(评论8) "It is dog slow as well as being the laziest of all..."(评论8) - 测试套件中运行类型检查器的建议不切实际(评论4) "the suggestion does not really make sense"(评论4)
- 工具推荐:
- 推荐uv和ty工具链(评论13) "Everything that isn't uv, ty, ruff is wrong..."(评论13)
- 对pyrefly类型检查器持观望态度(评论10) "dont feel like giving another typechecker a chance..."(评论10)
【其他争议】 1. 对博客内容的批评: - 指责文章使用AI写作和点击诱饵标题(评论6) "a lot of the writing is pure AI style...that click-bait style"(评论6) - 质疑用户是否真的关心类型检查器的一致性(评论7) "Why would users care if you're using the same type checker..."(评论7)
- 语言比较:
- 认为强类型编译语言现在更有优势(评论1) "Strongly typed, compiled languages have never been easier..."(评论1)
- 以PHP为例说明类型系统应该更早引入(评论11) "look at the features released in the last 6 or so years..."(评论11)
- 特殊用例讨论:
- 对eq返回非布尔值的做法表示困惑(评论2) "Why would you ever want a == b to not return a bool??"(评论2)