Je commence à coder dans divers projets utilisant Python (y compris le développement web Django et le développement de jeux Panda3D).
Pour m'aider à comprendre ce qui se passe, je voudrais essentiellement 'regarder' à l'intérieur des objets Python pour voir comment ils fonctionnent - comme leurs méthodes et propriétés.
Disons que j'ai un objet Python, de quoi aurais-je besoin pour imprimer son contenu? Est-ce que c'est possible?
python
introspection
littlejim84
la source
la source
object.__dict__
la source
vars(object)
est fait pour ça.from pprint import pprint; pprint(vars(object))
fait, cela m'a donné une très belle vue sur le contenu de mon objet. Merci @liberforceTout d'abord, lisez la source.
Deuxièmement, utilisez la
dir()
fonction.la source
Je suis surpris que personne n'ait encore mentionné d'aide!
L'aide vous permet de lire la docstring et d'avoir une idée des attributs qu'une classe peut avoir, ce qui est très utile.
la source
Si c'est pour l'exploration pour voir ce qui se passe, je recommanderais de regarder IPython . Cela ajoute divers raccourcis pour obtenir une documentation des objets, des propriétés et même du code source. Par exemple, ajouter un "?" à une fonction donnera l'aide pour l'objet (en fait un raccourci pour "help (obj)", alors que l'utilisation de deux? ("
func??
") affichera le code source s'il est disponible.Il y a aussi beaucoup de commodités supplémentaires, comme la complétion des onglets, la jolie impression des résultats, l'historique des résultats, etc. qui le rendent très pratique pour ce type de programmation exploratoire.
Pour une utilisation plus programmatique de l' introspection, les builtins de base comme
dir()
,vars()
,getattr
etc sera utile, mais il vaut bien votre temps pour vérifier le inspectent module. Pour récupérer la source d'une fonction, utilisez "inspect.getsource
" par exemple, en l'appliquant à elle-même:inspect.getargspec
est également souvent utile si vous traitez ou manipulez des fonctions, car il donnera les noms et les valeurs par défaut des paramètres de fonction.la source
Si vous êtes intéressé par une interface graphique pour cela, jetez un œil à objbrowser . Il utilise le module d'inspection de la bibliothèque standard Python pour l'introspection d'objets en dessous.
la source
Vous pouvez lister les attributs d'un objet avec dir () dans le shell:
Bien sûr, il y a aussi le module d'inspection: http://docs.python.org/library/inspect.html#module-inspect
la source
la source
Essayez ppretty
Production:
la source
D'autres ont déjà mentionné le dir () intégré qui ressemble à ce que vous recherchez, mais voici un autre bon conseil. De nombreuses bibliothèques - dont la plupart des bibliothèques standard - sont distribuées sous forme source. Cela signifie que vous pouvez lire assez facilement le code source directement. L'astuce consiste à le trouver; par exemple:
Le fichier * .pyc est compilé, supprimez donc le «c» de fin et ouvrez le fichier * .py non compilé dans votre éditeur ou visualiseur de fichiers préféré:
J'ai trouvé cela incroyablement utile pour découvrir des choses comme les exceptions qui sont déclenchées à partir d'une API donnée. Ce genre de détail est rarement bien documenté dans le monde Python.
la source
Bien que cela
pprint
ait déjà été mentionné par d'autres, j'aimerais ajouter un peu de contexte.pprint
pourrait être très demandé par les développeurs ayant une expérience PHP qui recherchent une alternative àvar_dump()
.Les objets avec un attribut dict peuvent être bien vidés en utilisant
pprint()
mixé avecvars()
, qui retourne l'__dict__
attribut pour un module, une classe, une instance, etc.:Donc, pas besoin de boucle .
Pour vider toutes les variables contenues dans la portée globale ou locale, utilisez simplement:
locals()
affiche les variables définies dans une fonction.Il est également utile d'accéder aux fonctions avec leur nom correspondant sous forme de clé de chaîne, entre autres utilisations :
De même, utilisez
dir()
pour voir le contenu d'un module ou les attributs d'un objet.Et il y en a encore plus.
la source
Si vous voulez regarder les paramètres et les méthodes, comme d' autres l' ont souligné , vous pouvez bien utiliser
pprint
oudir()
Si vous voulez voir la valeur réelle du contenu, vous pouvez faire
object.__dict__
la source
Deux excellents outils pour inspecter le code sont:
IPython . Un terminal python qui vous permet d'inspecter à l'aide de la complétion de tabulation.
Eclipse avec le plugin PyDev . Il dispose d'un excellent débogueur qui vous permet de vous interrompre à un endroit donné et d'inspecter des objets en parcourant toutes les variables sous forme d'arbre. Vous pouvez même utiliser le terminal intégré pour essayer le code à cet endroit ou taper l'objet et appuyez sur "." pour qu'il vous donne des conseils de code.
la source
pprint et dir fonctionnent ensemble très bien
la source
Il existe une bibliothèque de code python spécialement conçue à cet effet: inspect Introduit dans Python 2.7
la source
Si vous souhaitez voir le code source de la fonction correspondant à l'objet
myobj
, vous pouvez taperiPython
ouJupyter Notebook
:myobj??
la source
ou
la source
Si vous voulez regarder à l'intérieur d'un objet en direct, le
inspect
module de python est une bonne réponse. En général, cela fonctionne pour obtenir le code source des fonctions définies dans un fichier source quelque part sur le disque. Si vous souhaitez obtenir la source des fonctions en direct et des lambdas définis dans l'interpréteur, vous pouvez utiliser àdill.source.getsource
partir dedill
. Il peut également obtenir le code des méthodes et fonctions de classe liées ou non définies définies dans les currys ... cependant, vous ne pourrez peut-être pas compiler ce code sans le code de l'objet englobant.la source
vars (obj) renvoie les attributs d'un objet.
la source
De plus, si vous souhaitez consulter la liste et les dictionnaires, vous pouvez utiliser pprint ()
la source
Beaucoup de bons conseils déjà, mais le plus court et le plus facile (pas nécessairement le meilleur) n'a pas encore été mentionné:
la source
Essayez d'utiliser:
object
est le nom de variable de l'objet que vous essayez d'inspecter.Cela imprime une sortie bien formatée et tabulée montrant toute la hiérarchie des clés et des valeurs dans l'objet.
REMARQUE: cela fonctionne en python3. Je ne sais pas si cela fonctionne dans les versions antérieures
MISE À JOUR: Cela ne fonctionne pas sur tous les types d'objets. Si vous rencontrez l'un de ces types (comme un objet Request), utilisez plutôt l'un des éléments suivants:
dir(object())
ou
import pprint
puis:pprint.pprint(object.__dict__)
la source