如何在代码中创建python方法(签名和内容)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在代码中创建python方法(签名和内容)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1682字,纯文字阅读大概需要3分钟。
内容图文
![如何在代码中创建python方法(签名和内容)?](/upload/InfoBanner/zyjiaocheng/670/6c2e67b54fa449599e4fa6532f4c9850.jpg)
我创建了一个方法,该方法生成一个新类并向该类中添加一些方法,但是有一个奇怪的错误,我不确定发生了什么:
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方法(签名和内容)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。