python pyre
Pyre这个东西说实话在国内讨论的并不多。有些人可能把它和Pyright搞混毕竟名字长得有点像。不过如果你在处理超大型Python项目或者团队里有那么几个同事总喜欢写一堆动态类型然后跑出奇怪的运行时错误Pyre可能比你想的有用得多。先说说Pyre是什么。它本质上是一个静态类型检查器由Facebook现在叫Meta开发的。你可能第一反应是“哦又一个类型检查工具”但Pyre的定位比较特殊。它不是像mypy那样单纯为了给你报类型错误它从一开始就是设计来支撑Meta内部那些天文数字级别的Python代码库的。所以它的核心卖点其实是速度——它用OCaml写的类型推理引擎硬生生比纯Python实现的工具快一个数量级。这一点在代码量上千万行的时候特别明显普通IDE的补全都能卡住Pyre反而能流畅跑完。它能做什么其实和mypy差不多但有几个细节做得很不一样。比如Pyre支持增量检查——你改了哪个文件它只重新分析相关的部分而不是全量扫一遍。这在日常开发中很实用特别是你开着watcher后台运行时改完代码几乎瞬间就能看到类型错误。另外Pyre对属性检查更严格一些有时候mypy能放过的边界情况Pyre会揪出来。举个例子mypy处理Union类型时的类型窄化有时候会漏掉一些分支Pyre的处理方式更贴近真实运行时行为。使用Pyre其实比想象中的简单。安装就是pip install pyre-check然后项目根目录下跑pyre init生成一个.pyre_configuration文件。这个配置文件其实很关键很多人装完直接就跑如果项目结构复杂不配置文件路径的话Pyre会找不到源码。一般需要指定source_directories和workers并行数量。然后跑pyre check就完了。不过说实话命令行跑检查用得不多大部分人还是用编辑器集成。Pyre有LSP服务器叫pyre-language-server配合VSCode或者Neovim效果挺好。启动后它会在你打字的时候实时反馈类型问题比手动跑命令方便很多。最佳实践这块有几个点值得注意。第一是配置文件的search_path如果项目依赖了一些自建的包或者vendor目录里的代码一定要加进去否则Pyre会把它们当作any类型检查效果大打折扣。第二是严格模式Pyre默认的“off”模式只检查显式标注了类型的函数如果想对全局生效把配置里的strict设为true。但小心如果你接手的是旧项目突然开严格模式报错能刷满屏幕。第三是增量检查的缓存Pyre会在~/.pyre或者项目目录下生成缓存文件这些缓存有时候会过时导致奇怪的行为如果遇到“我明明改了代码它还报旧错误”的情况删掉缓存文件重新跑就行。和同类技术对比的话主要对手是mypy和Pyright。mypy是社区最常用的生态成熟文档丰富但确实慢尤其大项目里增量检查几乎等于没有。Pyright是微软做的用TypeScript写速度比mypy快不少而且对Pylance支持很好。但Pyright在类型窄化时的行为有时候不够符合直觉比如处理isinstance判断后的类型推断偶尔会漏掉一些情况。Pyre的处理方式就更像程序员自己写的分析逻辑——它假设你标注的类型是有意义的然后基于这个前提做推断。换句话说如果你代码里类型标注比较规范Pyre体验非常好如果你习惯写动态类型Pyre会逼着你补标注不然它就不干活。非要说缺点的话Pyre的文档是真拉垮。Meta内部文档很详细但对外的不够社区案例也比较有限。另外它对第三方库的支持不如mypy全面mypy有stubs库社区维护Pyre如果要检查外部包的类型你经常得自己去写stub。还有一个实际的问题——Pyre的增量检查在缓存命中率高的时候很快但第一次全量扫描或者缓存丢失的时候有时候会比Pyright还要慢因为底层OCaml的启动速度不比JavaScript快。如果你手头的项目是那种几千行代码的小工具mypy完全够用甚至Pyright更省事。但如果你的代码库大到一个状态机就能跑两三分钟或者你的团队成员习惯写各种复杂的泛型和Protocol那Pyre值得试一把。它那种“我假设你的类型是对的然后看你能跑多远”的风格对工程化的项目来说更省心。当然前提是你愿意花点时间读它那本写得像技术规格说明书一样的文档。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2566616.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!