This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Python 3.9 eval on list comprehension sometimes returns coroutines
Type: Stage: resolved
Components: Interpreter Core Versions: Python 3.9
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: BTaskaya, Jonathan Crall, vstinner
Priority: normal Keywords:

Created on 2020-04-29 15:02 by Jonathan Crall, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (6)
msg367651 - (view) Author: Jonathan Crall (Jonathan Crall) Date: 2020-04-29 15:02
I first noticed this when testing xdoctest on Python 3.9, and then again when using IPython.

I was finally able to generate a minimal working example in Python itself. The following code:

python -c "print(eval(compile('[i for i in range(3)]', mode='eval', filename='foo', flags=221184)))"

produces 

[0, 1, 2]
 
in Python <= 3.8, but in 3.9 it produces: 

<coroutine object <module> at 0x7fa336d40ec0>
<string>:1: RuntimeWarning: coroutine '<module>' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback


Is this an intended change? I can't find any notes in the CHANGELOG that seem to correspond to it.
msg367652 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2020-04-29 15:04
> I first noticed this when testing xdoctest on Python 3.9, and then again when using IPython.

What is your Python 3.9 exact version number?

I cannot reproduce your issue with Python 3.9.0a6:

vstinner@apu$ ./python -c "print(eval(compile('[i for i in range(3)]', mode='eval', filename='foo', flags=221184)))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: compile(): unrecognised flags

vstinner@apu$ ./python -VV
Python 3.9.0a6+ (heads/master:9a8c1315c3, Apr 29 2020, 17:03:41) 
[GCC 9.3.1 20200408 (Red Hat 9.3.1-2)]
msg367653 - (view) Author: Jonathan Crall (Jonathan Crall) Date: 2020-04-29 15:11
Ah, sorry. I neglected all the important information. 

I tested this using: 

Python 3.9.0a5 (default, Apr 23 2020, 14:11:34) 
[GCC 8.3.0]


Specifically, I ran in a docker container: 

DOCKER_IMAGE=circleci/python:3.9-rc
docker pull $DOCKER_IMAGE
docker run --rm -it $DOCKER_IMAGE bash

And then in the bash shell in the docker image I ran:

python -c "print(eval(compile('[i for i in range(3)]', mode='eval', filename='foo', flags=221184)))"
msg367656 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2020-04-29 15:12
I close the issue: it's already fixed in 3.9.0a6. If it's not the case, feel free to reopen the issue ;-)
msg367684 - (view) Author: Jonathan Crall (Jonathan Crall) Date: 2020-04-29 17:44
This can be closed, but for completeness, the test you ran didn't verify that the bug was fixed. This is because the hard coded compile flags I gave in my example seem to have changed in Python 3.9 (is this documented?). 

In python3.8 the compile flags I specified correspond to division, print_function, unicode_literals, and absolute_import. 

python3.8 -c "import __future__; print(__future__.print_function.compiler_flag | __future__.division.compiler_flag | __future__.unicode_literals.compiler_flag | __future__.absolute_import.compiler_flag)"


Results in: 221184


In Python 3.9 the same code results in: 3538944


I can modify the MWE to accommodate these changes: 

./python -c "import __future__; print(eval(compile('[i for i in range(3)]', mode='eval', filename='fo', flags=__future__.print_function.compiler_flag | __future__.division.compiler_flag | __future__.unicode_literals.compiler_flag | __future__.absolute_import.compiler_flag)))"


Which does produce the correct output as expected. So, the issue can remain closed. I am curious what the bug in 3.9.0a5 was though if you have any speculations.
msg367685 - (view) Author: Batuhan Taskaya (BTaskaya) * (Python committer) Date: 2020-04-29 17:56
> This can be closed, but for completeness, the test you ran didn't verify that the bug was fixed. This is because the hard coded compile flags I gave in my example seem to have changed in Python 3.9 (is this documented?). 

Yes, this is documented on What's New.

> Which does produce the correct output as expected. So, the issue can remain closed. I am curious what the bug in 3.9.0a5 was though if you have any speculations.

See issue 39562
History
Date User Action Args
2022-04-11 14:59:30adminsetgithub: 84618
2020-04-29 17:56:14BTaskayasetmessages: + msg367685
2020-04-29 17:44:35Jonathan Crallsetmessages: + msg367684
2020-04-29 15:12:56vstinnersetstatus: open -> closed
resolution: fixed
messages: + msg367656

stage: resolved
2020-04-29 15:11:26Jonathan Crallsetmessages: + msg367653
2020-04-29 15:05:44BTaskayasetnosy: + BTaskaya
2020-04-29 15:04:27vstinnersetnosy: + vstinner
messages: + msg367652
2020-04-29 15:02:05Jonathan Crallcreate