Simple and safe evaluator

George Sakkis george.sakkis at gmail.com
Mon Jun 16 23:30:37 CEST 2008


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, {})


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

George



More information about the Python-list mailing list