gpt4 book ai didi

python - 如何确定代码是否正在 doctest 中运行?

转载 作者:太空狗 更新时间:2023-10-30 01:17:03 25 4
gpt4 key购买 nike

如何让我的 (Python 2.7) 代码知道它是否在 doctest 中运行?

场景如下:我有一个函数,print() 将一些输出输出到作为参数传入的文件描述符,如下所示:

from __future__ import print_function

def printing_func(inarg, file=sys.stdout):
# (do some stuff...)
print(result, file=file)

但是当我尝试在 doctest 中使用 printing_func() 时,测试失败了;由于我在调用 print() 时指定了关键字参数 file,因此输出实际上转到了 sys.stdout 而不是任何默认的输出重定向由 doctest 模块设置,doctest 永远看不到输出。

那么我怎样才能让 printing_func() 知道它是否在 doctest 中运行,这样它就知道在调用 时不传递 file 关键字参数打印()?

最佳答案

Niten 版本的 inside_doctest 似乎过于宽泛。重新定义 sys.stdout 并不罕见,无论是用于日志记录还是在 doctest 以外的框架中进行测试时,它都会产生误报。

更窄的测试看起来像这样:

import sys

def in_doctest():
"""
Determined by observation
"""
if '_pytest.doctest' in sys.modules:
return True
##
if hasattr(sys.modules['__main__'], '_SpoofOut'):
return True
##
if sys.modules['__main__'].__dict__.get('__file__', '').endswith('/pytest'):
return True
##
return False


def test():
"""
>>> print 'inside comments, running in doctest?', in_doctest()
inside comments, running in doctest? True
"""
print 'outside comments, running in doctest?', in_doctest()

if __name__ == '__main__':
test()

in_doctest 测试 _SpoofOut 类 doctest 用于替换 sys.stdout。 doctest 模块的其他属性可以用相同的方式验证。并不是说您可以阻止另一个模块重用某个名称,但这个名称并不常见,因此可能是一个不错的测试。

将以上内容放入test.py。在非 doctest 模式下运行它,python test.py 产生:

outside comments, running in doctest? False

在 doctest 详细模式下运行,python -m doctest test.py -v 产生:

Trying:
print 'inside comments, running in doctest?', in_doctest()
Expecting:
inside comments, running in doctest? True
ok

我同意其他人的评论,即让代码知道 doctest 通常不是一个好主意。我只是在有些特殊的情况下才这样做——当我需要通过代码生成器创建测试用例时,因为有太多无法有效地手动制作。但是如果你需要这样做,上面的测试是一个不错的测试。

关于python - 如何确定代码是否正在 doctest 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com