Updated at 2020-05-18 09:36

简介

最近写了一些复杂的脚本,编写过程中逐渐发现了Python中的dict虽然很灵活简便,但一旦脚本中的数据结构复杂了,key就需要统一管理起来了,否则需要不断地看代码的上下文来确定这个dict对象有哪些key

这个时候使用DTO比较好,因为声明DTO时需要直接声明类中有哪些field,后续使用dto时可以直接通过IDE的只能提示来使用属性

namedtuple

Python提供了一种特殊的元组——namedtuple,用于快速声明一个DTO,namedtuple位于collections模块。

使用示例如下

# coding=utf-8
from collections import namedtuple

UserDto = namedtuple("UserDto", "id name age address")
AddressDto = namedtuple("AddressDto", "provice city")
user = UserDto(1231231, '汉字', 17, AddressDto('浙江', city='杭州'))

print(user) # UserDto(id=1231231, name='汉字', age=17, address=AddressDto(provice='浙江', city='杭州'))
print(user.address.city) # 杭州

namedtuple的优势

能够自动提示有哪些field,而不用像dict那样需要去想上文中使用了什么key

JSON序列化

serialized = json.dumps(user._asdict(), ensure_ascii=False)
print(serialized) # {"id": 1231231, "name": "汉字", "age": 17, "address": ["浙江", "杭州"]}

需要注意的是,namedtuple方法返回的是a new subclass of tuple with named fields,即它是一个元组,直接json.dumps会当作一个数组来数列化,如果需要序列化以后的现象与一个DTO一致,那么需要多做一步_asdict()操作


Python      Python