Python で dict か generator を引数に取る関数の例2024年04月03日 13時25分08秒

ジェネレータの有用性と簡単な例から始めた。

ジェネレータの有効な副作用としては、処理を分割し小さな単位で再処理を施せる事。つまり、メモリの一時的なピークを迂回し、また反応速度を向上させる事が出来る。

で、実際の現場の利用になるわけだ。大体、最初は動きやすい、読みやすいコードで始める。そうすると、dict や list を渡しつつ、複数の処理をしていくコードが出来ていく。スクリプト言語は、書きやすく、すぐに実装できるのが、これ自体は良いことではある。

そして、メモリの利用に難があったり、レスポンス時間が長かったら、dict をジェネレータに置き換えて質の向上を計ったりする。そこで、引数を両方で取れる形にした例を準備した。イテレータ取得後の例は、dict を再構築しているのを分かりやすくする為。まあ、この関数自体もジェネレータにして、yield をするのがもっと実地に沿った形になる。

def process( dataset: Union[
            Dict[Any, Dict[Any, Any]],
            Callable[[], Generator[Tuple[Any, Dict[Any, Dict[Any, Any]]], None, None]],
        ],
    ) -> Generator[Tuple[Any, Any], None, None]]:
        if isinstance(dataset, dict):
            generator = dataset.items
        else:
            generator = dataset

        new_dict = {}
        for key, value in generator():
            new_dict[key] = 2 * value
        return new_dict

前回