マルチスレッドはてなキーワードしりとりの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()