I've been looking at dynamic evaluation of Python code, and come across the eval() and compile() functions, and the exec statement.
Can someone please explain the difference between eval and exec, and how the different modes of compile() fit in?
I've been looking at dynamic evaluation of Python code, and come across the eval() and compile() functions, and the exec statement.
Can someone please explain the difference between eval and exec, and how the different modes of compile() fit in?
exec
is a statement, not an expression (at least in Python 2.x, maybe not in 3.x?). It compiles and immediately evaluates a statement or set of statement contained in a string. Example:
exec 'print 5' # prints 5.
exec 'print 5\nprint 6' # prints 5{newline}6.
exec 'if True: print 6' # prints 6.
exec '5' # does nothing and returns nothing.
eval
evaluates an expression (not a statement) and returns the value that expression produces. Example:
x = eval('5') # x <- 5
x = eval('%d + 6' % x) # x <- 11
x = eval('abs(%d)' % -100) # x <- 100
x = eval('print 5') # INVALID; print is a statement, not an expression (in Python 2.x).
x = eval('if 1: x = 4') # INVALID; if is a statement, not an expression.
compile
is a lower level version of exec
and eval
. It does not execute or evaluate your statements or expressions, but returns a code object that can do it. The modes are as follows:
compile(string, '', 'eval')
returns the code object that would have been executed had you done eval(string)
. Note that you cannot use statements in this mode; only a (single) expression is valid.compile(string, '', 'exec')
returns the code object that would have been executed had you done exec(string)
. You can use any number of statements here.compile(string, '', 'single')
is like the exec
mode, but it will ignore everything except for the first statement. Note that an if
/else
statement with its results is considered a single statement.