"ValueError: compile(): unrecognised flags" when running doctest on module using __future__.annotations

"ValueError: compile(): unrecognised flags" when running doctest on module using __future__.annotations

我有一个奇怪的行为,恐怕不容易重现。也许你可以给我一个提示..

在 Ubuntu 18.04 机器上和 venv 内部,我 运行ning pytest --doctest-modules 在使用 [=13= 的模块上使用 Python 3.8.0 ]

pipenv run pytest --doctest-modules my_module.py

没有问题。

现在我 运行 在 Docker 环境(使用 ubuntu:20.04)中执行相同的命令,映射包含 .venv 文件夹的目录。安装了相同的 Python 版本并且 pipenv graph 的输出没有差异我得到一个异常:

pipenv run pytest --doctest-modules my_module.py
____________________ [doctest] my_module _____________________________________

[some doctest code]

UNEXPECTED EXCEPTION: ValueError('compile(): unrecognised flags')
Traceback (most recent call last):
  File "/usr/lib/python3.8/doctest.py", line 1336, in __run
    exec(compile(example.source, filename, "single",
ValueError: compile(): unrecognised flags
/path/to/my_module.py:1234: UnexpectedException

我尝试比较 /usr/lib/python3.8/__future__.py 和在 Docker 环境内外使用的 doctest.py,但它们是相同的(它们也包含在 .venv 目录中无论如何..).

然后我尝试调查 Doctests exec(compile(...)) 调用中使用的 compileflags,发现在一种情况下(Docker 之外)是 2^20,而在另一种情况下如果是 2^24.

深入挖掘,我发现Docker-环境中__future__.annotationsstr()值是

_Feature((3, 7, 0, 'beta', 1), (3, 10, 0, 'alpha', 0), 16777216)

同时

_Feature((3, 7, 0, 'beta', 1), (4, 0, 0, 'alpha', 0), 1048576)

在 Docker 容器之外。

为什么我会有这些差异?我该如何制作这个 Pytest-Test 运行?

这个也许不应该在cpython 3.8中被反向移植——https://github.com/python/cpython/pull/19835

标志在 3.8.2 和 3.8.3 之间以不兼容的方式更改,这意味着如果您有来自较新版本的 pyc 文件,它将无法与旧版本一起正常工作(尽管被标记为与 cpython 3.8 兼容)

上面链接的补丁调整了标志以避免与其他编译器标志冲突