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