functools.partial は関数の一部の引数を固定した新しい関数を作成します。同じ引数を何度も渡す場面で、コードの重複を減らせます。
基本的な使い方
from functools import partial def power(base, exponent): return base ** exponent square = partial(power, exponent=2) cube = partial(power, exponent=3) print(square(5)) # 25 print(cube(5)) # 125
partial は新しい関数オブジェクトを返します。元の関数と固定された引数の情報を保持しています。
print(square.func) # <function power at ...> print(square.keywords) # {'exponent': 2}
位置引数の固定
位置引数も固定できます。左側から順に固定されます。
def greet(greeting, name): return f"{greeting}, {name}!" say_hello = partial(greet, "Hello") print(say_hello("Alice")) # Hello, Alice!
実用例:コールバック関数
イベントハンドラやコールバックで追加の引数を渡したい場合に便利です。
from functools import partial def on_click(button_id, event): print(f"Button {button_id} clicked: {event}") # button_id を固定したハンドラを作成 handler_for_button_1 = partial(on_click, "btn_1") handler_for_button_2 = partial(on_click, "btn_2")
lambda を使う方法もありますが、partial は関数オブジェクトとして扱いやすく、デバッグ時にも情報が参照しやすいという利点があります。