1

文字列を生の文字列としてエンコードしたにもかかわらず、テスト入力文字列の1つにエスケープ文字のように扱われるバックスラッシュがあるため、失敗するpythondoctestの関数があります。

私のdoctestは次のようになります:

>>> infile = [ "Todo:        fix me", "/** todo: fix", "* me", "*/", r"""//\todo      stuff to fix""", "TODO fix me too", "toDo bug 4663" ]
>>> find_todos( infile )
['fix me', 'fix', 'stuff to fix', 'fix me too', 'bug 4663']

また、todo仕様のバリエーションに続いて、1行からtodoテキストを抽出することを目的とした関数は、次のようになります。

todos = list()
for line in infile:
    print line
    if todo_match_obj.search( line ):
        todos.append( todo_match_obj.search( line ).group( 'todo' ) )

そして、と呼ばれる正規表現は次のtodo_match_objとおりです。

r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""

私のipythonシェルとの簡単な会話は私に与えます:

In [35]: print "//\todo"
//      odo

In [36]: print r"""//\todo"""
//\todo

そして、doctestの実装がstdoutを使用する場合に備えて(私はチェックしていません、申し訳ありません):

In [37]: sys.stdout.write( r"""//\todo""" )
//\todo

私の正規表現-fooはどの基準でも高くはなく、ここで何かが欠けている可能性があることに気づきました。

編集:Alex Martellisの回答に続いて、どの正規表現実際に爆破されたものと一致するかについての提案が必要r"""//\todo fix me"""です。私はもともと宿題をするように誰かに頼んだのではないことを知っています、そしてそれが私の質問に本当に答えたので(または私の恐れを確認したので)私はアレックスの答えを受け入れます。しかし、私はここで私の問題に対する良い解決策に賛成することを約束します:)

編集編集:参考までに、kodosプロジェクトにバグが報告されています:バグ#437633

Python 2.6.4を使用しています(r264:75706、2009年12月7日、18:45:15)

ここまで読んでいただきありがとうございます(ここを直接スキップした場合は、理解できます)

4

2 に答える 2

2

元の正規表現を注意深く読んでください。

r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""

一致するのは、0〜2個のスラッシュ、次に0個以上の星、次に0個または1個の「空白文字」(空白、タブなど)、次にリテラル文字'todo'(など)です。

あなたのrawstringは:

r"""//\todo      stuff to fix"""

したがって、スラッシュとスラッシュの間には文字通りのバックスラッシュがあります'todo'。したがって、もちろん正規表現はそれに一致しません。それはできません-その正規表現のどこにも、文字通りの円記号をオプションで一致させたいという願望を表明していません。

編集:あなたのパターンに非常に近いREパターンで、次のようになる直前にオプションの円記号を受け入れて無視します't'

r"""(?:/{0,2}\**\s?\\?todo):?\s*(?P<todo>.+)"""

この場合、「それ自体をエスケープ」するには、バックスラッシュを繰り返す必要があることに注意してください。

于 2010-04-05T19:44:52.423 に答える
1

私がdoctestsの道を進んでいくと、これはさらに奇妙になります。

このPythonスクリプトを考えてみましょう。

22行目と23行目のコメントを外すと、メソッドがを返すため、スクリプトは問題なく渡されますTrue。これは、アサートされ、明示的に比較されます。

ただし、リンク内のファイルをそのまま実行すると、doctestは次のメッセージで失敗します。

% python doctest_test.py                                                                                                          
**********************************************************************
File "doctest_test.py", line 3, in __main__.doctest_test
Failed example:
    doctest_test( r"""//    odo""" )
Exception raised:
    Traceback (most recent call last):
      File "/usr/lib/python2.6/doctest.py", line 1241, in __run
        compileflags, 1) in test.globs
      File "<doctest __main__.doctest_test[0]>", line 1, in <module>
        doctest_test( r"""//    odo""" )
      File "doctest_test.py", line 14, in doctest_test
        assert input_string == compare_string
    AssertionError
**********************************************************************
1 items had failures:
   1 of   1 in __main__.doctest_test
***Test Failed*** 1 failures.

誰かがここで私を教えてもらえますか?

私はまだこれにPython2.6.4を使用しています。

私はこの回答を「コミュニティウィキ」の下に置いています。これは、評判に関しては質問とは実際には関係がないためです。

于 2010-04-05T21:41:42.197 に答える