Pythonの落とし穴
久しぶりに Python の基本的な構文でハマりました。
class ContactForm(BaseForm): class fields(WidgetsList): name = TextField( label_text=u"お名前",) name_kana = TextField( label_text=u"フリガナ",) email = TextField( label_text=u"メールアドレス", validator=Email(not_empty=True),) grade = SingleSelectField( label_text=u"学年", options=[(u"", u"▼お選びください")] + \ [(name, name) for name in (u"1年生", u"2年生", u"3年生")])
こんなクラスを定義して、 ContactForm().children に name が含まれていなくておかしいなあと思ったら、list comprehension の中で使った変数で上書きされてた…
試してみると、
>>> a=1 >>> [a for a in xrange(3)] [0, 1, 2] >>> a 2
確かに上書きされますね。
for文のループ変数と同じだと言われればその通りなのですが、直感的には[〜]の中で変数のスコープがローカルになっていた方が自然な気がします。
Posted by id:knzm