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?
Quelques choses que vous pourriez utiliser:
dir()
vous donnera la liste des variables in scope:globals()
vous donnera un dictionnaire des variables globaleslocals()
vous donnera un dictionnaire des variables localesSi 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.
Comme RedBlueThing et analogique ont déclaré:
dir()
donne une liste de variables in scopeglobals()
donne un dictionnaire des variables globaleslocals()
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.]
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.
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.
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!
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__')]
globals (), locals (), vars () et dir () peuvent tous vous aider dans ce que vous voulez.
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".
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']