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

Reply via email to