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
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).
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).
@ Bob - + 1, no había oído hablar de eso, parece interesante. Gracias. – root
@root: el problema es que ese callgraph estático podría ser insuficiente para un lenguaje dinámico como python :( –
- 1. Python assert: ¿mejor introspección de fallas?
- 2. Introspección en Clojure
- 3. Práctica para principiantes Python?
- 4. Java introspección: objeto al mapa
- 5. Objetivo C Introspección/Reflexión
- 6. Java Pila introspección
- 7. Cómo hacer introspección en R
- 8. Python - buena práctica para detectar errores
- 9. Partición de tuplas en Python: ¿práctica recomendada?
- 10. introspección SQLAlchemy de las clases declarativas
- 11. D: nombre de parámetro de función introspección
- 12. Introspección SQLAlchemy de clases/objetos ORM
- 13. Introspección de lenguajes de programación funcional
- 14. regla de introspección Django-Sur no funciona
- 15. Introspección de clase en Common Lisp
- 16. ¿Cómo hacer la introspección del objeto JavaScript?
- 17. Introspección del módulo win32com/módulo de pythoncom
- 18. ¿Definición de estructura de introspección en C++?
- 19. ¿Qué es la "finalización de código basada en la introspección"?
- 20. Buscar nombres de argumentos posicionales a través de la introspección
- 21. Python introspección - cómo comprobar corriente de los módulos/línea de llamada dentro de la función
- 22. Introspección de funciones anidadas (locales) de una función dada en Python
- 23. ¿Se ha cambiado el hilo en GTK con Python en la introspección de PyGObject?
- 24. ¿Cómo realizo la introspección en un objeto en Python 2.x?
- 25. ¿Tiene Scala una introspección capaz de algo similar a dir de Python()?
- 26. línea de comandos análisis arg a través de la introspección
- 27. ¿La mejor práctica para actualizar los módulos de Python?
- 28. Python buena práctica de programación para enumerar listas
- 29. ¿Cuál es la práctica común para las enumeraciones en Python?
- 30. ¿Es una mala práctica usar getattr de python extensivamente?
@ gvalkov - +1 para IPython. – root