2011-04-23 25 views
9

¿Sabes si hay una biblioteca de Python que genera estadísticas sobre el código? Estoy pensando en señalar un paquete y obtener varias clases, funciones, métodos, líneas de bloques de documentos, etc.Python: estadísticas de código

Eventualmente podría incluir cosas inútiles como el número de lambdas u otras estadísticas locas, solo por diversión.

+2

Python tiene una excelente introspección. [Crear AST] (http://docs.python.org/library/parser.html) fuera de su fuente ('suite', then' totuple') y analice para su contenido. – 9000

+2

Gracias, y sí podría codificar el mío, pero eso no es lo que realmente pedí. Pregunto si alguien conoce una biblioteca de conveniencia existente que extrae estadísticas y trata con detalles de introspección. – moraes

Respuesta

7

Las personas generalmente no hacen paquetes de cosas que se pueden hacer en una docena o dos líneas de código. A continuación, se analiza el uso de all sintaxis python y se devuelve un diccionario mapeando nodos de cuántas veces ese nodo apareció en la fuente. Los ejemplos que muestran el número de declaraciones def y class también están debajo de este.

import collections 
import os 
import ast 

def analyze(packagedir): 
    stats = collections.defaultdict(int) 
    for (dirpath, dirnames, filenames) in os.walk(packagedir): 
     for filename in filenames: 
      if not filename.endswith('.py'): 
       continue 

      filename = os.path.join(dirpath, filename) 

      syntax_tree = ast.parse(open(filename).read(), filename) 
      for node in ast.walk(syntax_tree): 
       stats[type(node)] += 1 

    return stats 

print("Number of def statements:", analyze('.')[ast.FunctionDef]) 
print("Number of class statements:", analyze('.')[ast.ClassDef]) 
+0

Esto funcionó para mí. Gracias. – xApple

0

Tal Tahar puede ayudar, se muestra información sobre la duración de cada función, método, la clase y el módulo son (en líneas de código) . Sin embargo, dado que está utilizando el módulo de inspección, puede ejecutarse de manera inesperada si uno de los módulos que analiza inicia una GUI o algo así.

Pasaré a utilizar AST algún día, aunque no sé si AST puede proporcionar un servicio que sea similar a inspect.getsourcelines()?

(EDIT)

Mergou (la reescritura de Tahar utilizando el módulo tokenize) está en alfa, aquí está un video de él en acción: http://www.youtube.com/watch?v=PI0iBZmInFU&feature=youtu.be

Cuestiones relacionadas