Django 2.0合并普通字典与有序字典报错:unsupported operand type(s) for +
在Django 2.0中合并普通字典与有序字典的解决方案
嗨,我之前刚好踩过这个坑!你遇到的unsupported operand type(s) for +: 'dict_items' and 'odict_items'错误,本质是Python 3和Python 2在dict.items()返回值上的差异——Python 3里这个方法返回的是字典视图对象,不再是列表,所以没法直接用+来拼接;而self._current作为有序字典(OrderedDict),它的items()返回的也是类似的视图对象,自然没法相加。
给你几个靠谱的解决方法:
方法1:转换为列表后拼接
把两个字典的items()都转换成列表,再用+拼接,最后转成字典:
def get_dump_object(self, obj): metadata = { "pk": smart_text(obj._get_pk_val(), strings_only=True), "model": smart_text(obj._meta), } return dict(list(metadata.items()) + list(self._current.items()))
注意:如果两个字典有重复的键,后面的字典(也就是self._current)的键值会覆盖前面的(metadata)。
方法2:用字典解包语法(推荐)
Python 3.5及以上支持这种简洁的写法,可读性和效率都不错:
def get_dump_object(self, obj): metadata = { "pk": smart_text(obj._get_pk_val(), strings_only=True), "model": smart_text(obj._meta), } return {**metadata, **self._current}
同样,重复键的情况下,后面的self._current会覆盖metadata的对应值。
方法3:保留有序字典的顺序
如果需要保留self._current的有序特性(毕竟它是OrderedDict),可以先复制有序字典,再用update方法合并:
from collections import OrderedDict def get_dump_object(self, obj): metadata = { "pk": smart_text(obj._get_pk_val(), strings_only=True), "model": smart_text(obj._meta), } # 把metadata的内容合并到有序字典self._current中,保留原有序顺序 result = OrderedDict(self._current) result.update(metadata) # 如果想让metadata的键排在前面,就反过来: # result = OrderedDict(metadata) # result.update(self._current) return result
这种方式能严格控制最终字典的键顺序,适合对顺序有要求的场景。
内容的提问来源于stack exchange,提问作者tread
相关产品推荐
相关产品推荐

