Do eval() and exec not accept a function definition? (like 'def foo: pass) ?

Steven D'Aprano steve at REMOVE.THIS.cybersource.com.au
Sat Jun 23 21:17:40 EDT 2007


On Sat, 23 Jun 2007 19:58:32 +0000, vasudevram wrote:

> 
> Hi group,
> 
> Question: Do eval() and exec not accept a function definition? (like
> 'def foo: pass) ?

eval() is a function, and it only evaluates EXPRESSIONS, not code blocks. 

eval("2+3") # works
eval("x - 4") # works, if x exists
eval("print x") # doesn't work

exec is a statement, and it executes entire code blocks, including
function definitions, but don't use it. Seriously.

ESPECIALLY don't use it if you are exec'ing data collected from untrusted
users, e.g. from a web form.


> I wrote a function to generate other functions using something like
> eval("def foo: ....")
> but it gave a syntax error ("Invalid syntax") with caret pointing to
> the 'd' of the def keyword.

You don't need eval or exec to write a function that generates other
functions. What you need is the factory-function design pattern:


def factory(arg):
    def func(x):
        return x + arg
    return func

And here it is in action:

>>> plus_one = factory(1)
>>> plus_two = factory(2)
>>> plus_one(5)
6
>>> plus_two(5)
7



-- 
Steven.




More information about the Python-list mailing list