Simple and safe evaluator

bvdp bob at mellowood.ca
Tue Jun 17 00:02:56 CEST 2008


George Sakkis wrote:
> On Jun 16, 4:47 pm, bvdp <b... at mellowood.ca> wrote:
> 
>> 2. I thought I'd be happy with * / + -, etc. Of course now I want to add
>> a few more funcs like int() and sin(). How would I do that?
> 
> For the builtin eval, just populate the globals dict with the names
> you want to make available:
> 
> import math
> 
> globs = {'__builtins__' : None}
> 
> # expose selected builtins
> for name in 'True False int float round abs divmod'.split():
>     globs[name] = eval(name)
> 
> # expose selected math constants and functions
> for name in 'e pi sqrt exp log ceil floor sin cos tan'.split():
>     globs[name] = getattr(math,name)
> 
> return eval(s, globs, {})
> 

Thanks. That was easy :)

> The change to the _ast version is left as an exercise to the reader ;)

And I have absolutely no idea on how to do this. I can't even find the 
_ast import file on my system. I'm assuming that the _ast definitions 
are buried in the C part of python, but that is just a silly guess.

Bob.



More information about the Python-list mailing list