Python doctest无法在名为signal.py

时间:2018-10-04 13:23:26

标签: 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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

也许这是一个错误-也许doctest对其导入方式可能更聪明-但实际上,我认为最好的做法是重命名模块。通常,具有与标准库模块同名的模块几乎总是会引起问题。