379 votes

Comment regarder à l'intérieur d'un objet Python ?

Je commence à coder dans le cadre de divers projets utilisant Python (notamment 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 leurs propriétés.

Disons que j'ai un objet Python, de quoi aurais-je besoin pour imprimer son contenu ? Est-ce même possible ?

431voto

Brandon E Taylor Points 10927

Python dispose d'un ensemble solide de fonctionnalités d'introspection.

Jetez un coup d'œil à ce qui suit fonctions intégrées :

type() y dir() sont particulièrement utiles pour inspecter le type d'un objet et son ensemble d'attributs, respectivement.

36 votes

Je ne savais pas que le terme était "introspection". C'est d'une grande aide ! Ainsi que toutes les fonctions que vous m'avez données... Merci.

3 votes

Les propriétés, classmethod et staticmethod ne sont pas liées à l'introspection. Ces méthodes créent toutes des types spéciaux d'objets qui peuvent être utilisés pour définir des classes avec un comportement spécial, mais ne sont d'aucune aide pour inspecter ces classes ou constructions.

0 votes

La réponse de @Brian ci-dessous vous montre comment visualiser le code source de divers objets python à partir de python. C'est ce que je cherchais à l'origine et je suis sûr que je ne serai pas le seul. (Il pourrait être utile d'inclure une référence à sa réponse dans cette réponse puisque c'est la plus acceptée).

232voto

mtasic85 Points 1223

object.__dict__

38 votes

vars(object) est fait pour ça.

22 votes

En fait, from pprint import pprint; pprint(vars(object)) m'a donné une très belle vue sur le contenu de mon objet. Merci @liberforce

0 votes

La meilleure façon de voir un objet et son contenu dans une chaîne de caractères

90voto

Jason Baker Points 56682

Je suis surpris que personne n'ait encore parlé d'aide !

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

L'aide vous permet de lire la docstring et d'avoir une idée des attributs qu'une classe peut avoir, ce qui est plutôt utile.

0 votes

Ensuite, vous utilisez les autres techniques mentionnées ici. Mais si la docstring est disponible, considérez-la comme un canon.

1 votes

Je ne suis pas sûr que python ait mis à jour cette fonction au cours des dernières années, mais "help(object_name)" fournit un aperçu complet dans un format très structuré. C'est à conserver. Merci.

67voto

S.Lott Points 207588

D'abord, lisez la source.

Deuxièmement, utilisez le dir() fonction.

5 votes

La source est plus informative que dir() et une meilleure habitude à prendre.

16 votes

Je ne suis pas d'accord. dir() est tellement plus rapide et dans 99% des cas, il vous permet de trouver ce dont vous avez besoin en combinaison avec help().

7 votes

Je suis d'accord avec "usuallyuseless". La plupart du temps, un simple appel à dir() suffira, ce qui vous évitera d'avoir à parcourir le code source.

31voto

Brian Points 48423

S'il s'agit d'une exploration pour voir ce qui se passe, je recommanderais de consulter IPython . Cela ajoute divers raccourcis pour obtenir la documentation, les propriétés et même le code source d'un objet. Par exemple, l'ajout d'un " ?" à une fonction donnera l'aide de l'objet (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 d'onglets, l'impression jolie des résultats, l'historique des résultats, etc. qui le rendent très pratique pour ce genre de programmation exploratoire.

Pour une utilisation plus programmatique de l'introspection, les modules de base tels que dir() , vars() , getattr etc. seront utiles, mais il vaut la peine de consulter le site Web de la Commission européenne. inspecter module. Pour récupérer la source d'une fonction, utilisez " inspect.getsource ", c'est-à-dire en l'appliquant à lui-même :

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec est aussi souvent utile si vous avez affaire à l'habillage ou à la manipulation de fonctions, car elle donne les noms et les valeurs par défaut des paramètres des fonctions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X