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