轻松地在json之间序列化数据类
serious的Python项目详细描述
严重
数据类模型工具包:序列化、验证等。
功能
- 纯python中的模型定义。
- 验证显示在代码覆盖率中。
- 所有面向公共的api的类型注释。
- (可选)确保不变性。
- 易于扩展。
- 为人们而生。
- 严格记录。
基本知识
安装
可从PyPI:
pip install serious
快速示例
严肃api的中心部分是不同的Models。
给定一个常规数据类:
fromdataclassesimportdataclass@dataclassclassPerson:name:str
让我们创建一个JsonModel
:
fromserious.jsonimportJsonModelmodel=JsonModel(Person)
使用它的dump/load methods:
person=Person('Albert Einstein')model.dump(person)# {"name": "Albert Einstein"}
验证
要将验证添加到上面的示例中,我们需要将__validate__
方法添加到person:
fromdataclassesimportdataclassfromtypingimportOptionalfromseriousimportValidationError,Email@dataclassclassPerson:name:stremail:Optional[Email]phone:Optional[str]def__validate__(self):iflen(self.name)==0:raiseValidationError('Every person needs a name')ifself.phoneisNoneandself.emailisNone:raiseValidationError('At least some contact should be present')
支持的格式:
- [X]JSON
- [X]Python Dictionaries
- []山药
- []表单数据
支持的字段类型
- 其他数据类
- 原语:
str
,int
,float
,bool
- 字典:仅使用字符串键:
Dict[str, Any]
- 列表,sets,deques:任何可序列化类型的python集合
- Tuples有无省略:
- 元组作为独立元素集(例如
Tuple[str, int, date]
) - 使用省略号,充当冻结列表(
Tuple[str, ...]
)
- 元组作为独立元素集(例如
- Enumerations按值:
- 原语(例如
OperatingSystem(Enum)
) - 类型化枚举(
Color(str, Enum)
和FilePermission(IntFlag)
)
- 原语(例如
- Decimal:作为字符串编码为json
- Datetime、date和time:编码为ISO 8601格式的字符串
- UUID
serious.types.Timestamp
:自UNIX epoch起作为浮点ms值的UTC时间戳serious.types.Email
:支持验证并包含其他属性的字符串小型类型- 在
serious.types
:FrozenList
,FrozenDict
一个更大的例子
fromdataclassesimportdataclassfromseriousimportJsonModel,ValidationErrorfromtypingimportListfromenumimportEnumclassSpecialty(Enum):Worker=1Fool=2@dataclass(frozen=True)classMinion:name:strtype:Specialty@dataclass(frozen=True)classBoss:name:strminions:List[Minion]def__validate__(self):iflen(self.minions)<2:raiseValidationError('What kind of boss are you?')boss=Boss("me",[Minion('evil minion',Specialty.Fool),Minion('very evil minion',Specialty.Worker)])boss_json="""{ "name": "me", "minions": [ { "name": "evil minion", "type": 2 }, { "name": "very evil minion", "type": 1 } ]}"""model=JsonModel(Boss,indent=4)assertmodel.dump(boss)==boss_jsonassertmodel.load(boss_json)==boss
致谢
最初是@lidatong/dataclasses-json的叉。