Doctest 和相关导入

发布于 2024-09-30 08:50:32 字数 822 浏览 6 评论 0原文

我在使用 doctest 和相对导入时遇到问题。简单的解决方案就是摆脱相对导入。还有其他人吗?

假设我有一个名为 example 的包,其中包含 2 个文件:

example/__init__.py

"""
This package is entirely useless.
>>> arnold = Aardvark()
>>> arnold.talk()
I am an aardvark.
"""

from .A import Aardvark

if __name__ == "__main__":
    import doctest
    doctest.testmod()

example/A.py

class Aardvark(object):
    def talk(self):
        print("I am an aardvark.")

如果我现在尝试

python example/__init__.py

,那么我会得到错误

Traceback (most recent call last):
  File "example/__init__.py", line 8, in <module>
    from .A import Aardvark
ValueError: Attempted relative import in non-package

I'm having trouble using doctest with relative imports. The simple solution is just to get rid of the relative imports. Are there any others?

Say I have a package called example containing 2 files:

example/__init__.py

"""
This package is entirely useless.
>>> arnold = Aardvark()
>>> arnold.talk()
I am an aardvark.
"""

from .A import Aardvark

if __name__ == "__main__":
    import doctest
    doctest.testmod()

example/A.py

class Aardvark(object):
    def talk(self):
        print("I am an aardvark.")

If I now attempt

python example/__init__.py

then I get the error

Traceback (most recent call last):
  File "example/__init__.py", line 8, in <module>
    from .A import Aardvark
ValueError: Attempted relative import in non-package

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦冥 2024-10-07 08:50:32

创建另一个文件my_doctest_runner.py

if __name__ == "__main__":
    import doctest
    import example
    doctest.testmod(example)

执行my_doctest_runner.py以运行example/__init__.py中的doctests:

$ python2.7 my_doctest_runner.py
**********************************************************************
File "/tmp/example/__init__.py", line 4, in example
Failed example:
    arnold.talk()
Expected:
    I am an aaardvark.
Got:
    I am an aardvark.
**********************************************************************
1 items had failures:
   1 of   2 in example
***Test Failed*** 1 failures.

Create another file my_doctest_runner.py:

if __name__ == "__main__":
    import doctest
    import example
    doctest.testmod(example)

Execute my_doctest_runner.py to run doctests in example/__init__.py:

$ python2.7 my_doctest_runner.py
**********************************************************************
File "/tmp/example/__init__.py", line 4, in example
Failed example:
    arnold.talk()
Expected:
    I am an aaardvark.
Got:
    I am an aardvark.
**********************************************************************
1 items had failures:
   1 of   2 in example
***Test Failed*** 1 failures.
叹倦 2024-10-07 08:50:32

Pytest 的 --doctest-modules< /a> 标志负责相对导入:

$ ls example/
A.py  __init__.py
$ pytest --doctest-modules example
==================== test session starts ====================
...

example/__init__.py .                                 [100%]

===================== 1 passed in 0.03s =====================

Pytest's --doctest-modules flag takes care of relative imports:

$ ls example/
A.py  __init__.py
$ pytest --doctest-modules example
==================== test session starts ====================
...

example/__init__.py .                                 [100%]

===================== 1 passed in 0.03s =====================
南冥有猫 2024-10-07 08:50:32

只要做

from A import Aardvark

Just do

from A import Aardvark
最舍不得你 2024-10-07 08:50:32

从 pytest 6.0.0 开始,importlib 是有效的 导入模式。使用它解决了我的问题。

pytest --import-mode=importlib

As of pytest 6.0.0, importlib is a valid import mode. Using that solved the problem for me.

pytest --import-mode=importlib
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文