2023年2月21日火曜日

できるかな Python : カリー化 [ 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()に関数を渡すとカリー化された関数風味のオブジェクトを返してくれます。
後は関数っぽく使えば・・・・

はい、おいしく出来ました!!!

何が嬉しいのかって?
それは、人それぞれです(笑)




0 件のコメント:

コメントを投稿