web-dev-qa-db-fra.com

Visualiser toutes les variables définies

Je travaille actuellement sur un calcul dans python Shell. Ce que je veux, c’est une liste déroulante de style Matlab où vous pouvez voir toutes les variables qui ont été définies jusqu’à un certain point (je connais donc les noms que j’ai utilisés, leurs valeurs, etc.).

Y at-il un moyen, et comment puis-je faire cela?

247
Rook

Quelques choses que vous pourriez utiliser:

  • dir() vous donnera la liste des variables in scope:
  • globals() vous donnera un dictionnaire des variables globales
  • locals() vous donnera un dictionnaire des variables locales
309
RedBlueThing

Si possible, vous pouvez utiliser IPython .

Pour obtenir la liste de toutes les variables définies par l'utilisateur actuelles, IPython fournit une commande magique nommée who (la magie doit être précédée du caractère modulo, à moins que la fonction automagic ne soit activée). :

In [1]: foo = 'bar'
In [2]: %who
foo

Vous pouvez utiliser la magie whos pour obtenir plus de détails:

In [3]: %whos
Variable   Type    Data/Info
----------------------------
foo        str     bar

Il existe une multitude d'autres magies disponibles. IPython est fondamentalement l’interprète Python sur les stéroïdes. Une magie commode est store, qui vous permet de sauvegarder des variables entre les sessions (avec pickle).

Si vous avez quelques minutes, jetez un œil aux excellents screencasts de démo IPython de Jeff Rush .

Remarque: je ne suis pas associé à IPython Dev, mais à un utilisateur satisfait.

193
Chris Lawlor

Comme RedBlueThing et analogique ont déclaré:

  • dir() donne une liste de variables in scope
  • globals() donne un dictionnaire des variables globales
  • locals() donne un dictionnaire des variables locales

À l'aide du shell interactif (version 2.6.9), après avoir créé les variables a = 1 et b = 2, l'exécution de dir() donne

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']

en cours d'exécution locals() donne

{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}

Lancer globals() donne exactement la même réponse que locals() dans ce cas.

Je n'ai pas eu de modules, donc toutes les variables sont disponibles en tant que variables locales et globales. locals() et globals() listent les valeurs des variables ainsi que leurs noms; dir() ne liste que les noms.

Si j'importe un module et exécute locals() ou globals() à l'intérieur du module, dir() ne donne toujours qu'un petit nombre de variables; il ajoute __file__ aux variables répertoriées ci-dessus. locals() et globals() répertorient également les mêmes variables, mais lors de l'impression de la valeur du dictionnaire pour __builtin__, il répertorie un nombre beaucoup plus important de variables: fonctions intégrées, exceptions, et des types tels que "'type': <type 'type'>", plutôt que le bref <module '__builtin__' (built-in)> comme indiqué ci-dessus.

Pour plus d'informations sur dir(), voir référence rapide de Python 2.7 à New Mexico Tech ou la fonction dir () à ibiblio.org.

Pour plus d'informations sur locals() et globals(), reportez-vous à la section éléments locaux et globals dans Dive Into Python et à une page relative à globals au Nouveau-Mexique. Technologie.

[Commentaire: @Kurt: Vous avez donné un lien vers énumérer-ou-énumérer-toutes-les-variables-dans-un-programme-de-votre-langue-préférée-ici mais cette réponse a une erreur dans il. Le problème est le suivant: type(name) dans cet exemple renvoie toujours <type 'str'>. Vous obtenez une liste des variables, qui répond à la question, mais avec les types incorrects énumérés à côté. Ce n'était pas évident dans votre exemple, car toutes les variables étaient de toute façon des chaînes; cependant, ce qui est renvoyé est le type du nom de la variable au lieu du type de la variable. Pour résoudre ce problème: au lieu de print type(name), utilisez print eval('type(' + name + ')'). Je m'excuse d'avoir posté un commentaire dans la section des réponses, mais je n'ai pas le droit de poster des commentaires et l'autre question est close.]

44
Linguist

Pour obtenir les noms:

for name in vars().keys():
  print(name)

Pour obtenir les valeurs:

for value in vars().values():
  print(value)

vars () utilise également un argument optionnel pour déterminer quels vars sont définis dans un objet lui-même.

33
Brian R. Bondy

imprimer les sections locales ()

modifier suite du commentaire.

Pour le rendre un peu plus joli lors de l’impression:

import sys, pprint
sys.displayhook = pprint.pprint
locals()

Cela devrait vous donner une impression plus verticale.

14
Harold

garder à l'esprit dir () retournera toutes les importations actuelles, ET variables.

si vous voulez juste vos variables, je suggérerais un schéma de nommage facile à extraire de dir, tel que varScore, varNames, etc.

de cette façon, vous pouvez simplement faire ceci:

for vars in dir():
 if vars.startswith("var"):
   print vars

Éditer

si vous souhaitez répertorier toutes les variables, mais exclure les modules importés et les variables telles que:

__builtins__

vous pouvez utiliser quelque chose comme ceci:

import os
import re

x = 11
imports = "os","re"

for vars in dir():
    if vars.startswith("__") == 0 and vars not in imports:
        print vars

comme vous pouvez le constater, la variable "imports" sera affichée, car il s’agit d’une variable (bien, d’un tuple). Une solution rapide consiste à ajouter le mot "importations" dans le Tuple d'importation lui-même!

10
John T

un peu plus intelligent (python 3):

def printvars():

   tmp = globals().copy()
   [print(k,'  :  ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]
7
jamk

globals (), locals (), vars () et dir () peuvent tous vous aider dans ce que vous voulez.

4
Devin Jeanpierre

Dans mon interpréteur Python 2.7, la même commande whos qui existe dans MATLAB existe dans Python. Il affiche les mêmes détails que l'analogue MATLAB (nom de la variable, type et valeur/données).

Dans l'interpréteur Python, whos répertorie toutes les variables de "l'espace de noms interactif".

3
Babak
def MyWho():
     print [v for v in globals().keys() if not v.startswith('_')]

Ceci doit être défini dans le shell interactif.

import os, a = 10, import sys, MyWho()

puis donne:

['a', 'MyWho', 'sys', 'os']
1
Jamie