7

#!/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のコピーを使用することに同意しているようです。印刷が使用されている場合、ロガーが使用されている場合は機能し、ルートコンソールにログを記録します。誰かが私が組み合わせることができるコードスニペットで実際の例を示してもらえますか?doctestをテストするためにnoseを実行すると、テストの最後にログ出力が追加されるだけであり(スイッチを設定したと仮定)、それらはprintステートメントとして扱われないことに注意してください。

4

3 に答える 3

3

doctest 内で、ロギング キャプチャが必要になる前addHandler(logging.Streamhandler(sys.stdout))に、ロガーで a を実行します。

たとえば、 がロギング オブジェクトであると仮定し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 が実行されると、doctest はすでにスプーフィングを行っているため、sys.stdout現在は に設定されていDocTestRunner._fakeoutます。logging.StreamHandlerこの時点で for sys.stdoutを作成すると、sys.stdout は、実際の sys.stdout ではなく、sys.stdout に対する doctest のスプーフィングを指します。

このソリューションには、将来変更された場合に備えて、_fakeoutやなどの doctest の内部プライベート変数に依存しないという利点もあります。_SpoofOut

落とし穴: 取得した場合

error: [Errno 128] Transport endpoint is not connected

するのを忘れているかもしれませんimport sys

于 2016-09-16T03:34:56.447 に答える
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()

次に、このランナーを の代わりに使用しDocTestRunnerます。

于 2010-04-28T14:41:02.973 に答える
0

シンプルで汎用的なアプローチの 1 つを次に示します。

LOGGER = logging.getLogger(__name__)
if hasattr(sys.modules['__main__'], '_SpoofOut'):
    LOGGER.setLevel(logging.DEBUG)
    LOGGER.addHandler(logger.addHandler(logging.StreamHandler()))

この_SpoofOut属性は、doctest モジュールによって注入されます。存在する場合は、doctest 専用のログを構成できます。たとえば、私の例では、冗長デバッグ モードを設定し、コンソールにログを記録します。

于 2016-07-12T20:09:48.473 に答える