マルチスレッドはてなキーワードしりとりのdoctestを書いてみました

先日の記事に対して「標準出力のテストにはunittestよりdoctestのほうがいいよ」と教えていただいたのでdoctestを書いてみました。

書いていて気づいた点なのですが、doctest内でunicode型文字列を使いたい場合、docstring自体をunicode型にしておく必要があります。(下記)

def main(initial=u"あ", inputsource=multi_input_reader()):
    u"""  ←この行のuが重要!!
    (以下略

そうしておかないと「u"アフロ"」のような記述がunicodeとして有効にならず、

    >>> main(inputsource=[[u"アフロ", u"ローマ字", u"ジントニック"], [u"クラス", u"スルメ"]])

といった記述がエラーになってしまいます。

以下コード抜粋

def main(initial=u"あ", inputsource=multi_input_reader()):
    u"""
    正常パターン
    >>> main(inputsource=[[u"アフロ", u"ローマ字", u"ジントニック"], [u"クラス", u"スルメ"]])
    最初のもじは「あ」です
    アフロ
    ローマ字
    ジントニック
    --次は4語目です。--
    クラス
    スルメ
    --次は6語目です。--
    終了です
    
    例外パターン
    >>> main(inputsource=[[u"アフロ", u"アフロ"], 
    ... [u"アフロ"], [u"アフロ"] ,[u"Linux"], [u"伯爵"], [u"あああ"], [u"ロンドン"]])
    最初のもじは「あ」です
    入力した単語に重複があります。
    --次は1語目です。--
    アフロ
    --次は2語目です。--
    「アフロ」は1番目に使いました。
    --次は2語目です。--
    「Linux」は使えません。次の文字は「ろ」です!
    --次は2語目です。--
    「伯爵」のxmlデータを正しく受信できませんでした。他の単語を試してください。
    --次は2語目です。--
    「あああ」ははてなキーワードに登録されていませんでした。
    --次は2語目です。--
    「ロンドン」は「ん」で終わっています。
    終了です
       
    """
    usedwords = {}

    print (u"最初のもじは「" + initial + u"」です")

    for wordsU in inputsource:
        try:
            for (furigana, word) in ParallelAsk.get_result(wordsU):
                if word in usedwords:  # 使用済みでないか確認
                    raise shiritori.UniquenessError(word, usedwords[word])

                furigana.exam(initial, word)  # 冒頭、末尾文字確認
                initial = furigana.creatIL()
                print word
                usedwords[word] = len(usedwords) + 1

            print u"--次は" + str(len(usedwords) + 1) + u"語目です。--"

        except shiritori.CrtShiritoriError, e:
            print e
            break
        except shiritori.ShiritoriRuleError, e:
            print e
            print u"--次は" + str(len(usedwords) + 1) + u"語目です。--"
            continue

    print u"終了です"

if __name__ == "__main__":
    import doctest
    doctest.testmod()