使用 doctest 并登录 python 程序

Luk*_*uke 6 python logging doctest


#!/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()
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*jip 1

我不确定你为什么要这样做,但如果你确实需要这样做,那么你可以定义你自己的子类DocTestRunner,并重写该run方法:

#imports left out, code not tested - just to point you in the right direction
class MyDocTestRunner(DocTestRunner):
    def run(self, test, compileflags=None, out=None, clear_globs=True):
        if out is None:
            handler = None
        else:
            handler = StreamHandler(out)
        logger = logging.getLogger() # root logger (say)
        if handler:
            logger.addHandler(handler)
        try:
            DocTestRunner.run(self, test, compileflags, out, clear_globs)
        finally:
            if handler:
                logger.removeHandler(handler)
                handler.close()
Run Code Online (Sandbox Code Playgroud)

然后使用这个跑步者代替DocTestRunner