[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)