77 votes

Énumérer ou lister toutes les variables dans un programme de [votre langue préférée ici]

Un ami m'a demandé la semaine dernière comment énumérer ou de la liste de toutes les variables à l'intérieur d'un programme/fonction/etc. pour les fins de débogage (essentiellement obtenir un aperçu de tout ce que vous pouvez voir quelles sont les variables, ou si elles sont définies à tous). J'ai regardé un peu autour et a trouvé un relativement bon moyen pour Python:

#!/usr/bin/python 
toto1 = "Bonjour le monde"
foo2 = "barre"
foo3 = {"1":"",
"2":"b"}
foo4 = "1+1"

pour le nom de dir():
 mavaleur = eval(nom)
 nom en caractères d'imprimerie, "est", type(nom), "et est égal à ", mavaleur

qui va afficher quelque chose comme:

__les builtins__ <type 'str'> est égal à <module " __builtin__' (built-in)>
__doc__ <type 'str'> et est égal
__fichier__ <type 'str'> et est égal ./foo.py
___ nom_ <type 'str'> et est égal à __principaux__
toto1 est <type 'str'> et est égal Bonjour tout le monde
foo2 est <type 'str'> et est égale à la barre
foo3 est <type 'str'> et est égal à {'1': 'a', '2': 'b'}
foo4 est <type 'str'> et est égal à 1+1

J'ai jusqu'à présent trouvé une partie en PHP (avec l'aimable autorisation de texte du lien), mais il ne répertorie toutes les variables et leurs types, pas le contenu:

<?php
// créer un peu de variables
$bar = 'foo';
$foo = "bar";
// création d'un nouvel objet array
$arrayObj = new ArrayObject(get_defined_vars());
// boucle sur le tableau de l'objet et de l'écho des variables et des valeurs
for($iterator = $arrayObj->getIterator(); $iterator->valid(); $iterator->next())
{
 echo $iterator ->() . '=> ' . $iterator->current() . '<br />';
}
?>

Donc je l'ai mis pour vous: comment avez-vous la liste de toutes les variables et leur contenu dans votre langue préférée?


Edit par VonC: je vous propose cette question suit l'esprit d'un petit "code-défi".
Si vous n'êtes pas d'accord, il suffit d'éditer et de supprimer le tag et le lien.

92voto

Aaron Maenpaa Points 39173

En python, en utilisant des locales qui retourne un dictionnaire contenant toutes les liaisons locales, évitant ainsi eval:

 >>> foo1 = "Hello world"
>>> foo2 = "bar"
>>> foo3 = {"1":"a",
...         "2":"b"}
>>> foo4 = "1+1"

>>> import pprint
>>> pprint.pprint(locals())
{'__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__name__': '__main__',
 'foo1': 'Hello world',
 'foo2': 'bar',
 'foo3': {'1': 'a', '2': 'b'},
 'foo4': '1+1',
 'pprint': <module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>}
 

11voto

Jörg W Mittag Points 153275

C'est ce qu'il pourrait ressembler à Ruby:

#!/usr/bin/env ruby

foo1 = 'Hello world'
foo2 = 'bar'
foo3 = { '1' => 'a', '2' => 'b' }
foo4 = '1+1'

local_variables.each do |var|
  puts "#{var} is #{var.class} and is equal to #{eval(var).inspect}"
end

qui sera de sortie

toto1 est une Chaîne est égale à "Hello world"
foo2 est une Chaîne est égale à "bar"
foo3 est une Chaîne est égale à {"1"=>"", "2"=>"b"}
foo4 est une Chaîne est égale à "1+1"

Cependant, n'avez-vous pas dire à la sortie de la type d'objet que l'références à des variables à la place du type utilisé pour représenter la variable d'identification? OIE, le type d' foo3 devrait être Hash (ou dict) au lieu de String, droite? Dans ce cas, le code serait

#!/usr/bin/env ruby

foo1 = 'Hello world'
foo2 = 'bar'
foo3 = { '1' => 'a', '2' => 'b' }
foo4 = '1+1'

local_variables.each do |var|
  val = eval(var)
  puts "#{var} is #{val.class} and is equal to #{val.inspect}"
end

et le résultat est

toto1 est une Chaîne est égale à "Hello world"
foo2 est une Chaîne est égale à "bar"
foo3 est de Hachage et est égal à {"1"=>"", "2"=>"b"}
foo4 est une Chaîne est égale à "1+1"

9voto

Pim Jager Points 20018

En php, vous pouvez faire ceci:

 $defined = get_defined_vars(); 
foreach($defined as $varName => $varValue){
 echo "$varName is of type ".gettype($varValue)." and has value $varValue <br>";
}
 

9voto

Nick Dandoulakis Points 26809

Dans Lua, la structure de données fondamentale est la table et même l’environnement global _G est une table. Donc, une simple énumération fera l'affaire.

 for k,v in pairs(_G) do
  print(k..' is '..type(v)..' and is equal to '..tostring(v))
end
 

6voto

LapTop006 Points 462

Un one-liner PHP entièrement récursif:

 print_r(get_defined_vars());
 

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