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中所有引用的参数和对象是否映射到有效的参数和对象。