我创建了一个方法来生成一个新类并向类中添加一些方法,但是有一个奇怪的错误,我不确定发生了什么:
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...),但我认为 lambda 表达式中存在问题,因为 _clean_photo 方法始终使用相同的图像名称(恰好是最后一个图像名称) image_fields 列表)。
有没有比使用 lambda 表达式更好的方法来创建动态方法内容(代码)?
为什么我的 lambda 表达式只将 _clean_photo 传递给 for 循环中的最后一个 image_name ?
最佳答案
对于在方法范围内定义的函数,Python 代码的行为与此类似。
改用这个:
for image_name in image_fields:
print "image name is: ", image_name
setattr(new_form, 'clean_' + image_name,
lambda self, iname=image_name: self._clean_photo(iname))
default 关键字参数的使用使 Python 在创建 lambda 函数时而不是在调用时(它总是取最后一个图像时)记住它。
关于python - 你如何在代码中创建 python 方法(签名和内容)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/499964/