[Python] 2.4
Releaseされたので早速インストール。新しい機能のテスト。
Generator Expression
# 使い方: # リスト内包表現 [ ... ] の代わりに ( ... ) # リスト内包表現では新しいリストを作成して返す為、 # 巨大なリストをfor文で処理したい場合に、 # - 一時リストを作成するので非効率、 # - 又、無限リストを扱えないなどの問題があった。 # ジェネレータ表現ではジェネレータを返す為、 # foo in ステートメント内でも遅延評価,リスト内包の両方の利点を活かせる。 foo = (funcA(x) for x in alist if funcB(x)) # 上のgenerator expressionで作成されたgenerator fooは、 # 以下の generator と同じ振舞をする。 def _foo(): for x in alist: if funcB(x): yield funcA(x) foo = _foo()
Decorator
- 関数を定義する際に、Wrapper関数を適用できる。
classmethod, staticmethodを簡単に定義する際に使える。
(というより主にそっちの目的で付けられた構文が汎用化されて、
デコレーターとして提供されたような気がする。)
class C: @classmethod def meth(self): print "C::meth"
複数のデコレーターを組み合わせる事も出来、
デコレーターを使って AOP での before, after の様なフックも掛ける事が出来る。
def require_int(func): def wrapper(arg): assert isinstance(arg, int) return func(arg) return wrapper def provide_int(func): def wrapper(arg): result = func(arg) assert isinstance(result, int) return result return wrapper @require_int @provide_int def test(num): return num * 2 # 従来のコードに展開すると、test定義後に、 # test = require_int(provide_int(test)) print test(10) print test("1") # AssertionError, in wrapper in require_int
デコレーターに引数を渡す事も出来るらしい。(書き方がわからなかったのでTODO)