coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

SimplePrograms で Python を学ぶ その14

2024-06-01 09:31:11 | Python
SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

の 14番目のプログラムは、 doctest ベースのテストです。

def median(pool):
    '''Statistical median to demonstrate doctest.
    >>> median([2, 9, 9, 7, 9, 2, 4, 5, 8])
    6 #change to 7 in order to pass the test
    '''
    copy = sorted(pool)
    size = len(copy)
    if size % 2 == 1:
       return copy[int((size - 1) / 2)]
    else:
       return (copy[int(size/2 - 1)] + copy[int(size/2)]) / 2
if __name__ == '__main__':
    import doctest
    doctest.testmod()


よくわからないので、とりあえずファイルにして実行してみましょう。

$ ./prog-014.py
**********************************************************************
File "./prog-014.py", line 4, in __main__.median
Failed example:
    median([2, 9, 9, 7, 9, 2, 4, 5, 8])
Expected:
    6 #change to 7 in order to pass the test
Got:
    7
**********************************************************************
1 items had failures:
   1 of 1 in __main__.median
***Test Failed*** 1 failures.
$

非常に不思議な動きです。3重クォートで作成した関数 media の動作を説明するような文字列から、テストを作成して実行結果が一致するかどうかをテストするようです。
それで、doctest というのですね。

最後の、3行は、doctest を使う場合よく使う書き方でしょう。

https://docs.python.org/ja/3/library/doctest.html?highlight=doctest#module-doctest
には、
「doctest モジュールは、対話的 Python セッションのように見えるテキストを探し出し、セッションの内容を実行して、そこに書かれている通りに振舞うかを調べます。」
具体的に実行例が挙げられているので、実際に使用する場合はこちらの例を参考にした方が良さそうです。

プログラムで、 6 #change to 7 ....
となっているのは、# 以降は Python のコメントとして解釈されて、median()の結果が 6 になるかどうかのテストで、
7 になるので、Failed になるのですね。

ちなみに対話型 Python では、

>>> '''
... line 1
... line 2
... '''
'\nline 1\nline 2\n'
>>>

となるのに、これがファイルの中にあるとあたかもコメントの様に何も表示されません。
$ cat prog-014-02.py
'''
This is a test.
'''
'abc'
123

$ python3 prog-014-02.py
$

不思議ですね。
doctest は、次回もう少し続けてみたいと思います。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« SimplePrograms で Python を... | トップ | SimplePrograms で Python を... »
最新の画像もっと見る

コメントを投稿

Python」カテゴリの最新記事