سؤال


#!/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()

أرغب في استخدام وحدة Logger لجميع عبارات الطباعة الخاصة بي. لقد نظرت إلى أول 50 روابط Google Top لهذا ، ويبدو أنهم يتفقون على أن Doctest يستخدم نسخة خاصة به من stdout. إذا تم استخدام الطباعة ، فهي تعمل في حالة استخدام المسجل ، فهو يسجل إلى وحدة التحكم الجذر. هل يمكن لشخص ما إظهار مثال عمل مع مقتطف رمز يسمح لي بالجمع. لاحظ أن تشغيل الأنف لاختبار Doctest سيؤدي فقط إلى إلحاق إخراج السجل في نهاية الاختبار ، (على افتراض أنك ضبط المفاتيح) ، فإنه لا يعاملها كبيان طباعة.

هل كانت مفيدة؟

المحلول

لست متأكدًا من سبب رغبتك في القيام بذلك ، ولكن إذا كنت بحاجة حقًا إلى القيام بذلك ، فيمكنك تحديد الفئة الفرعية الخاصة بك 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.

نصائح أخرى

حسنًا ، هذا خط واحد بسيط يعمل بشكل جيد:

ضمن الدكتوراه ، قبل الحاجة إلى أي التقاط قطع تسجيل ، افعل أ 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 بالفعل محاكاة ساخرة في مكانها ، لذلك sys.stdout تم تعيينه الآن على DocTestRunner._fakeout. إذا قمت بإنشاء ملف logging.StreamHandler بالنسبة لـ Sys.stdout في هذه المرحلة ، ستشير Sys.Stdout إلى محاكاة الدكتوراه لـ Sys.Stdout بدلاً من Sys.Stdout الحقيقي.

هذا الحل له أيضًا ميزة لا يعتمد على المتغيرات الخاصة الداخلية في الدكتوراه ، مثل _fakeout أو _SpoofOut, ، في حال تغيرت في المستقبل.

إذا حصلت على:

error: [Errno 128] Transport endpoint is not connected

ربما نسيت ذلك import sys.

يبدو أن نهجًا بسيطًا وأغراضًا عامًا يبدو:

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

ال _SpoofOut يتم حقن السمة بواسطة وحدة الدكتوراه. في حالة وجوده ، يمكنك تكوين التسجيل خصيصًا لـ Doctest. على سبيل المثال ، قم بتعيين وضع التصحيح المطوّل وتسجيل الدخول إلى وحدة التحكم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top