4

新しいクラスを生成し、いくつかのメソッドをクラスに追加するメソッドを作成しましたが、奇妙なバグがあり、何が起こっているのかわかりません:

def make_image_form(image_fields):
    ''' Takes a list of image_fields to generate images '''
    images = SortedDict()
    for image_name in image_fields:
        images[image_name] = forms.ImageField(required=False)
    new_form = type('ListingImagesForm2', (forms.BaseForm,), {'base_fields' : images})
    #now we add the validation methods to the class
    for image_name in image_fields:
       print "image name is: ", image_name
       setattr(new_form, 'clean_' + image_name, lambda self: self._clean_photo(image_name))
    #Add the _clean_photo method to the class
    setattr(new_form, '_clean_photo', _clean_photo)
    return new_form

これは私のメソッドで、image_fields (私は Django でサイトを作成しています) のリストを受け取り、ImageField フィールドの全体を作成し、クラス ListingImagesForm2 を作成し、画像フィールドをクラスに割り当てます。

問題はメソッドの作成、より具体的にはメソッドの内容にあります。

ループの中:

for image_name in image_fields:
    print "image name is: ", image_name
    setattr(new_form, 'clean_' + image_name, lambda self: self._clean_photo(image_name))

メソッド シグネチャは正しく作成されます (例: clean_pic_1、clean_pic_2...) が、ラムダ式に問題があると思います。_clean_photo メソッドは常に同じ画像名 (たまたま最後の画像名) で呼び出されるためです。 image_fields リスト)。

ラムダ式を使用するよりも、動的メソッド content(code) を作成する良い方法はありますか?

そして、なぜ私のラムダ式は _clean_photo だけを for ループの最後の image_name に渡すのでしょうか?

4

1 に答える 1