Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enumerate or list all variables in a program of [your favorite language here] [closed]

A friend asked me last week how to enumerate or list all variables within a program/function/etc. for the purposes of debugging (essentially getting a snapshot of everything so you can see what variables are set to, or if they are set at all). I looked around a bit and found a relatively good way for Python:

 #!/usr/bin/python                                                                                                                                                                                                                            foo1 = "Hello world" foo2 = "bar" foo3 = {"1":"a",         "2":"b"} foo4 = "1+1"  for name in dir():     myvalue = eval(name)     print name, "is", type(name), "and is equal to ", myvalue 

which will output something like:

 __builtins__ is <type 'str'> and is equal to  <module '__builtin__' (built-in)> __doc__ is <type 'str'> and is equal to  None __file__ is <type 'str'> and is equal to  ./foo.py __name__ is <type 'str'> and is equal to  __main__ foo1 is <type 'str'> and is equal to  Hello world foo2 is <type 'str'> and is equal to  bar foo3 is <type 'str'> and is equal to  {'1': 'a', '2': 'b'} foo4 is <type 'str'> and is equal to  1+1 

I have so far found a partial way in PHP (courtesy of link text) but it only lists all variables and their types, not the contents:

 <?php // create a few variables $bar = 'foo'; $foo ='bar'; // create a new array object $arrayObj = new ArrayObject(get_defined_vars()); // loop over the array object and echo variables and values for($iterator = $arrayObj->getIterator(); $iterator->valid(); $iterator->next())         {         echo $iterator->key() . ' => ' . $iterator->current() . '<br />';         } ?> 

So I put it to you: how do you list all variables and their contents in your favorite language?


Edit by VonC: I propose this question follows the spirit of a little "code-challenge".
If you do not agree, just edit and remove the tag and the link.

like image 839
Kurt Avatar asked Jan 10 '09 09:01

Kurt


2 Answers

In python, using locals which returns a dictionary containing all the local bindings, thus, avoiding 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'>} 
like image 175
Aaron Maenpaa Avatar answered Oct 01 '22 18:10

Aaron Maenpaa


IPython:

whos

You could also recommend Spyder to your friend which shows those variables pretty much like Matlab does and provides a GUI for line-by-line debugging.

like image 32
Eder Santana Avatar answered Oct 01 '22 17:10

Eder Santana