Skip to content

Commit dd7aa4a

Browse files
authored
Tensor类型注释解决方案 (#293)
* 添加Tensor类型注释解决方案
1 parent ad32bd1 commit dd7aa4a

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

pfcc/call-for-contributions/README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@
88
- [flake8 代码风格检查工具的引入](code_style_flake8.md)【进行中】
99
- [clang-tidy 代码风格检查工具的引入](code_style_clang_tidy.md)
1010
- [Python 2.7 相关代码退场](legacy_python2.md)
11+
- [Type Hint类型注释](type_hint.md)
1112

1213

1314
## Project Ideas
1415

1516
一些在社区发现的可以进行贡献的想法,先简单的记录在这里。需要先把这些想法明确成社区的项目描述,来方便开展具体的开源贡献项目。
1617

17-
#### Idea: Support Type Hinting
18-
19-
See [#45979](https://github.com/PaddlePaddle/Paddle/issues/45979)
2018

2119
#### 建设更多的Tutorial
2220

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Type Hint for Tensor
2+
3+
> this project will be mentored by [@wj-Mcat](http://github.com/wj-Mcat)
4+
5+
## 背景
6+
7+
在深度学习代码中充斥这各种`Tensor`,可是Python是一门动态编程语言,如果不给变量添加类型,IDE将无法进行智能提示,故Type Annotation(类型注释)对于提升编程体验至关重要。然而,在Paddle框架当中的Tensor对象直接是通过`pybind11`将C++`Tensor`类型暴露给外部开发者,并没有对应的类型信息,故无法进行静态类型推断或动态stub file等操作。
8+
9+
为了给Paddle的Tensor添加类型注释的功能,可使用stub-file相关技术来实现此功能。
10+
11+
## Type Hint技术调研
12+
13+
实现Type Hint的场景大概有三种:
14+
15+
1. 直接在代码中添加类型注释(inline type annotation)。
16+
2. 保证原始代码不变,通过stub file的形式添加类型提示(stub file in package)。
17+
3. 对pacakge不做任何改动,通过第三方package的形式来给Paddle添加类型注释(distributed stub file)。
18+
19+
### 分析
20+
21+
1. inline type annotation
22+
23+
这种方式需要实现`paddle/tensor/tensor.py`中的TODO,具体解决方案目前看来工作量较大,难以实现。
24+
25+
* 优点:
26+
* 使用最佳推荐方法
27+
* 代码的可阅读性也最好
28+
* IDE 友好型,天然支持类型提示
29+
* 缺点:
30+
* 工作量比较大。
31+
* 相当于调整了`Tensor`对象的实现方式,存在一定的潜在风险。
32+
33+
推荐Paddle主库中的新模块代码都添加类型注释。
34+
35+
2. stub file in package
36+
37+
这种方式只需要在需要添加类型注释的module同目录下添加对应的stub file(`.pyi`文件)即可。
38+
39+
* 优点:
40+
* 工作量比较小
41+
* 可最小程度上支持`Tensor`的类型提示
42+
* 缺点:
43+
* 临时解决方案
44+
* 增加代码文件数量(如果只是支持Tensor智能提示的话,只需要增加一个文件即可)
45+
46+
针对于此方式,我已经实现了一个解决方案:[types-paddle](https://github.com/wj-Mcat/types-paddle),也与Paddle有一个[讨论](https://github.com/PaddlePaddle/Paddle/issues/45979),感兴趣的小伙伴可以看看。
47+
48+
3. distributed stub file
49+
50+
此方法即使用第三方库的形式来给Paddle添加类型注释,并IDE中所有模块的代码智能提示都从该第三方package当中走,不会扫描和加载原始Paddle库。
51+
52+
* 优点:
53+
* 代码智能提示的速度会非常快
54+
* 对主库不存在任何改动
55+
* 缺点:
56+
* 需要安装第三方库才会生效
57+
* 需要与主库当中的API保持严格一致,不然IDE会识别不到新特性,此时产生的工作量将是:同时维护两个package。
58+
59+
其中 [@SigureMo](https://github.com/SigureMo)给出了[paddlepaddle-stubs](https://github.com/cattidea/paddlepaddle-stubs)解决方案。
60+
61+
***
62+
63+
综合考虑以上三种解决方案,推荐使用第二种。
64+
65+
## 可行性分析和规划排期
66+
67+
1. 需要python3.7+版本支持,而Paddle也正在放弃对于python3.6的支持。
68+
2. 从技术的角度而言,通过stub file的方式添加类型注释是最简单的。
69+
3. 从改动存在的潜在风险而言,stub file的方式对于代码运行不存在任何影响。
70+
4. 从工作量而言,stub file可自动生成,也可以人为编辑,工作量适中。
71+
72+
## 参考链接
73+
74+
* [Introduction of Stub File](https://mypy.readthedocs.io/en/stable/getting_started.html#stubs-intro)
75+
* [PEP 484 – Type Hints](https://peps.python.org/pep-0484/)
76+
* [PEP 561 – Distributing and Packaging Type Information](https://peps.python.org/pep-0561/)

0 commit comments

Comments
 (0)