[Typing] 添加 `libpaddle` 的 stub 文件生成脚本
PR Category
User Experience
PR Types
Improvements
Description
添加 libpaddle 的 stub 文件生成脚本。
使用工具 pybind11-stubgen 生成 libpaddle 的 stub 文件。
有几点需要注意的:
-
没有在
python/paddle/base下直接生成libpaddle文件夹(内含 stub 文件)主要原因是,一旦这个文件夹被污染,则极有可能程序中无法正常导入
libpaddle模块。 因此,将生成的文件统一放到了python/paddle/_typing/libs目录下,这里以后也可以放置其他 pybind11 的 C++ API 相应的 stub 文件。 -
patch 了
pybind11-stubgen中Printer的方法,主要目的是,使pyi文件消除语法错误,以可以正常进行mypy检查主要改动为:
-
对于
Printer中的print_xxx方法,如果输入参数中的name不合法,则会在name后添加_。这里主要应对 C++ 中有参数用的
in作为输入参数,因此修改了输入参数名,如in改为in_。影响是,使用kwargs的方式调用的时候可能会发现输入参数名不对。另外,发现有个函数名是assert,也改为了assert_,这个函数是没法直接调用了(静态检查的时候)~ 整体上来说感觉影响不大 ~ -
对于
Printer中的print_invalid_exp方法,由直接输出不合法的名称,改为通过引号引用。如
def dist_config(self) -> paddle::DistConfig改为了def dist_config(self) -> "paddle::DistConfig":。改动前的代码是存在语法错误的,改动后的语法正常,而在类型检查时转为了Any。这类错误主要是 pybind11 使用不当引起的 ~
-
-
与
Tensor.pyi一样,会在paddle_binary_dir和paddle_source_dir中同时添加。
大体看了一下生成的文件,出问题的地方基本都是 pybind11 使用不当导致的,整体来看可用性还行?!~
关联
- https://github.com/PaddlePaddle/Paddle/issues/63597
- https://github.com/PaddlePaddle/Paddle/issues/65008
@SigureMo
你的PR提交成功,感谢你对开源项目的贡献! 请关注后续CI自动化测试结果,详情请参考Paddle-CI手册。 Your PR has been submitted. Thanks for your contribution! Please wait for the result of CI firstly. See Paddle CI Manual for details.
Update 20240724
-
增加
libpaddle.pyi,使其指向paddle._typing.libs.libpaddle由于
paddle.__init__.py本身没有导入base,而生成的pyi里面会用到import paddle.base.libpaddle,所以,增加libpaddle.pyi文件,这样逻辑上也清楚一点吧 ~ -
增加/更新
core.pyi_C_ops.pyi,使其指向paddle._typing.libs.libpaddle及子目录貌似这两个文件基本上就是抽取了
libpaddle里面的东西?
另外,计划通过解析 ops.yaml 完善 libpaddle 中 ops 的标注,也就是 _C_ops 中的标注。目前 ops 还都是 def abs(*args, **kwargs): 的形式。
Update 20240724 parse ops
- 增加
ops的解析,覆盖pybind11-stubgen生成的python/paddle/_typing/libs/libpaddle/eager/ops/__init__.pyipython/paddle/_typing/libs/libpaddle/pir/ops.pyi
目前测试可以推导 _C_ops 中相关内容
但,仍存在不完整的情况,如 paddle/_typing/libs/libpaddle/pir/ops.pyi 中的 add ,这部分暂时没找到好的解决方案 ~
Update 20240725
目前 patch 之后,大部分错误和 warning 可以解决,仍存在:
- 找不到合适的 mapping ,如
paddle::dialect::OperationDistAttribute - 不方便 patch 的地方,如
TypeGuard[xxx]
可以推进:
- 有没有其他需要注意的地方
- 以及
pybind11-stubgen的 req 放在哪里?
Update 20240726
-
将 bad expression 转换为
typing.Any,如paddle::XXX->typing.Any这样,生成的 stub 文件中已经消除掉所有的错误信息
-
去掉
paddle.__init__.py对于libpaddle的导入导入关系的修改可以考虑放到另一个 PR 里面,以及
paddle._typingpaddle._typing.libspaddle._typing.libs.XXX等导入关系是否建立,都可以另提 PR 讨论
Update 20240731
- 修改 setup 中对于 requirements 的过滤行为
记得合入前需要实现这个机制,并验证下(unzip wheel 包查看 dist-info 里的 METADATA 就可以看到依赖项了)
安装包中已无 pybind11-stubgen
Sorry to inform you that 7175f55's CIs have passed for more than 7 days. To prevent PR conflicts, you need to re-run all CIs manually.
Update 20240830
依赖 https://github.com/PaddlePaddle/Paddle/pull/67868 修复示例中类型标注的问题
在本 PR 中修复此问题 ~