>> foo (0-6ren">
gpt4 book ai didi

python - 在 python 程序中使用 doctest 和登录

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:32 25 4
gpt4 key购买 nike


#!/usr/bin/python2.4
import logging
import sys
import doctest
def foo(x):
"""
>>> foo (0)
0
"""
print ("%d" %(x))
_logger.debug("%d" %(x))
def _test():
doctest.testmod()
_logger = logging.getLogger()
_logger.setLevel(logging.DEBUG)
_formatter = logging.Formatter('%(message)s')
_handler = logging.StreamHandler(sys.stdout)
_handler.setFormatter(_formatter)
_logger.addHandler(_handler)
_test()

我想为我所有的打印语句使用记录器模块。为此,我查看了前 50 个顶级谷歌链接,他们似乎同意 doctest 使用它自己的 stdout 副本。如果使用 print 它会工作,如果使用 logger 它会记录到根控制台。有人可以用允许我组合的代码片段来演示一个工作示例。请注意,运行 nose 来测试 doctest 只会在测试结束时附加日志输出,(假设您设置了开关)它不会将它们视为打印语句。

最佳答案

在您的 doctest 中,在需要任何日志记录捕获之前,在您的记录器上执行 addHandler(logging.Streamhandler(sys.stdout))

例如,假设logger是您的日志记录对象:

"""
This is a doctest that will capture output from the logging module.

>>> logger.addHandler(logging.StreamHandler(sys.stdout))

The rest of your doctest, now able to use output from the logging
module...
"""

说明:正如您所说,“doctest 使用它自己的 stdout 副本”。它通过欺骗 sys.stdout 来做到这一点:它将 sys.stdout 设置为 DocTestRunner._fakeout。一旦 doctest 开始运行,doctest 就有了它的欺骗,所以 sys.stdout 现在被设置为 DocTestRunner._fakeout。如果此时为 sys.stdout 创建一个 logging.StreamHandler,sys.stdout 将指向 doctest 对 sys.stdout 的欺骗而不是真正的 sys.stdout,因此您现在为添加一个 StreamHandler doctest 的恶搞而不是真正的 sys.stdout,使 doctest 看到您记录的输出。

该解决方案还有一个优点是不依赖于 doctest 中的内部私有(private)变量,例如 _fakeout_SpoofOut,以防它们将来发生变化。

陷阱:如果你得到

error: [Errno 128] Transport endpoint is not connected

您可能忘记了 import sys

关于python - 在 python 程序中使用 doctest 和登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2717834/

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