Python の functools.partial による部分適用

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 は関数オブジェクトとして扱いやすく、デバッグ時にも情報が参照しやすいという利点があります。