そうだよもう四月だよ! 明日だよ入社日!
でまあここから全然関係ない話をするわけだが、最近メタという言葉についてまた考えている。俺は卒業論文でメタデータによる検索エンジンについて書いたのだが (ていうか卒業制作だよな、あれは) 、その文脈で考えればメタという言葉は「X を説明する X」あるいは「X から導き出された X」が成り立つ場合には「メタ X」と呼ぶ、というものだろう。メタデータは実際のデータから作者や作成日などの付随する属性を抜き出したものであり、これは「あるデータを説明するデータ」「データから導き出されたデータ」なのでメタの名にふさわしい。
話は Python に移る。 Python ではメタクラスという概念があるのだが、これがどうも前述のメタの意味からは外れているように思える。 Python のメタクラスはクラスの生成を行う機構であり、それってつまりメタじゃねえだろう。 Python でメタクラスを扱う例のコードを以下に。
class Foo:
def __init__(self):
print 'Foo'
def meta_factory(name, bases, namespace):
print 'name:', name
print 'bases:', bases
print 'namespace:', namespace
return Foo
class Hoge:
__metaclass__ = meta_factory
def __init__(self):
print 'Hoge'
class Bar(Hoge):
def __init__(self):
Hoge.__init__(self)
print 'Bar'
h = Hoge()
print h
b = Bar()
print b
これを実行するとわかるが、 Hoge のコンストラクタは決して呼ばれない。 Python におけるメタクラスというのは「リファレンスマニュアル 3.3.3 クラス生成をカスタマイズする」にある通りクラスファクトリーであり、つまりやってることはクラスの生成 & 挿げ替えである。で、これのどこがメタなんだよ。
メタの本来の意味は超高次という意味なのだが、俺の理解では高次元のものは全て低次元のものがあって存在できている。先のメタデータも、元となる具体的なデータがあって初めて存在できるわけだろう? だから Python のメタクラスはいまいちしっくりこない。だってメタクラスからクラスが作られるのだから。
ただ、メタクラスとなるものを作るには具体的なクラスが必要というか、プログラミングしているうちにメタクラスの必要性に気が付き、既にあるクラスやこれから書きたいクラスについて考察した結果作るものだろう (多分) 。だからメタクラスを導き出す過程は十分メタ……なのか?
オマケ。メタクラスを用いたロギング処理。メンバにアクセスがあるたびに、そのメンバ名を表示します。
def logger_factory(name, bases, namespace):
class Logger(type(name, bases, namespace), object):
def __setattr__(self, name, value):
print 'Set:', name, '<-', value
object.__setattr__(self, name, value)
def __getattribute__(self, name):
print 'Call:',name
return object.__getattribute__(self, name)
Logger.__name__ = name
return Logger
class Hoge:
__metaclass__ = meta_factory
def __init__(self):
self.hoge = 'hogeeeeeeee!'
def f(self, *args):
print args
h = Hoge()
print h.hoge
h.bar = 'baaaaaaaaar!'
print h.bar
h.f(1,2,3)
print h.__class__
というかなんだこのプログラム。 type() で構築したクラスと object を動的に多重継承? これだから Python (及びメタ遊び) はやめられない。
雷が鳴ってるよ。落雷 -> 停電 -> サーバ停止のコンボは勘弁だ。
Yahoo! Transit は明らかにおかしいんじゃないか?
目的地までの経路を A - B - C と大雑把に三区間にわけたとして、出発駅と到着駅を A - B と A - C の二通りで検索する。この場合、前者で最適な経路は基本的に後者の最適経路にも途中までは一致しているはずである。つまり、 B で乗り換えを行うような経路に対して検索した場合、 A - B 間の検索結果と A - C 間の B までの結果は一致していることが予想される。
ところが実際にはそうなっていない。時にはまるで冗談のように妙な検索結果が返ってくる。これは一体どういうアルゴリズムで動いているのか、どういうデータ構造なのか物凄く気になる。
明日以降しばらくは更新頻度が落ちるかも。つーか勤め始めるんだから落ちるに決まっている。大学のある日も更新量が減ってたけど、これからはそれ以上だな。