Spesso mi trovo a usare librerie di terze parti - pacchetti e moduli - che mancano di documentazione sufficiente. Lo studio del codice sorgente diventa quindi essenziale, ma può anche essere un compito un po 'noioso. Io (come immagino tutti) utilizzare le funzioni dir()
e help()
per iniziare e recentemente ho iniziato a utilizzare il modulo inspect
. Mi piacerebbe sapere quali sono i "metodi" che usi per immergerti nel codice mal documentato e come aumentare l'efficienza nel farlo. Aiuto molto apprezzato.Python: introspezione pratica
risposta
Trovo che lo strumento IPython sia indispensabile per questo tipo di attività. I comandi magici ?
(show docstring) e ??
(show source), abbinati all'eccellente sistema di completamento di IPython e all'introspezione di oggetti dal vivo, fanno davvero la differenza per me.
una sessione di esempio:
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
Purtroppo, non tutto il codice è ispezionabile in questo modo. Pensa ai progetti che fanno cose in moduli senza averli inclusi in un if __name__ == '__main__'
o in progetti che fanno molto affidamento sulla magia (sh mi viene in mente).
Mi piacerebbe costruire callgraph con http://pycallgraph.slowchop.com/ o doxygen.
Infatti, il modulo AST
e alcuni altri consentono un'analisi statistica relativamente indolore. Quello che mi piacerebbe di più è in qualche modo eseguire analisi dinamiche (perché, il valore di ciò che viene chiamato "func1" può cambiare e le chiamate possono diventare completamente diverse).
@ Bob - + 1, non ne avevo sentito parlare, sembra interessante. Grazie. – root
@root: il problema è che il callgraph statico potrebbe non essere sufficiente per il linguaggio dinamico come python :( –
- 1. Principiante pratica Python?
- 2. Introspezione Java - comportamento strano
- 3. Linguaggi di programmazione funzionale introspezione
- 4. SQLAlchemy introspezione di classi ORM/oggetti
- 5. Introspezione di classe in Common Lisp
- 6. Introspezione di modulo win32com/modulo pythoncom
- 7. Python introspezione: il nome della funzione di accesso e docstring all'interno definizione di funzione
- 8. Qual è la pratica comune per enum in Python?
- 9. E 'buona pratica dipendere da Python con ... come affermazione
- 10. Estrapolazione 3D in python (in pratica, scipy.griddata esteso a estrapolare)
- 11. JavaBeans e introspezione: incasinato su proprietà booleane e indicizzate?
- 12. La regola di introspezione di Django-Sud non funziona
- 13. Buona pratica: organizzare views.py nelle app Django
- 14. Pratica query SQL
- 15. ViewHolder - buona pratica
- 16. Messaggio MQTTImplementazione pratica
- 17. Session Hijacking in pratica
- 18. Un problema pratica java
- 19. Dimensioni Enum * in pratica *
- 20. Classe JavaScript migliore pratica?
- 21. L'istanza è una buona pratica?
- 22. SOA pratica per un novellino
- 23. Che cos'è un modo 'buona pratica' per scrivere un'applicazione Python GTK +?
- 24. La migliore pratica per scrivere i log in/var/log da uno script python?
- 25. Qual è la buona pratica di Python per l'importazione e l'offerta di funzionalità opzionali?
- 26. Qual è la migliore pratica per la gestione di tuple a valore singolo in Python?
- 27. Pratica buona o cattiva in Python: importazione nel mezzo di un file
- 28. Aggiunta di un campo personalizzato semplice a Django - Come scrivere le regole di introspezione a sud
- 29. classe astratta - nasconde implementazione in C++ pratica
- 30. è una buona pratica usare mysql_free_result ($ result)?
@ gvalkov - +1 per IPython. – root