17

Python doctest はクールです。簡単な例から始めましょう。

def foo():
  """
  >>> foo()
  hello world
  """
  print "hello world"

ここで、時間値または乱数などの理由で、一部が多少変化していると仮定しましょう。通常、doctest では +ELLIPSIS オプションを使用してワイルドカードを指定できます。

たとえば、「world」が可変文字列の場合、これはうまく機能します。

def foo():
  """
  >>> foo()   # doctest: +ELLIPSIS
  hello ...
  """
  print "hello world"

ただし、私の場合、変数文字列は行の先頭にあります。

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  ... world
  """
  print "hello world"

先頭の 3 つのドットは、出力の省略記号としてではなく、行継続文字として解釈されるため、これは悪いことです。したがって、このテストは失敗します。

Failed example:
    foo() # doctest: +ELLIPSIS
    world
Expected nothing
Got:
    hello world

それで、変数部分を別の場所に持つようにできるように書き換えることができましたが、行頭の 3 つのドットが省略記号であることを doctest に教える方法はありますか?

4

5 に答える 5

9

これはあなたのための簡単で汚いハックです:

def foo():
    """
    >>> foo() # doctest: +ELLIPSIS
    [...] world
    """
    print "hello world"

if __name__ == "__main__":
    import doctest

    OC = doctest.OutputChecker
    class AEOutputChecker(OC):
        def check_output(self, want, got, optionflags):
            from re import sub
            if optionflags & doctest.ELLIPSIS:
                want = sub(r'\[\.\.\.\]', '...', want)
            return OC.check_output(self, want, got, optionflags)

    doctest.OutputChecker = AEOutputChecker
    doctest.testmod()

これはまだ通常の ( ... ) 省略記号を理解していますが、行開始のあいまいさを引き起こさない新しい省略記号 ( [...] ) を追加しています。

保留中の行継続があるかどうか、または行開始の省略記号であるかどうかを doctest が推測するのは非常に困難です。理論的には、DocTestParser をサブクラス化してその作業を実行すれば可能ですが、おそらく面白くないでしょう。

複雑な状況では、おそらく新しい OutputChecker を使用する独自の DocTestRunner を作成し、通常の testmod の代わりにそれを使用する必要がありますが、これは単純なシナリオで行う必要があります。

于 2011-04-28T15:20:26.597 に答える