2012-01-31 83 views
17

Quiero contar las líneas de código en un proyecto de Python de varios archivos con la mayor precisión posible, pero sin incluir comentarios, cadenas de documentos ni líneas en blanco en el total.¿Cómo contar las líneas de código en Python excluyendo los comentarios y las cadenas de documentos?

Intenté por primera vez el uso de cloc, que está disponible como un paquete de Debian. Pero cloc trata la mayoría de las cadenas de documentos como código, a pesar de que son comentarios. (Actualización:. Ya no - las versiones recientes de cloc ahora el tratamiento de cadenas de documentación de Python como comentarios)

noto algunos comentarios a continuación decir que las cadenas de documentación deben ser incluidos en el total, ya que pueden ser utilizados por el código para influir en el comportamiento en tiempo de ejecución y, por lo tanto, cuenta como parte de los programas code/data/config. Un ejemplo prominente de esto es 'ply', que le pide que escriba funciones con docstrings que, según recuerdo, contienen gramática y expresiones regulares que son fundamentales para el funcionamiento del programa. Sin embargo, esto me parece ser una rara excepción. La mayoría de las veces, las cadenas de documentos actúan como comentarios. Específicamente, sé que es cierto para todo el código que quiero medir. Así que quiero excluirlos como tales de mi conteo de líneas.

+19

diría contando comentarios _is la way_ razón, porque en las observaciones generales __El son tan valiosas como el código real lines__ – Kimvais

+3

@Kimvais Debo decir que he tenido la experiencia opuesta en 20 años de programación: los comentarios son en general inútiles porque el compilador nunca los comprueba :-) –

+7

Python docstrings * son * code: se convierten en el atributo '__doc__' de la función y pueden contener pruebas. Tal vez necesites definir lo que quieres decir con 'líneas de código' – Hamish

Respuesta

6

Probablemente sea correcto incluir las cadenas de Python en un recuento de "líneas de código". Normalmente un comentario sería descartada por el compilador, pero docstrings se analiza:

Ver PEP 257 - Docstring Conventions:

Una cadena de documentación es una cadena literal que se presenta como la primera instrucción un módulo, función, clase o definición de método. Tal docstring se convierte en el atributo especial __doc__ de ese objeto.

...

literales de cadena que ocurre en otros lugares en código Python también puede actuar como documentación. no son reconocidos por el compilador de bytecode de Python y no son accesibles como atributos de los objetos en tiempo de ejecución ..

En otras palabras, las cadenas de documentación se compila y se constituyen, de una manera muy real, el código de la programa. Además, son comúnmente utilizados por doctest module para pruebas unitarias, como cadenas de uso para utilidades de línea de comandos, y así sucesivamente.

+3

No estoy de acuerdo. Mientras que las cadenas de documentos se compilan y pueden ser utilizadas por el código, su uso y semántica son como comentarios. Deben ser excluidos de cualquier recuento de líneas significativo. –

+3

@JonathanHartley personalmente, creo que "compilado y puede ser utilizado por el código" es un buen argumento * para * que se cuente. – Hamish

+0

Hola. Creo que siento lo contrario porque aunque el código los pueda usar, casi nunca lo hacen. Con lo que quiero decir, sí, son utilizados por 'pydoc' y otros, pero creo que el único programa que he visto almacena datos en documentos y luego examina que los datos son 'Ply' de David Beazley. Entonces es muy raro Si está comparando dos módulos para ver cuál contiene más código y uno tiene docstrings pero el otro no, me parece más útil excluir las cadenas de documentos y obtener el resultado "son casi iguales". –

2

¿Has mirado en http://www.ohloh.net/p/ohcount - siempre ha sido bastante en el dinero para mí - aunque yo no uso pitón

+2

Gracias, pero al igual que esta herramienta, también cuenta docstrings con triple apóstrofes como código, por lo que tampoco es realmente Python -consciente. – ifischer

6

Las líneas de comentario puede ser líneas de código en Python. Ver doctest por ejemplo.

Por otra parte, tendrá problemas para encontrar una manera sensata/fiable para considerar un caso como este como un comentario o código:

foo = ('spam', 
     '''eggs 
      eggs 
      eggs''' 
     '''more spam''', 
     'spam') 

contar sólo las líneas de comentario así, creo que la mayoría de los programadores acuerde que es una buena medida para lo que sea que realmente esté tratando de medir.

+2

No estoy de acuerdo. Si bien técnicamente las cadenas de documentación están compiladas y son accesibles desde el código, el vasto predominio de su uso y semántica es un comentario. Deben ser excluidos del recuento de líneas. La forma de detectar casos de apariencia ambigua como el de esta respuesta es hacer el recuento de líneas utilizando AST. –

4

Tahar no cuenta las cadenas de documentos.Aquí está su función count_loc:

def count_loc(lines): 
    nb_lines = 0 
    docstring = False 
    for line in lines: 
     line = line.strip() 

     if line == "" \ 
      or line.startswith("#") \ 
      or docstring and not (line.startswith('"""') or line.startswith("'''"))\ 
      or (line.startswith("'''") and line.endswith("'''") and len(line) >3) \ 
      or (line.startswith('"""') and line.endswith('"""') and len(line) >3) : 
      continue 

     # this is either a starting or ending docstring 
     elif line.startswith('"""') or line.startswith("'''"): 
      docstring = not docstring 
      continue 

     else: 
      nb_lines += 1 

    return nb_lines 
+6

Gracias por la recomendación razonable y por no hacer afirmaciones descabelladas y pontificantes, como las de los que respondieron, sobre el hecho de que el docstrings sea código. Las líneas de código _es_ una medida válida (y de hecho la mejor: http://herraiz.org/blog/2010/11/22/making-software-is-out/) de la complejidad del código y cuando necesito esa complejidad para reflejar el código fuente en bruto (en lugar de mi gran cantidad de _math_ notas en docstrings), ¡necesito omitir docstrings! –

+3

Creo que el documento en docstrings es para la documentación – ychaouche

+0

El código anterior fallará en las cadenas de texto que usan comillas simples o en algunas cadenas regulares que usan comillas triples. La forma correcta de resolver este problema es mirar el AST. –

Cuestiones relacionadas