On Sat, 20 Dec 2008, John O'Hagan wrote:
> On Sat, 20 Dec 2008, Terry Reedy wrote:
> > John O'Hagan wrote:
> > > I have a lot of repetitive assignments to make, within a generator,
> > > that use a function outside the generator:
> > >
> > > var1 = func("var1", args)
> > > var2 = func("var2", args)
> > > var3 = func("var3", args)
> > > etc...
> > >
> > > In each case the args are identical, but the first argument is a string
> > > of the name being assigned. It works fine but I'd like to reduce the
> > > clutter by doing the assignments in a loop. I've tried using exec():
> > >
> > > for name in name_string_list:
> > >     exec(name + ' = func(\"' + name + '\", args)')
> > >
> > > but in the local namespace it doesn't understand func(), and if I give
> > > it globals() it doesn't understand the args, which come from within the
> > > generator.
> > >
> > > What's a good way to do this kind of thing?
> >
> > Put everything in your own namespace
> >
> > myvars={}
> > for name in namelist:
> >    myvars[name]=func(name,args)
>
> Likely I'm missing something, but don't I still have to do
>
> var1 = myvars['var1']
> var2 = myvars['var2']
> var3 = myvars['var3']
> ...etc.
>
> to make the assignments?

And of course I am missing the fact that I can now do the exec loop over 
myvars{} in the local namespace.

Doing this, however, exposed some behaviour that surprises me. Inside my 
generator, doing:

exec('foo = 7') in locals()
print foo
foo = 3

produces an UnboundLocalError. In case it's relevant, the error I get inside 
the generator if I don't specify local()s is:

SyntaxError: unqualified exec is not allowed in function 'sequence_engine' it 
contains a nested function with free variables

But doing the same thing in a simple test generator, even if it calls outside 
functions, works as I expect. 

Removing any subsequent reassignments of the same name fixes the error, and as 
it happens I can do this, but I'm curious, without me posting the whole 
generator (it's long), why doesn't the above exec() assignment work in that 
context? 

Thanks,

John






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

Reply via email to