GAEでの実行について
GAE(Google App Engine)では、毎回のHTTPリクエストごとにpythonファイルが新たに実行されてるものと思っていたが、どうやら違うみたい。
少なくとも、短い間隔で同じファイルの実行を要求するアクセスがあると、それが新しい環境で実行されないことがある。
GAEの内部では、実行するファイルはimportされてて、アクセスごとにその中のハンドラが呼び出されているようなイメージ。
ところで、pythonではデフォルト引数が
def f(a=[]): a.append(len(a)) print a
みたいな書きかたの関数だと、これを続けて実行した場合
>>> f() [0] >>> f() [0, 1] >>> f() [0, 1, 2] >>> f() [0, 1, 2, 3]
となってしまう。
デフォルト引数は、関数の呼び出し時ではなく、ファイルのロード時に評価されるため。
毎回の呼び出しのたびに引数aを[]で初期化したいときは別の書き方をしなければならない。
たとえば
def f(a=None): a = a if a != None else [] a.append(len(a)) print a
のような感じで。
今回、GAEではHTTPリクエストごとに実行環境が新しくなる、と勘違いしてて、前者みたいな書き方をしてて不具合になってしまってた。
追記(2010/11/04):
GAEドキュメントのアプリケーション キャッシュの「ハンドラ スクリプトのキャッシュ」に書いてた