概要
決まりきった正規表現は何回もコンパイルする必要がないので、メモ化したいが、グローバル変数は使いたくないので、初めてクロージャを使って実装してみた
まだまだ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()
参考文献