Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 映射(lambda,list)返回None而不是object_Python_Django - Fatal编程技术网

Python 映射(lambda,list)返回None而不是object

Python 映射(lambda,list)返回None而不是object,python,django,Python,Django,我想向列表中的所有对象(django中的模型实例)添加属性。例如,该列表是: persons = [ {"age":"12","name":"John"}, {"age":"10","name":"Joye"} ] 我们假设我想把person.age的值放在person.number中,我有一个新列表,所有person都有一个新属性number,所以我的函数是: new_persons_list=list(map(lambda person:setattr(pe

我想向列表中的所有对象(django中的模型实例)添加属性。例如,该列表是:

persons = [
        {"age":"12","name":"John"},
        {"age":"10","name":"Joye"}
]
我们假设我想把
person.age
的值放在
person.number
中,我有一个新列表,所有person都有一个新属性
number
,所以我的函数是:

new_persons_list=list(map(lambda person:setattr(person, 'number', person.age), persons))
但是输出是
[None,None]
,而我希望输出是:

persons = [
        {"age":12,"name":"John","number":12},
        {"age":10,"name":"Joye","number":10}
]

如果可能的话,我不想在
map
中添加新函数,我想使用lambda。有什么问题吗?谢谢你没有那么容易,所以请使用:

new_persons_list=list(map(lambda person:{**person.to_dict(), "number": person.age}, persons))
注意:对于上述示例代码,它将引发一个
属性错误
,因为字典没有
.age
属性。我假设您使用Django对象,如果您定义了一个字段,那么这些对象确实具有属性

setattr(..)
函数更新对象。大多数更新某些内容的函数都不会返回某些内容(这本身并不正确,但对于许多函数来说,这是正确的)

因此,您的列表只是获取
setattr
调用的结果。我们可以通过以下方式规避该问题:

new_persons_list=list(map(lambda person: setattr(person, 'number', person.age) or person, persons))

这是一个好主意,但出现错误
“person”对象不可下标
。然后我尝试将其修改为
new\u persons\u list=list(map(lambda person:{**person,“number”:person.age},persons))
,出现了新的错误:
'person'对象不是一个映射
。这个对象是模型实例,所以我认为我们需要在lambda中使用
setattr
,对吗?@mehdi您的第二条评论不正确,但是你能告诉我什么是
print(type(persons[0])
吗?@mehdi我的代码现在能用了吗?给我打印(键入(persons[0])
s,如果它不起作用。错误是
“person”对象没有属性“to dict”
。当我运行
print(type(persons[0])
时,输出是
setattr(..)
将返回
None
,因为它不计算某些内容,它会更改某些内容。上述操作应引发
属性错误,而不是返回
None
s。看起来你的样本数据不正确。谢谢你的解释,范·昂森先生。我使用
map(function,list)
来实现这一点,只不过该函数是
setattr(badge,'create_date',badge.assign_date)return badge
。但是由于我从来没有使用过lambda,我现在想知道它是如何工作的,这是我第一次在我的项目中使用它,所以我想尽量使用
lambda
,因为它需要非常干净和小的代码。@mehdi:lambda是
lambda i:setattr(badge'create_date',badge.assign_date)或badge
。lambda没有
返回
,因为您可以将其视为具有隐式返回的函数。
for person in persons:
    person.number = person.age