もっと Python めたくらっす

From Evernote:

もっと Python めたくらっす

こんにちは。Python界のマニアック担当aodagです。
expert python読書会で、メタクラスの話題があったらしく、食いつかずにはいられない。
__metaclass__ に指定するのって、普通はtypeを継承するよね。
でも、別にtype継承じゃなくたって、ファクトリならなんでも使える。
実は、class構文は、func(name, bases, dct) を呼ぶだけの糖衣構文なんだ。
実際に単なる関数をメタクラスにしてclass定義で書いてみよう

>>> def dictish(name, bases, dct):
...     return dict((key, value) for key, value in dct.iteritems() if not key.startswith('_'))
...
>>> class MyDict(object):
...     __metaclass__ = dictish
...     a = 1
...     b = 2
...
>>> MyDict
{'a': 1, 'b': 2}

dictishは受け取ったdctから、名前が"_"で始まるもの以外を返すだけの関数だ。
__metaclass__にすると、dictishには、クラス定義の内容がわたってくる。
nameには、"MyDict"、baseには、"object"、そして、dctには、{"a":1, "b":2 ....} といったdictが渡される。
この関数の戻り値が、MyDictって変数に入るわけだね。
ということで、MyDictは、定義中の変数を含むdictになる。
ま、こんなことしてなんになるんだって疑問はあるだろうけど、このテクニックを使うとDSLを作るときのネタになるかもしれない。

勢いだけで書いた。反省はしていない。