水曜日はブロックの章。
ブロックとは,関数1つを採る高階関数を文法的に特別扱いしただけ,とみなすこともできます。
ほうほう、ということはpythonの場合はラムダ式とればいいのか。
章の終りの方の例がDSLで面白そうなのでやってみる。
def event(name,func):
if func():
print "ALERT: %s" % func.__name__()
event("イベントが発生すること", lambda: True)
event("イベントが発生しないこと", lambda: False)
とやってみたが、ラムダ式は複雑なのが書けないのでコードロック渡したい。
デコレータ使えばいいかということでこんな感じにしてみたが_eventで終わる関数を評価するときに、文字列とって関数適用するところで悩んだ。getattrはまぁわかるとしてimport __main__しないと
Traceback (most recent call last):
File "metr3.py", line 24, in <module>
func = getattr(__main__, func_name)
NameError: name '__main__' is not defined
って出てくる理由がわからん。
def event(eventname):
def decfunc(func):
def func_():
if func():
print "ALERT: %s" % eventname
return func_
return decfunc
@event("イベント発生")
def test1_event(): return True
@event("イベントが発生しないこと")
def test2_event(): return False
if __name__ == '__main__':
import __main__
for func_name in [elem for elem in dir() if elem.endswith("_event")]:
func = getattr(__main__, func_name)
func()