Python doctest 不能在名为 signal.py 的文件上运行

标签 python doctest

问题

我在 Fedora 28 上使用 python 3.6.6。我的项目结构如下:

test/__init__.py
test/signal.py
test/notsignal.py

如果我运行$ python3 -m doctest -v test/signal.py 我得到:

10 items had no tests:
    signal
    signal.Handlers
    signal.ItimerError
    signal.Sigmasks
    signal.Signals
    signal._enum_to_int
    signal._int_to_enum
    signal.struct_siginfo
    signal.struct_siginfo.__reduce__
    signal.struct_siginfo.__repr__
0 tests in 10 items.
0 passed and 0 failed.
Test passed.

对我来说,这清楚地表明 doctest 正在尝试在内置 signal 模块上运行。通过重命名该文件,我能够运行 docset。我错过了什么还是这是一个错误?

重现

您可以使用以下 shell 脚本。

#!/bin/sh
mkdir -p test
touch test/__init__.py
echo -e ""'"'""'"'""'"'"\n>>> _ = print(f'Doctest at {__name__} was run.')\n"'"'""'"'""'"'"" > test/signal.py
cp test/signal.py test/notsignal.py
python3 -m doctest -v test/signal.py
python3 -m doctest -v test/notsignal.py

最佳答案

如果你看doctest source ,您可以看到 doctest 尝试导入您传递给它的模块。

标准库的信号模块很可能已经导入:

$ python -c 'import sys;import doctest;print("signal" in sys.modules)'
True

当 doctest 尝试导入时,Python 解释器发现 sys.modules 中已经存在一个名为“signal”的模块,并返回该模块而不是您的信号模块。

也许这是一个错误 - 也许 doctest 可以更聪明地了解它的导入方式 - 但实际上我认为最好的做法是重命名你的模块。一般来说,与标准库模块同名的模块几乎总是会导致问题。

关于Python doctest 不能在名为 signal.py 的文件上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647886/

相关文章:

python - "python -m doctest"忽略不同目录下的同名文件

python - Python2 和 Python3 的正则表达式差异

python - 如何获取 Python 日志模块当前正在登录的文件?

java - 如何在没有硬编码文件路径的情况下从 Java 运行 Python 脚本?

rust - 推断调用包的名称以在过程宏中填充一个 doctest

python - Doctest 和第三方装饰器

python:doctest我的github-markdown文件?

python - Python 中 if/else 语句错误中不支持的操作数

java - 在Python中解码java对象

Python:对类使用文档测试