炼数成金 门户 大数据 Python 查看内容

让你的代码给自己写类型注释:MonkeyType

2018-1-12 10:55| 发布者: 炼数成金_小数| 查看: 5195| 评论: 0|来自: Python程序员
摘要: 在Instagram,成百上千的工程师开发了超过百万行的python3代码。每天都有新的工程师从其他项目或其它语言转过来加入团队,这些人需要迅速熟悉并利用代码库来提高效率。同时每天我们都不断地发布代码到生产环境,每隔 ...
数据库 Python 测试 Hadoop 开源
今天,我们激动的宣布将MonkeyType项目开源,通过可见类型的实时追踪,MonkeyType能够为python3代码自动添加类型注解。

动机
在Instagram,成百上千的工程师开发了超过百万行的python3代码。每天都有新的工程师从其他项目或其它语言转过来加入团队,这些人需要迅速熟悉并利用代码库来提高效率。同时每天我们都不断地发布代码到生产环境,每隔几分钟就会发布一次,并持续一整天的时间。因此,我们想要让新的开发者更容易阅读和理解我们的代码,同时便于进行静态分析以缩减可能出现缺陷的范围。类型注解和静态类型检查适合该情况。

写新代码的时候使用类型注解很简单;大多数工程师一上来就想到用它。但是如果想让添加类型注释的工作有所回报,那么你的类型注释必须覆盖到足够大比例的代码,尤其是核心库。换句话说,我们有太多的现存代码需要添加类型注解。

我们手动添加类型注解的方法让人失望。注解一个模块就可能花费几个小时,有时还要仔细的跟踪多层次的函数调用和对象来理解在调用时可能的类型。(当然,这是任何人在试图维护函数时都可能经历的;这也是我们想添加类型注解的原因!)

因此我们编写了MonkeyType。让测试套件或者(更好的)你的生产系统来告诉你真实的类型,而不是在那里猜测或者探查。

用法
听起来很棒!我已经运行了“pip install monkeytype”。下一步呢?
在MonkeyType提供有用信息之前,我们需要让它跟踪函数调用。做这件事的最简单的方式是使用“monkeytype run”,该命令会在MonkeyType跟踪下运行Python脚本。例如,可以轻而易举的在MonkeyType下运行测试套件:
(或者“monkeytype run `which pytest`”,或者任何你喜欢的命令)
在测试运行的同时,MonkeyType检查每个函数调用的参数类型和返回/生成类型,并在数据库中记录它们。(默认情况下,MonkeyType将它们保存在本地SQLite数据库,但是正如MonkeyType做的所有事,这也是可配置的。)

当然,测试套件可能没有提供很好的类型信息-有时测试并不使用真实的类型,而且我们发现很多这种情况,像类型检查显示偶然情况下测试传递不同于生产环境的类型。因此如果不想基于测试套件做注解,可以在实时运行的生产环境记录跟踪调用情况。针对这种情况,MonkeyType提供了上下文管理API:
如果需要更大的弹性,你可以创建自己的CallTracer,使用sys.setprofile()来安装,完成之后就可以删除了。

一旦完成了调用跟踪的记录,就可以为任意模块生成一个stub文件:
如果stub文件合理并且想要直接将注解应用到代码,MonkeyType也可以做到:
审阅在some/module.py中已经注解过的代码,更正之后,提交。
由于后备存储设计,不需要一次性跟踪记录和注解代码。你可以经过一段长时间的收集并记录到数据库,然后在一切准备好之后逐步地从收集的数据给越来越多的模块注解。

使用可配置的类型重写器,您可以轻松地调整MonkeyType生成的类型注释为您代码库中的推荐类型注释样式或特定边界用例。
要知道客户化选项的更多细节,请查看文档。

开源
检出代码,快速浏览,然后告诉我们你的想法!我们期待你的缺陷报告和改善建议。如果你愿意贡献,我们在问题追踪部分有一个新手建议任务的列表。

MonkeyType要求Python3.6以上版本,只生成Python3风格的类型注解(没有类型注释)。如果你不十分清楚,可以从Pycon 2017 keynote着手,它告诉你我们去年是怎样将几百万行代码迁移到python3.

在Instagram是如何使用MonkeyType的?
我们挑选生产环境网页请求的一个小的随机样本,通过Django中间件开启MonkeyType跟踪。从Facebook数据分析平台-SCUBA使用自定义的CallTraceStore来存储和检索跟踪信息。我们不间断的运行跟踪,因此总是从生产环境添加新的类型追踪。因为生产环境代码时常改动,这样做让跟踪信息总是的。

无论何时,工程师像给一个模块添加类型注解,只需运行“monkeytype stub”,然后“monkeytype apply”,修改好新注解显示的类型错误,最后提交差异即可。

结论
借助Monkeytype的帮助,我们已经将代码库中三分之一的函数进行了注解,并且见证了类型检查在代码上线前抓出了许多缺陷。百分百让你满意!

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

  GMT+8, 2018-1-19 04:43 , Processed in 0.094846 second(s), 26 queries .