mmm wrote:
I found code to undo a dictionary association.
def undict(dd, name_space=globals()):
for key, value in dd.items():
exec "%s = %s" % (key, repr(value)) in name_space
You are not undoing anything. You are updating globals() from another
dict. But why repr(value)? Without that, globals().update(dd) would
work. In 2.6?/3.0, replace 'dd' with '{a:b for a,b in dd.items()}
dd = { 'a':1, 'b': 'B'}
globals().update({a:b for a,b in dd.items()})
print(a,b)
# 1,B
dx= { 'a':1, 'b': 'B'}
undict(dx)
I get
print A, B
1 B
Here, a=1 and b='B'
Don't fake interactive output. You would have to "print a,b". Above
gives a NameError.
This works well enough for simple tasks and I understand the role of
globals() as the default names space, but creating local variables is
a problem.
Within functions, yes. Just access the values in the dict.
> Also having no output arguemtns to undict() seems
counterintuitive.
In Python, this is standard for functions that mutate.
> Also, the function fails if the key has spaces or
operand characters (-,$,/,%).
Exec is tricky. Most people hardly ever use it.
> Finally I know I will have cases where
not clearing (del(a,b)) each key-value pair might create problems in a
loop.
You cannot mutate a dict while iterating through it.
So I wonder if anyone has more elegant code to do the task that is
basically the opposite of creating a dictionary from a set of
globally assigned variables.
See above.
And for that matter a way to create a
dictionary from a set of variables (local or global).
You have to be more specific: there are {} displays and dict(args) call
and other methods. Read the manual.
tjr
--
http://mail.python.org/mailman/listinfo/python-list