关于python:根据PEP257自动检查文档字符串样式的工具

Tool for automatically check docstring style according to PEP257

像pep8这样的工具可以检查源代码样式,但是根据pep257和pep287,它们不检查docstring是否来自格式化。有这样的工具吗?

更新

我决定自己实现这样一个静态分析工具,见:

https://github.com/greensteam/pep257

现在,大部分的PEP257都被覆盖了。设计受到上述PEP8工具的严重影响。


我不知道任何用于python文档字符串的静态分析工具。我刚开始和皮林特合作不久就开始建造一座,但很快就放弃了。

pylint有一个插件系统,如果你想把这项工作放到PEPS可执行程序中,就可以使用一个文档字符串插件。

pylint"插件"被称为checker,有两种形式:一种是将源文件作为原始文本文档使用,另一种是将其作为AST使用。我从AST开始尝试。回想起来,这可能是个错误。

以下是我的经历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class DocStringChecker(BaseChecker):
   """
    PyLint AST based checker to eval compliance with PEP 257-ish conventions.
   """

    __implements__ = IASTNGChecker

    name = 'doc_string_checker'
    priority = -1
    msgs = {'W9001': ('One line doc string on >1 lines',
                     ('Used when a short doc string is on multiple lines')),
            'W9002': ('Doc string does not end with"." period',
                     ('Used when a doc string does not end with a period')),
            'W9003': ('Not all args mentioned in doc string',
                     ('Used when not all arguments are in the doc string ')),
            'W9004': ('triple quotes',
                     ('Used when doc string does not use"""')),
           }
    options = ()

    def visit_function(self, node):
        if node.doc: self._check_doc_string(node)

    def visit_module(self, node):
        if node.doc: self._check_doc_string(node)

    def visit_class(self, node):
        if node.doc: self._check_doc_string(node)

    def _check_doc_string(self, node):
        self.one_line_one_one_line(node)
        self.has_period(node)
        self.all_args_in_doc(node)

    def one_line_one_one_line(self,node):
       """One line docs (len < 80) are on one line"""
        doc = node.doc
        if len(doc) > 80: return True
        elif sum(doc.find(nl) for nl in ('
'
, '
'
, '

'
)) == -3: return True
        else:
            self.add_message('W9001', node=node, line=node.tolineno)

    def has_period(self,node):
       """Doc ends in a period"""
        if not node.doc.strip().endswith('.'):
            self.add_message('W9002', node=node, line=node.tolineno)

    def all_args_in_doc(self,node):
       """All function arguments are mentioned in doc"""
        if not hasattr(node, 'argnames'): return True
        for arg in node.argnames:
            if arg != 'self' and arg in node.doc: continue
            else: break
        else: return True
        self.add_message('W9003', node=node, line=node.tolineno)

    def triple_quotes(self,node): #This would need a raw checker to work b/c the AST doesn't use"""
       """Doc string uses tripple quotes"""
        doc = node.doc.strip()
        if doc.endswith('"""') and doc.startswith('"""'): return True
        else: self.add_message('W9004', node=node, line=node.tolineno)


def register(linter):
   """required method to auto register this checker"""
    linter.register_checker(DocStringChecker(linter))

我记得这个系统没有很好的文档(在过去的一年里可能已经改变了)。这至少为您提供了一些东西来代替文档,开始对/真正简单的代码进行黑客攻击。


我不认为它是针对任何政治公众人物的验证,但epydoc将检查docstrmap中所有引用的参数和对象是否映射到有效的参数和对象。