Python : カリー化
[ できるかな Python ] のコーナー
最近、Pythonにハマってるので、いろいろとやってみた!
ここでは実用になるかはさておき、Pythonで出来たら楽しいって事をやってみるだけのコーナーです。
今日は、関数のカリー化です。
カリー化については、Wikipediaでも見てくださいね。
<材料>
- 引数を複数とる関数
- lambda式
- 特殊メソッド__call__()
<作り方のポイント>
- __call__()の利用
- 可変引数の利用
- 引数展開の利用
- lambda式の利用
- 関数呼び出し時の引数エラー(TypeError)例外の利用
カリー化from __future__ import annotations from typing import Callable class LikeCurry: def __init__(self, func: Callable[..., any]) -> None: self.func = func def curry(self, *args: any) -> Callable[..., any]: return lambda *a: self.func(*args, *a) def __call__(self, *args: any) -> any: try: return self.func(*args) except TypeError: return LikeCurry(self.curry(*args)) def main(): def add3(a, b, c): return a + b + c add3c = LikeCurry(add3) print(add3c(2,3,4)) print(add3c(2)(3,4)) print(add3c(2,3)(4)) print(add3c(2)(3)(4)) if __name__ == "__main__": main()
LikeCurry()に関数を渡すとカリー化された関数風味のオブジェクトを返してくれます。
後は関数っぽく使えば・・・・
はい、おいしく出来ました!!!
何が嬉しいのかって?
それは、人それぞれです(笑)
コメント
コメントを投稿