unpack a compound symbol string to atomic symbol strings

Just a small recipe, showing a neat use of the eval python builtin,
to unpack a string that contains python code for either a symbol or
a sequence of symbols (that may further nest).
This rather unusual requirement is used by Evoque Templating
to parse and prepare for loop variables for runtime evaluation.

We let the eval python builtin do all the work:

class _UnpackGlobals(dict):
def __getitem__(self, name):
return name
def unpack_symbol(symbol, globals=_UnpackGlobals()):
“”” If compound symbol (list, tuple, nested) unpack to atomic symbols “””
return eval(symbol, globals, None)

A few examples in a python interactive session
should make what this does very clear:

>>> unpack_symbol(“a”)
‘a’
>>> unpack_symbol(“a, b”)
(‘a’, ‘b’)
>>> unpack_symbol(“(a, b)”)
(‘a’, ‘b’)
>>> unpack_symbol(“[a, b]”)
[‘a’, ‘b’]
>>> unpack_symbol(“[a, b, (c, d)]”)
[‘a’, ‘b’, (‘c’, ‘d’)]
>>> unpack_symbol(“[a, b, (c, [one, two, three], d)]”)
[‘a’, ‘b’, (‘c’, [‘one’, ‘two’, ‘three’], ‘d’)]
>>>

A related thread on comp.lang.python:
How
to split a string containing nested commas-separated substrings

Your comments are welcome.