الدكتوراه: كيفية قمع/تجاهل الإخراج؟
سؤال
تفشل درجة الدكتوراه في وحدة بيثون التالية:
"""
>>> 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()