Doctest は、関数が意図したとおりに機能しているかどうかをテストする場合に便利です。あなたの場合、引数b
から時間を差し引いて差を返したいと思います。datetime
関数を次のように書き直しますsubtime
def subtime(a,b):
subtract = datetime.timedelta(hours=b)
difference = a - subtract
return difference
doctest を実行するには、いくつかのサンプル呼び出し値と期待される結果を提供する必要があります。関数のコーナー ケース (奇妙なことが起こる可能性のある場所) について考えてください。それでは、いくつかのテストケースを作成しましょう
- 24時間未満を引く
- 正確に 24 時間を引きます
- 24時間以上引く
- 0時間を引く
- 数時間追加 (-ve 引数)
次に、それぞれの場合に関数がどのように呼び出されるかを書き留めます。datetime
簡単にするために、最初の引数と同じものを使用します。now
(スクリプトの実行時に値を予測できないなどの理由で、スクリプト変数を使用しないでください)
subtime(datetime.datetime(2013,11,11,11,0),10)
subtime(datetime.datetime(2013,11,11,11,0),24)
subtime(datetime.datetime(2013,11,11,11,0),30)
subtime(datetime.datetime(2013,11,11,11,0),0)
subtime(datetime.datetime(2013,11,11,11,0),-5)
次に、(ペンと紙を使用して)各ケースの理想的な結果を計算します
datetime.datetime(2013, 11, 11, 1, 0)
datetime.datetime(2013, 11, 10, 11, 0)
datetime.datetime(2013, 11, 10, 5, 0)
datetime.datetime(2013, 11, 11, 11, 0)
datetime.datetime(2013, 11, 11, 16, 0)
これをドキュメント文字列の関数に追加します""" """
def subtime(a,b):
""" (datetime,int) -> datetime
Subtract b hours from a datetime.datetime and return the new datetime object
>>> subtime(datetime.datetime(2013,11,11,11,0),10)
datetime.datetime(2013, 11, 11, 1, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),24)
datetime.datetime(2013, 11, 10, 11, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),30)
datetime.datetime(2013, 11, 10, 5, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),0)
datetime.datetime(2013, 11, 11, 11, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),-5)
datetime.datetime(2013, 11, 11, 16, 0)
"""
subtract = datetime.timedelta(hours=b)
difference = now - subtract
return difference
あなたのスクリプトは今
import datetime
import doctest
import os
def parseOptions():
import optparse
parser = optparse.OptionParser(usage= '-h')
parser.add_option('-d', '--difference', \
type= 'int')
(options, args) = parser.parse_args()
return options
now = datetime.datetime.now()
def subtime(a,b):
""" (datetime,int) -> datetime
Subtract b hours from a datetime.datetime and return the new datetime object
>>> subtime(datetime.datetime(2013,11,11,11,0),10)
datetime.datetime(2013, 11, 11, 1, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),24)
datetime.datetime(2013, 11, 10, 11, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),30)
datetime.datetime(2013, 11, 10, 5, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),0)
datetime.datetime(2013, 11, 11, 11, 0)
>>> subtime(datetime.datetime(2013,11,11,11,0),-5)
datetime.datetime(2013, 11, 11, 16, 0)
"""
subtract = datetime.timedelta(hours=b)
difference = a - subtract
return difference
if __name__== "__main__":
doctest.testmod()
print
print 'This is the time now -', now.strftime("%I:%M:%S %p %a, %B %d %Y")
difference=subtime(now,10)
print 'This is the time minus the difference -', difference.strftime("%I:%M:%S %p %a, %B %d %Y")
print
そして出力
$ python try.py
This is the time now - 02:40:57 PM Tue, May 28 2013
This is the time minus the difference - 04:40:57 AM Tue, May 28 2013
doctest を使用すると、すべてのテストに合格すると、テスト関連の出力が得られないことに注意してください。(全て大丈夫)