Pythonでのアンパックの実践例(pillow)


はじめに

Pythonはアンパックによって辞書型を関数にねじ込むことができる。

具体的な文法自体は上記のとおりだが、これだけでは有り難みがわかりにくかった。

仕事してたら実践例が頭の中に降ってきたので、忘れないうちに残しておく。

実践例

画像に対して複数の図形を書きたいとき、C#ではPenを使って同じ幅、色の図形を連続して描くことができた。
ではPython(pillow)で同じように設定を使いまわしたいときは?

→アンパックをC#のPenの代わりにできることに気がついた

サンプルコード

from PIL import Image, ImageDraw

DEFAULT_BRUSH = {"outline": (0, 255, 0), "width": 5}


def create_canvas():
    return Image.new("RGB", (500, 500), (0, 0, 0))


def paint_brush(target: Image):
    draw = ImageDraw.Draw(target)
    draw.ellipse([(100, 100), (200, 200)], fill=(255, 255, 255), **DEFAULT_BRUSH)
    draw.rectangle([(200, 100), (300, 200)], **DEFAULT_BRUSH)
    return target


if __name__ == '__main__':
    paint_brush(create_canvas()).save("sample.png")

出力結果

ポイント

違う関数でも名前や型が同じ引数をとるのであれば、同じ辞書型の変数を使い回せる。

共通の引数を様々な関数で使いまわしたい場合、引数をクラス化してラップ関数をるといった手が思い浮かぶが、
こんな感じにシンプルに実装できることも覚えておこう。