気になってすこしstring.Templateのコードを読んでみた。シンプルなクラスで勉強の題材として適切だ。
で、気づいたのは%で辞書を渡してもOK。うっかり。
pattern = _TemplateMetaclass.pattern % {
'delim' : _re.escape(cls.delimiter),
'id' : cls.idpattern,
}
2.3.6.2 文字列フォーマット操作
%がかなり高機能であることがわかる。%とstring.Templateの機能の差はそれほど大きく感じない。
metaclassをつかっている理由は、cls.patternを動的に生成したいからなのだが、instanceではいけない理由はどこにあるのだろうか?この点はclass設計上、大事なポイントな気がする。
metaclass内でTemplate文法を決めている箇所があるが、これはgpatternとか名づけてTemplateのclass変数として持てない理由はどこにあるのでしょうか?
pattern = r"""
%(delim)s(?:
(?P%(delim)s) | # Escape sequence of two delimiters
(?P%(id)s) | # delimiter and a Python identifier
{(?P%(id)s)} | # delimiter and a braced identifier
(?P) # Other ill-formed delimiter exprs
)
しかも使う側はself.patternという形で触っていてcls.patternとしては触っていない。
def substitute(self, *args, **kws):
...
return self.pattern.sub(convert, self.template)
0 件のコメント:
コメントを投稿