[docs] [issue33477] Document that compile(code, 'exec') has different behavior in 3.7+
report at bugs.python.org
Sat May 12 20:57:30 EDT 2018
New submission from Matthias Bussonnier <bussonniermatthias at gmail.com>:
In recent Python the following
>>> from ast import PyCF_ONLY_AST
>>> compile("'a'", 'whatever', 'exec', PyCF_ONLY_AST).body
In 3.6 it return
[<_ast.Expr at 0x10b7441d0>] # that contail Str('a')
While on master:
This is inconveninent for alternative repl like IPython, where basically if the user is entering a single string, the result is nothing in Python 3.7+, while it _does_ return something on earlier Python .
The documentation of `compile` says:
> ... it can be 'exec' if source consists of a sequence of statements,
Which is not technically true any more as the first statement, if a string, will be removed.
What's happening here is that since Python 3.7 if the _first_ statement is actually an expression containing a lonely string it is assign to the module docstring. So that's basically assuming you are parsing a module, and that the docstring make sens in this context, while in a REPL you are parsing a sucesssion of statements, in which case there is no need for a docstring that make no sens in this context.
This is _usually_ not an issue, unless this lonely statement is also the last, and what the user wants to execute in a REPL, in which case it has no side effect.
I don't have any objection to the new behavior, though I was wondering if this kind of side effect was anticipated.
If that affect IPython, it will likely effect other alternative REPLs.
Thus, I believe it would be good to have this at least documented a tiny bit better and added in what's new, and potentially clarified in the `exec` docs.
I could argue that now the `exec` name may be a tiny bit unsuitable for the new behavior, and would love if this could be optional.
assignee: docs at python
components: Documentation, Interpreter Core
nosy: docs at python, mbussonn
title: Document that compile(code, 'exec') has different behavior in 3.7+
versions: Python 3.7, Python 3.8
Python tracker <report at bugs.python.org>
More information about the docs