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()に関数を渡すとカリー化された関数風味のオブジェクトを返してくれます。
後は関数っぽく使えば・・・・
はい、おいしく出来ました!!!
何が嬉しいのかって?
それは、人それぞれです(笑)
コメント
コメントを投稿