読者です 読者をやめる 読者になる 読者になる

django.utils.functional

Python

djangoのソースコードを読んでいて、django.utils.functional.curryという関数があることに気がつきました。
これは、その名の通り、関数型言語ではおなじみのカリー化を行うための関数です。
英語・日本語のdjango公式ドキュメントを検索してみたのですが、django.utils.functionalに関する記述を見つけることができませんでした。これは使ってもいいモジュールなのでしょうか?
しかし、こんな便利な関数を使うなと言われても、それは無理ってものです。


IBM DWの「魅力的なPython」に登場した例(収入、比率、控除から税金を計算する関数)を、django.utils.functionalを使って書き換えてみます。

from django.utils.functional import curry

taxcalc = lambda income,rate,deduct: (income - (deduct)) * rate
taxCurry = curry(taxcalc, rate = 0.30, deduct = 10000)
print "Curried taxes due =",taxCurry(50000)


もちろん、Python2.5ならば組み込みライブラリに採用されたfunctoolsを使って、次のように書くこともできます。

from functools imporrt partial

taxcalc = lambda income,rate,deduct: (income - (deduct)) * rate
taxCurry = partial(taxcalc, rate = 0.30, deduct = 10000)
print "Curried taxes due =",taxCurry(50000)

後者はPython2.5でしか動作しないことを考えると、djangoでカリー化を使いたい場合には、django.utils.functionalが第一の選択肢になるではないでしょうか。


django.utils.functionalには、他にもlazyという、これもまた便利な関数を含んでいますが、これに関しては後日。