Drkcore

17 09 2010 Ruby Python Tweet

メタプログラミングRuby 水曜日

水曜日はブロックの章。

ProductName メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス / ¥ 2,940 ()
在庫あり。

まつもと直伝 プログラミングのオキテ 第5回(2)

ブロックとは,関数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()
  • [Tutor] getattr()

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021