On 2009-01-27 17:56, Fabio Zadrozny wrote:
On Tue, Jan 27, 2009 at 9:51 PM, James Mills
<prolo...@shortcircuit.net.au>  wrote:
On Wed, Jan 28, 2009 at 9:31 AM, Fabio Zadrozny<fabi...@gmail.com>  wrote:
Anyone knows why the code below gives an error?

global_vars = {}
local_vars = {'ar':["foo", "bar"], 'y':"bar"}
print eval('all((x == y for x in ar))', global_vars, local_vars)
y is undefined in your generator expression.

Yes... but why? It seems to me like it should be defined (if I put the
locals in the globals it finds it... seems very weird to me)

I think you can work around your problem by using the same dictionary for both locals and globals. The locals/globals distinction is not useful in your circumstances. For example, the Python interpreter has these the same:

  >>> globals() is locals()
  True

And that makes the code work:

  >>> y = 'bar'
  >>> ar = ['foo', 'bar']
  >>> all((x==y) for x in ar)
  False
  >>> eval('all((x==y) for x in ar)')
  False

Making locals and globals different emulates a function, where the code will 
fail:

  >>> del y, ar
  >>> def f():
  ...     y = 'bar'
  ...     ar = ['foo', 'bar']
  ...     print 'Raw genexp:', all((x==y) for x in ar)
  ...     print 'Evaled:', eval('all((x==y) for x in ar)')
  ...
  >>> f()
  Raw genexp: False
  Evaled:
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<stdin>", line 5, in f
    File "<string>", line 1, in <module>
    File "<string>", line 1, in <genexpr>
  NameError: global name 'y' is not defined

Now, the reason that the raw generator expression works inside the function but not in the eval() is because the raw generator expression gets lexical scopes rather than just the two locals and globals dicts. Lexical scoping is not available to the eval() function.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to