types-paddle: 为 Paddle 增加 Tensor 类型注释特性
Paddle 中没有 Tensor 类,导致在 IDE 中写代码时没有办法进行智能提示,我提供了一个解决方案。
思路
修改已安装 Paddle 包的
paddle/tensor/tensor.py
文件,添加未实现的Tensor
类。添加
tensor.pyi
文件到 paddle 包当中,从而实现代码智能提示。
类型注释的三种解决方案
在 python 当中有三种方式给代码提供类型注释,从而让 IDE 能够实现智能提示:
直接在代码中写上类型注释
此方法也是在 python3.7+中最为推荐的方式。
原代码中并没有类型注释,便在包中添加
pyi
文件
什么是
pyi
文件?可理解为python interface
文件,为某个 python module 提供接口定义信息。
此情况下,pyi 文件名必须和 py 文件名一致,这样浏览器在加载原始文件类型信息时,直接从 pyi 文件中加载。其中PyGithub就是使用这种方式来提供类型注释。
作者不想把 pyi stub 文件添加到包中
如果每个文件都要添加一个 pyi 文件,则代码文件数量直接增加一倍,这将会增加维护的难度,于是可将 pyi 文件通过第三方包发布。 详细原理可阅读PEP 561 – Distributing and Packaging Type Information
为什么选择这个解决方案?
面临的问题
我最初的做法也是使用第三种方法,可是发现如果用第三方包发布的话,paddle 的所有类型提示将会从我的包走:也就是说我要给 paddle 所有的 module 都添加上 pyi stub 文件。 这工作量很大,而且很多模块都在发生变动,我没有办法及时获取到最新的变动,很容易导致版本接口不兼容的问题。
解决方案
于是,我返回使用第二种方法,只是使用types-paddle
来修改 paddle 包从而支持类型注释。
pyi 是如何生成的?
其中最核心的模块属于 pyi 文件是如何生成的?毕竟这个代表着Tensor
所有类的所有属性:根据runtime Tensor
来生成,伪代码如下所示:
详细可见:gen_tensor_stub.py
这个包的未来
我相信,未来 paddle 肯定是会支持类型注释的,毕竟原始paddle/tensor/tensor.py
文件已经写上了TODO
。只是该特性还没有完成的时候,这个工具可以提升大家的编码体验。
希望这个工具能够让大家写 paddle 越来越爽。
参考资料
版权声明: 本文为 InfoQ 作者【吴京】的原创文章。
原文链接:【http://xie.infoq.cn/article/ca3db51f89fcc1c62375b6f44】。文章转载请联系作者。
评论