pythonでクロージャを書いてみた


概要

決まりきった正規表現は何回もコンパイルする必要がないので、メモ化したいが、グローバル変数は使いたくないので、初めてクロージャを使って実装してみた
まだまだpython初心者なので、あんまりpythonらしいコードが書けてるかは自信がない

実装

import re
from typing import Callable, Pattern


def create_email_regexp_generate_func() -> Callable[[], Pattern]:
    reg = None

    def _email_regexp() -> Pattern:
        # regへの参照を可能にする
        nonlocal reg
        if reg is None:
            reg = re.compile(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)")
        return reg

    return _email_regexp

これで、初回呼び出し時のみコンパイル処理が走り、以後はreg変数に保持された正規表現オブジェクトを参照するようにできた

generate_email_regexp = create_email_regexp_generate_func()
generate_email_regexp()
generate_email_regexp()
generate_email_regexp()

参考文献