[Python-Dev] Passing compile(...,'exec') code to 'eval'

Brett C. bac at OCF.Berkeley.EDU
Wed May 5 14:23:16 EDT 2004


In preparations for my coding my thesis I have been trying to figure out 
how a local variable could be assigned to without me explicitly knowing 
during compilation.  Obviously 'exec' can.  But I wasn't sure about 'eval'.

Reading the docs, I didn't think it could since 'eval', when taking a 
string, only evaluates expressions.  But what about code objects?  The 
docs say, "The code object must have been  compiled passing 'eval' as 
the kind argument".  But I didn't read that when I started testing.

This is when I discovered you *can* pass in something using 'compile' 
with the kind argument of "exec"::

 >>> x
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
NameError: name 'x' is not defined
[16425 refs]
 >>> eval(compile("x = 1", "<string>", "exec"))
[16426 refs]
 >>> x
1

Is this a bug, or are the docs wrong?  I am hoping it is the former 
since if it is the latter my thesis just got a big caveat pasted into it 
about how 'eval' can cause problems and invalidate the type inferencing 
in irreparable ways.

-Brett



More information about the Python-Dev mailing list