[Tutor] question about listing variables defined since session started

Steven D'Aprano steve at pearwood.info
Tue May 1 17:21:04 CEST 2012


Prasad, Ramit wrote:
>> Steven D'Aprano wrote:
>> Robert Sjoblom wrote:
>>> On 30 April 2012 23:25, Comer Duncan <comer.duncan at gmail.com> wrote:
>>>> Hi,
>>>>
>>>> I have a newbie type question.  Say I have started a python (or
>>>> ipython) session and have done some imports and have also defined some
>>>> new variables since the session started.  So, I have in my current
>>>> namespace a bunch of things. Suppose I  want to list just those
>>>> variable  names which have been defined since the session started but
>>>> not include the names of the objects that who and whos will return.
>>>> How to do that?
>>> Not entirely sure, but something like this might work (untested):
>>> for name in dir():
>>>     myvalue = eval(name)
>>>     print name, "is", type(name), "and is equal to ", myvalue
>> Please do not use eval unless you know what you are doing, and certainly
>> don't
>> encourage newbies to use it without a word about the risks.
>>
> 
> ast.literal_eval(name) is probably safer.

Safer, but doesn't work:


py> import ast
py> name = 25
py> ast.literal_eval('name')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "ast.py", line 87, in literal_eval
     return _convert(node_or_string)
   File "ast.py", line 86, in _convert
     raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0xb7a9560c>


literal_eval is for evaluating literals, not names.

py> ast.literal_eval('[123, "ABC", None, {}]')
[123, 'ABC', None, {}]


It apparently can also do simply arithmetic, but that's *possibly* an 
implementation detail due to the keyhole optimizer in CPython's compiler.


-- 
Steven



More information about the Tutor mailing list