[Python-Dev] eval() accepts compiled 'exec' statements (original) (raw)
Terry Reedy tjreedy at udel.edu
Sat Aug 16 22:45:32 CEST 2008
- Previous message: [Python-Dev] eval() accepts compiled 'exec' statements
- Next message: [Python-Dev] Where are universal newlines handled in the parser/compiler?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Patrick Maupin wrote:
This may or may not be relevant to 2.6 or 3.0 (because I don't have those handy at the moment), but on 2.5 and earlier:
Python 2.5.2 (r252:60911, May 7 2008, 15:19:09) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
print eval(compile('print "It works"\n', '', 'exec')) It works None
In 3.0b2, print( eval(compile('print( "It works")\n', '', 'exec'))) does the same thing. So does print( exec(compile('print( "It works")\n', '', 'exec'))) and I presume the exec statement would in 2.x.
Personally, I'm absolutely fine with this (because I have a use case, naturally),
The only possible use I can think of would be is you are eval-ing mixed-kind code objects:
def eval_and_go(cobj): # cobj = code object of whatever kind x = eval(cobj) if x is not None: # was not side-effect only return g(x) else: return None
but eval() does work differently for compiled vs non-compiled objects, and this behavior doesn't match what the doc at http://docs.python.org/lib/built-in-funcs.html says, namely "This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. The code object must have been compiled passing 'eval' as the kind argument."
That doc statement is, itself, contradictory. How can it be an "arbitrary code object" if it must have been compiled using 'eval'? Perhaps all that is meant is "In order to return a result other than None to eval's caller, the code object must have been compiled passing 'eval' as the kind argument." So, either the code or the doc should be fixed. I would vote +1 for fixing the doc to match the code, but then I'm the sort of dysfunctional programmer who sometimes has a use-case for expressions with side-effects.
I filed a condensed version of this report, with my suggested added text, as http://bugs.python.org/issue3569
tjr
- Previous message: [Python-Dev] eval() accepts compiled 'exec' statements
- Next message: [Python-Dev] Where are universal newlines handled in the parser/compiler?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]