如果标题有点难以理解,请道歉。 不太确定如何在一条线内解释它。
我想做的是......
实际上我有这段代码
output = []
objs = Model.objects.filter(abc=abc) # this would return a some queryset
for obj in objs:
output.append({
TITLE: obj.title,
TYPE: obj.type,
# I want to add something here which is kind of like, if `obj.type` is 'hello' then print obj.word
})
return output
例如,如果我的obj.type
是'hello'
我想要
output.append({
TITLE: obj.title,
TYPE: obj.type,
WORD: obj.word,
})
如果我的obj.type
是'世界'
我想要
output.append({
TITLE: obj.title,
TYPE: obj.type,
NADA: obj.nada,
})
我想过做一些像
这样的事情 output = []
objs = Model.objects.filter(abc=abc) # this would return a some queryset
for obj in objs:
if obj.type == 'hello':
output.append({
TITLE: obj.title,
TYPE: obj.type,
WORD: obj.word,
})
if obj.type == 'world':
output.append({
TITLE: obj.title,
TYPE: obj.type,
NADA: obj.nada,
})
return output
上述应该有效,但如果还有其他更好的方法,我很想知道另一种做法,因为上述内容似乎过于冗余。
提前感谢任何建议
答案 0 :(得分:4)
你所拥有的东西似乎没问题,但是如果你真的讨厌重复代码,你总是可以在第一个之外制作字典。
output = []
objs = Model.objects.filter(abc=abc) # this would return a some queryset
for obj in objs:
current_dict = {
"TITLE": obj.title,
"TYPE": obj.type,
}
if obj.type == "world":
current_dict["NADA"] = obj.nada
else:
current_dict["WORD"] = obj.world
output.append(current_dict)
return output
但是你可能会慢慢放松一下......(虽然不做第二次检查就赢了时间:P)
使用timeit(https://docs.python.org/3/library/timeit.html)来查看“漂亮代码”是否值得花时间,也许它对您的用例没有太大变化。
此外,对于单线爱好者:
从python 3.5和 Pep 448中建议的那样,你可以这样做:
return [
{
**{
"TITLE": obj.title,
"TYPE": obj.type
},
**{"NADA": obj.nada} if obj.type == "word" else **{"WORD": obj.word}
} for obj in Model.objects.filter(abc=abc)
]
也可以放在一行中。 如果你真的喜欢简洁,那就是,但有些人会认为它比你所拥有的更糟糕。 ^ - ^
答案 1 :(得分:0)
output = []
objs = Model.objects.filter(abc=abc) # this would return a some queryset
for obj in objs:
start_dict = {
'TITLE': obj.title,
'TYPE': obj.type
}
if obj.type == 'hello':
start_dict['WORD'] = obj.word
elif obj.type == 'world':
start_dict['NADA'] = obj.nada
output.append(start_dict)
return output