I'm an old time python user, but just got bitten by namespaces in eval.
If this is an old discussion somewhere, feel free to point me there.
Based on the documentation, I would have expected the following to
work:
def foo(k): print k; print a
ns = {'a':1, 'foo': foo}
eval('foo(2)', ns)
But it does not, complete session:
[EMAIL PROTECTED] ~]$ python
Python 2.4 (#2, Feb 13 2005, 22:08:03)
[GCC 3.4.3 (Mandrakelinux 10.1 3.4.3-3mdk)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo(k): print k; print a
...
>>> ns = {'a':1, 'foo': foo}
>>> eval('foo(2)', ns)
2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<string>", line 0, in ?
File "<stdin>", line 1, in foo
NameError: global name 'a' is not defined
>>>
huh? I'd almost be tempted to call this a bug?
Playing with locals() and globals() I see that this one works,
which I would not have expected to work:
def foo(k): print k; print ns['a']
ns = {'a':1, 'foo': foo}
eval('foo(2)', ns)
Prints out
2
1
Do functions carry their own pointer to global namespace,
which gets defined at function compile time, or what is
happening here?
-Harri
--
http://mail.python.org/mailman/listinfo/python-list