On Jan 27, 11:31 pm, Fabio Zadrozny <fabi...@gmail.com> wrote: > Hi All, > > 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) > > Error: > > Traceback (most recent call last): > File "C:\temp\work\test\src\a.py", line 3, in <module> > print eval('all((x == y for x in ar))', global_vars, local_vars) > File "<string>", line 1, in <module> > File "<string>", line 1, in <genexpr> > NameError: global name 'y' is not defined > > Note that if a list is used instead of a generator it works... > > Thanks, > > Fabio
I tend to think of it as a generator produces another scope, gets refactored into something similar to: def yourfunc(ar): for x in ar: yield x == y Which doesn't work either, however, if you introduce a global y the function can access it (similar if you add y to your global_vars). It's basically one of those scope/closure gotcha's along with lambdas (which was discussed quite heavily recently). hth, Jon -- http://mail.python.org/mailman/listinfo/python-list