Python2.4から追加されたdecoratorが面白い。最近までは全然使ってなかったけど、これはかなり強力だ。
例えば次のようにすれば、簡単にロギングが行える。
class Logger:
def __init__(self, fname):
self.logfile = file(fname, "wb")
self.log = []
def __call__(self, func):
def wrapped(*args, **key):
a = []
for i in args:
a.append(str(i))
c = "%s(%s)" % (func.__name__, ", ".join(a))
self.log.append("# calling: %s"%c)
r = func(*args)
self.log.append("# %s returns: %s"% (c, str(r)))
return r
return wrapped
def __del__(self):
self.logfile.write("\n".join(self.log))
self.logfile.close()
log = Logger("log.txt")
@log
def foo(x, y):
return x+y
@log
def huh():
print "Huh !?"
print foo(3, 4)
print huh()
わざわざ各関数/メソッドにロギング用のコードを書かなくても済んでしまうのは素晴らしい。
俺は絶対に倫理、常識、道義などを根拠に他人の行動を縛りたくないのだけれど、それはつまり法律以外の方法で他人の行動を制限して良いということを認められないから。そして法律以外を根拠に他人の行動を制限して良いのならば、何か根拠があれば法律を破っても良いということにも繋がる。
これが悪夢でなくて何だというのだ。例え法律を破っていなくても、多くの人が倫理などを盾にすれば、一方的に葬り去られる可能性があるのだ。事例としては、万引きした少年を咎めたら逃げられて、その少年が電車に轢かれて死んだ事件とか。その事件では本来被害者の本屋の店長が、あたかも加害者のように地元では扱われて、最終的には店を畳むことになったんだっけ。
他人と争うときに倫理だの常識だのはあてにならない。結局それは感情という非論理的な物に根ざしているからだ。論理や法律など感情とは切り離された概念だけでのみ、生産的な(=不毛でない)闘争が出来る。
あとこれは俺の主観だけど、倫理を持ち出す奴って自分以外はみんな外道とか思っていそうだよな。そいつにとっては自分の倫理観が正義と直結しているわけだから当り前か。