2012-01-04 9 views
19

Las herramientas como pep8 pueden verificar el estilo del código fuente, pero no comprueban si las cadenas docs están desfasadas según pep257, pep287. ¿Hay tales herramientas?Herramienta para comprobar automáticamente el estilo de docstring de acuerdo con PEP257

actualización

I decidió aplicar una herramienta de análisis de este tipo estática por mi cuenta, ver:

https://github.com/GreenSteam/pep257

En este momento, la mayoría de pep257 está cubierta. El diseño fue muy influenciado por la herramienta mencionada pep8.

Respuesta

13

No conozco ninguna herramienta de análisis estático para python doc strings. De hecho, comencé a construir uno poco después de comenzar con PyLint, pero me di por vencido rápidamente.

PyLint tiene un sistema de complemento y un complemento de cadena de documentación es factible si quiere poner el trabajo para hacer que el archivo PEP sea ejecutable.

Los "complementos" de PyLint se llaman inspectores y se presentan en dos formas: los que trabajan con el archivo fuente como un documento de texto sin formato y los que trabajan con él como AST. Intenté desde el AST. Esto puede haber sido un error en retrospectiva.

Aquí es lo que tenía:

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)) 

Por lo que recuerdo este sistema no tiene grandes documentos (que puede haber cambiado en el último año). Esto al menos te da algo para empezar a piratear/código realmente simple en lugar de documentos.

0

No creo que valide contra ningún PEP, pero Epydoc comprobará que todos los parámetros y objetos a los que hace referencia en docstrmap sean válidos para parámetros y objetos.

Cuestiones relacionadas