从Python源代码中的Sphinx注释派生类型注释
kutuzov的Python项目详细描述
什么?在
从Python源代码中提取类型注释,这些源代码使用Sphinx兼容的docstring编写。在
为什么?在
现有的工具如PyAnnotate需要编写一个驱动程序来运行应用程序,而一个特殊的钩子收集类型信息并将其转换为注释。 这很好地工作,但需要花费大量精力来编写一个涵盖整个应用程序的全面驱动程序。在
如果应用程序的docstring中已经有类型信息,那么直接将这些信息转换为注释可能更简单。 库图佐夫会帮你的。在
怎么做的?在
库图佐夫这样做:
- 扫描包和子模块中的docstring
- 解析docstring,提取每个参数的类型信息
- 编写与PyAnnotate兼容的JSON文件
剩下的是:
- 运行PyAnnotate并使用生成的JSON文件
- 手动调整结果
- 利润
你需要做的调整量可能会有所不同。 它很大程度上取决于docstring的质量和准确性。在
示例
我们会给示例.py文件。 您需要pyannotate(pip install pyannotate)才能继续。在
$ python -m kutuzov example.py > type_info.json $ cat type_info.json [ { "func_name": "Dog.__init__", "line": 2, "path": "example.py", "samples": 1, "type_comments": [ "(str) -> None" ] }, { "func_name": "Dog.bark", "line": 16, "path": "example.py", "samples": 1, "type_comments": [ "(str) -> str" ] } ] $ pyannotate example.py --py3 Refactored example.py --- example.py (original) +++ example.py (refactored) @@ -1,5 +1,5 @@ class Dog: - def __init__(self, name): + def __init__(self, name: str) -> None: """ :param str name: The name of this dog. """ @@ -13,7 +13,7 @@ """ return self._name - def bark(self, language='en'): + def bark(self, language: str = 'en') -> str: """ Make some noise! Files that need to be modified: example.py NOTE: this was a dry run; use -w to write files
你可能已经注意到了[示例.py](示例.py)主线中已经包含了一个PyAnnotate驱动程序。在
^{pr2}$如果将其与之前生成的JSON进行比较,就会发现它基本上是相似的。 最大的区别是Kutuzov错过了name属性——它还不知道如何处理这些属性。在
名字里有什么?在
Mikhail Kutuzov是{a3}的同时代。 一张particular painting描绘了拿破仑在狮身人面像之前的样子。 当然,Sphinx是我们所有人都喜欢的Python文档需要的项目。在
这个项目的部分灵感来自sphinx.ext.napoleon,它做了一些类似的事情,但是使用了不同的docstring格式。在
- 项目
标签: