run a string as code?

Gary Herron gherron at islandtraining.com
Mon Jul 17 20:48:28 EDT 2006


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




More information about the Python-list mailing list