从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格式。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX 2.2字体呈现有问题   java如何从html文本中获取img url   java Spring数据REST存储库404   java从jar文件复制目录   java Spring引导无法满足自定义JPA请求   hadoop将值从Java操作传递到Oozie工作流中的下一个Java操作   java如何修复“Android资源链接失败”?使用NavigationView和片段   c3p0数据源的java独立日志文件   java如何从BufferImage生成图像   java JDBC SQL SELECT查询和方法运行不正常   从Android Studio中的java类获取资源   java EclipseLink MySQLSyntaxErrorException找不到错误   java我应该如何在mysql数据库中自动存储我的gps坐标?   ApacheFlex应该为BlazeDS实现Java DTO的可序列化   java为什么我的组件彼此相邻?   java在dao层中的多种方法   具有可配置凭据的java Spring WebServiceClient   java如何在Spring Boot中获取每个请求中的当前用户?