pep8のようなツールはソース コード スタイルをチェックできますが、ドキュメント文字列がpep257、pep287に従ってフォーマットされているかどうかはチェックしません。そのようなツールはありますか?
アップデート
このような静的分析ツールを自分で実装することにしました。次を参照してください。
Python doc 文字列の静的分析ツールを知りません。実際、PyLint を使い始めてすぐに作成を開始しましたが、すぐにあきらめました。
PyLint にはプラグイン システムがあり、PEP を実行可能にする作業を行いたい場合は、ドキュメント文字列プラグインを使用できます。
PyLint の「プラグイン」はチェッカーと呼ばれ、ソース ファイルを生のテキスト ドキュメントとして操作するものと、AST として操作するものの 2 つの形式があります。ASTから始めてみました。これは後から考えると間違いだったのかもしれません。
これが私が持っていたものです:
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 ('\n', '\r', '\n\r')) == -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))
私が思い出したように、このシステムには優れたドキュメントがありません (過去 1 年で変更された可能性があります)。これにより、少なくともハッキングを開始するための何かが得られます/ドキュメントの代わりに非常に単純なコード。
PEP に対して検証しているとは思いませんが、Epydocは、docstrmap で参照されているすべてのパラメーターとオブジェクトが有効なパラメーターとオブジェクトにマップされていることを確認します。