Pythonのdateutilについて
「Python で翌月1日のdatetimeを取りたい場合のメモ」を読んで、僕だったらこういう設計にはしないんだけどなぁと思ったので注意喚起のために書いておく。
元エントリーでは翌月1日を取ったり、今月の末日を取ったりするのに下記のように書いている。
>>> today + relativedelta(months=+1, day=1) datetime.datetime(2013, 9, 1, 13, 21, 47, 12133) >>> today + relativedelta(day=99) datetime.datetime(2013, 8, 31, 18, 33, 28, 167294)
months=+1は「翌月」って意味なのにday=1は「翌日」ではなく「1日」なのはなぜか?day=99で「99日後」ではなく「末日」になるのはなぜか?
元エントリーには明確に書かれていないのだけどもrelativedeltaはmonthsとmonth、daysとdayというようにsの付く引数とつかない引数の両方をとる。そしてsの付くほうが相対指定、付かない方が絶対指定になっている。この差は気づきにくいので、元エントリーのコードの「months=+1」を見て「プラスやマイナスが付いていると相対指定なのか」と勘違いする人が出るかもしれないが、「months=+1」は「months=1」とまったく同じ意味である。
>>> datetime.date(2013, 2, 20) + relativedelta(day=1) datetime.date(2013, 2, 1) >>> datetime.date(2013, 2, 20) + relativedelta(days=1) datetime.date(2013, 2, 21) >>> datetime.date(2013, 2, 20) + relativedelta(month=1) datetime.date(2013, 1, 20) >>> datetime.date(2013, 2, 20) + relativedelta(months=1) datetime.date(2013, 3, 20)
わかっている人が書く分には手軽かもしれないが、たいがいのコードは書かれる回数より読まれる回数のほうが多いものなのだから読みやすさにフォーカスして設計するほうが良い。そういう意味でこのライブラリはイケてないので、うっかり標準になっちゃったりする前に誰かもっといいものを作ってくれないかなぁ。(他力本願)