run a string as code?

py_genetic conor.robinson at gmail.com
Tue Jul 18 16:35:40 EDT 2006


Gary Herron wrote:
> py_genetic wrote:
> > py_genetic wrote:
> >
> >> mtbeedee at gmail.com wrote:
> >>
> >>> py_genetic wrote:
> >>>
> >>>> How can you make python interpret a string (of py code) as code.  For
> >>>> example if you want a py program to modify itself as it runs.  I know
> >>>> this is an advantage of interpreted languages, how is this done in
> >>>> python.  Thanks.
> >>>>
> >>> This might do it...
> >>>
> >>>
> >>>>>> print eval.__doc__
> >>>>>>
> >>> eval(source[, globals[, locals]]) -> value
> >>>
> >>> Evaluate the source in the context of globals and locals.
> >>> The source may be a string representing a Python expression
> >>> or a code object as returned by compile().
> >>> The globals must be a dictionary and locals can be any mappping,
> >>> defaulting to the current globals and locals.
> >>> If only globals is given, locals defaults to it.
> >>>
> >> For example each time this line is interpreted I would like to use the
> >> new value of the state var which is a global var.  How can I force
> >> state to be identified and used in this string.
> >>
> >> r_table = h5file.root.state_raw_records.neg_records
> >>
> >> r_table = eval("h5file.root.state_raw_records.neg_records") ??
> >> r_table = h5file.root.eval("state")_raw_records.neg_records ?? eval is
> >> not a part of root
> >>
> >> dont think either of these is very logical? Any ideas?  Possibly the
> >> parser mod?
> >>
> >
> > Got it!
> >
> > tmp = "h5file.root."+state+"_raw_records.pos_records"
> > r_table = eval(tmp)
> >
> > works great thanks for the help!
> >
> Yes, it works, but this is not a good place to use eval. Now that we see
> how you want to use it, we can find a *much* better way to do it.
>
> If you want to lookup an attribute of an object, but the attribute name
> is a string in a variable, then use getattr to do the lookup.
>
> If in interpret your code correctly:
>
> attrname = state + "_raw_records"
> obj = getattr(h5file.root, attrname)
> r_table = obj.pos_records
>
> These, of course, could be combined into a single (but not necessarily
> clearer) line.
>
> Gary Herron

So it is eval() is more appropriate when evalution blocks of string
code, and getattr() is more efficient for dealing with objects such as
h5file object above?  Thanks.




More information about the Python-list mailing list