سؤال

تفشل درجة الدكتوراه في وحدة بيثون التالية:

"""
>>> L = []
>>> if True:
...    append_to(L) # XXX
>>> L
[1]
"""

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

import doctest; doctest.testmod()

وذلك لأن الإخراج بعد وضع علامة xxx هو <__main__.A object at ...> (الذي تم إرجاعه بواسطة append_to). بالطبع ، يمكنني وضع هذا المخرج مباشرة بعد وضع علامة على السطر XXX ولكن في حالتي من شأنه أن يصرف انتباه القارئ عما يجب اختباره بالفعل ، أي التأثير الجانبي للوظيفة append_to. فكيف يمكنني قمع هذا الإخراج أو كيف يمكنني تجاهله. جربته مع:

"""
>>> L = []
>>> if True:
...    append_to(L) # doctest: +ELLIPSIS
    ...
>>> L
[1]
"""

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

import doctest; doctest.testmod()

ومع ذلك ، فإن هذا يعطي أ ValueError: line 4 of the docstring for __main__ has inconsistent leading whitespace: ' ...'.

ما لا أريد فعله هو تغيير الخط append_to(L) لشيء مثل _ = append_to(L) والتي من شأنها أن تقمع الناتج ، لأن الدكتوراه هي لأغراض الوثائق وإظهار القارئ كيف من المفترض أن تستخدم الوحدة النمطية. (في الحالة التي يتم توثيقها ، append_to يجب أن تستخدم البيان مثل وليس مثل وظيفة. جاري الكتابة _ = append_to(L) من شأنه أن ينحرف القارئ عن هذا.)

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

المحلول

اعادة كتابة: هذا في الواقع يعمل الآن ؛ أدركت أن "Doctest" الذي كتبته في وقت سابق لم يتم تحليله في الواقع كوحدة Docstring ، لذلك لم يكن الاختبار يمر: لم يتم تشغيله.

لقد حرصت على التحقق من هذا واحد.

__doc__ = """
>>> L = []
>>> if True:
...    append_to(L) # doctest: +IGNORE_RESULT
>>> L
[1]
""".replace('+IGNORE_RESULT', '+ELLIPSIS\n<...>')

def append_to(L):
    L.append(1)
    class A(object):
        pass
    return A()

لست متأكدًا مما إذا كان هذا مؤهلاً أكثر قابلية للقراءة أم لا. لاحظ أنه لا يوجد شيء مميز <...>: لن يعمل إلا إذا كانت قيمة الإرجاع الفعلية تحتوي على هذا النموذج ، كما هو الحال في هذه الحالة (أي أنه كذلك <module.A object at 0x...>). خيار القطع النخاعي يجعل ... "تطابق أي فرعية في الإخراج الفعلي " ¹. لذلك لا أعتقد أن هناك طريقة لجعلها تتناسب مع كامل الإخراج.

تحديث: للقيام بذلك بالطريقة "المناسبة" ، يبدو أنك تريد الاتصال doctest.register_optionflag('IGNORE_RESULT'), ، الفئة الفرعية doctest.OptionChecker, ، وترتيب مثيل لتلك الفئة الفرعية لاستخدامها من قبل الدكتوراه. من المفترض أن هذا يعني أن تشغيل الدكتوراه عبر $ python -m doctest your_module.py ليس خيارًا.

نصائح أخرى

يرجى محاولة إعطاء رمز قائم بذاته بالكامل ؛ حتى عندما تُظهر مشكلة ، يجب أن يتم تشغيل الرمز من تلقاء نفسه لإعادة إنتاج المشكلة ، بحيث يمكن للحلول نسخ الكود مباشرة لإظهار الإجابة.

لا أعرف حلاً نظيفًا لهذا ، وقد ضربته من قبل ؛ يبدو أن التأثير الجانبي للتعريفات الغامضة (أكثر صدقًا: قذرة). يتمثل الحل البديل في تذكر أنه يمكنك تحديد الوظائف داخل الدكتوراه ، بحيث يمكنك احتواء اختبار كامل كدالة واحدة بدلاً من عباراتها الفردية.

def append_to(l):
    """
    >>> L = []
    >>> def test():
    ...     if True:
    ...         append_to(L) # XXX
    >>> test()
    >>> L
    [1]

    >>> def test():
    ...     L = []
    ...     if True:
    ...         append_to(L) # XXX
    ...     return L
    >>> test()
    [1]

    """
    l.append(1)
    return object()

if __name__ == "__main__":
    import doctest
    doctest.testmod()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top