White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

heapqとdoctest

昨日話を聞いたのでちょっと試してみた。

http://www.python.jp/doc/release/lib/module-heapq.htmlこの辺参考に。

>>> from heapq import heappush, heappop
>>> heap = []
>>> data = [8, 3, 5, 9, 7, 1, 4]
>>> for item in data:
...     heappush(heap,item)
... 
>>> print heap
[1, 7, 3, 9, 8, 5, 4]
>>> sorted = []
>>> while heap:
...     sorted.append(heappop(heap))
... 
>>> print sorted
[1, 3, 4, 5, 7, 8, 9]
>>> data.sort()
>>> print data == sorted
True
>>> for item in data:
...     heappush(heap,item)
... 
>>> print heap
[1, 3, 4, 5, 7, 8, 9]
>>> heappop(heap)
1
>>> print heap
[3, 5, 4, 9, 7, 8]
>>> heappop(heap)
3
>>> print heap
[4, 5, 8, 9, 7]

んー、一個取り出す度にヒープを再構成してて結構時間かかりそうな気が。って空いたとこに子のデータ入れるだけだからそうでもないか。

ついでに上の奴のdostest。ほとんどコピペ。

#!/usr/bin/env python

"""
    >>> from heapq import heappush, heappop
    >>> heap = []
    >>> data = [8, 3, 5, 9, 7, 1, 4]
    >>> for item in data:
    ...     heappush(heap,item)
    ... 
    >>> print heap
    [1, 7, 3, 9, 8, 5, 4]
    >>> sorted = []
    >>> while heap:
    ...     sorted.append(heappop(heap))
    ... 
    >>> print sorted
    [1, 3, 4, 5, 7, 8, 9]
    >>> data.sort()
    >>> print data == sorted
    True
"""
def _test():
    import doctest
    doctest.testmod()

if __name__ == "__main__":
    _test()

これで$ python hoge.pyとかやっても何も出力されない。 一方でTrueと書かれたとこをFalseに変えると

**********************************************************************
File "hoge.py", line 19, in __main__
Failed example:
    print data == sorted
Expected:
    False   
Got:
    True
**********************************************************************
1 items had failures:
   1 of  10 in __main__
***Test Failed*** 1 failures.

って感じにテストが失敗したと出力される。


・・テスト成功したときにメッセージ出さないんですか、これ?