2012-09-20 14 views
5

A menudo me encuentro utilizando bibliotecas de terceros (paquetes y módulos) que carecen de documentación suficiente. Por lo tanto, estudiar el código fuente se vuelve esencial, pero también puede ser una tarea tediosa. Yo (como supongo que todos) utilizo las funciones dir() y help() para comenzar y recientemente comencé a usar el módulo inspect. Me gustaría saber cuáles son los "métodos" que utiliza para profundizar en el código mal documentado y cómo aumentar la eficiencia al hacerlo. Ayuda muy apreciada.Python: introspección práctica

Respuesta

5

Encuentro IPython indispensable para este tipo de tarea. Los comandos mágicos ? (show docstring) y ?? (show source), junto con el excelente sistema de finalización de IPython y la introspección de objetos vivos realmente marcan la diferencia para mí.

una sesión de ejemplo:

In [1]: import sphinx.writers <TAB> 
# see available modules and packages - narrow down 

In [1]: import shpinx.writers.manpage as manpage 
In [2]: manpage.<TAB> 
# list and complete on the module's contents 

In [3]: manpage.Writer? 
# nicely formatted docstring follows 

In [4]: manpage.Writer?? 
# nicely formatted source code follows 

In [5]: %edit manpage 
# open module in editor 
# it really helps if you use something like ctags at this point 

In [6]: %edit manpage.Writer 
# open module in editor - jump to class Writer 

Por desgracia, no todo el código pueda ser inspeccionado esta manera. Piense en proyectos que hacen cosas en módulos sin envolverlos en un if __name__ == '__main__' o proyectos que dependen en gran medida de la magia (me viene a la mente sh).

+1

@ gvalkov - +1 para IPython. – root

2

Me gustaría construir callgraphs con http://pycallgraph.slowchop.com/ o doxygen.

De hecho, el módulo AST y algunos otros permiten un análisis estático relativamente sencillo. Lo que más me gustaría es realizar de algún modo análisis dinámicos (porque el valor de lo que se llama "func1" puede cambiar y las llamadas pueden volverse completamente diferentes).

+0

@ Bob - + 1, no había oído hablar de eso, parece interesante. Gracias. – root

+0

@root: el problema es que ese callgraph estático podría ser insuficiente para un lenguaje dinámico como python :( –

Cuestiones relacionadas