Entry追加時にPreviewできる機能を追加していたわけです。Entry本体を表示するDTML(entry_html)では,EntryクラスのMethodを呼んでいます。Preview時にもこのentry_htmlを使いたい。そこで,REQUEST.formに必要なMethodをlambdaを使ってくっつけようと思い立ちました。
どうせならEntry追加時に日時指定できるようにもしたい。フォームから入力された日付の文字列を,DateTimeインスタンスにいったん変換する - つまり,lambdaでローカル変数(またはMethodの引数)を使う必要があるわけです。が,Python 2.1まではこれができないことをすっかり忘れて,10分くらいハマってました。Nested scopesとか呼ばれている問題ですね。LL Saturdayで説明したのにすっかり忘れてた。
2.1で"from __future__ import nested_scopes"すれば解消される。でも,COREBlogをインストールしているZopeインスタンスすべてにこれを強制するわけにはいかない。「2.2以上じゃないと動かないよ」,というのはもっと言えない。
結局,lambdaに引数として渡してやると目的のことができるんだけど,書き方としては美しくないよなあ。
あと,REQUEST.form使った時点でZPTでモジュール書きづらくなっちゃったなあ。ZPT嫌いだからいいけど。重いし:-p。けっきょくデザイナーと技術者の分業なんてきれいにいかないし。