使用数据类简化反序列化
pavlova的Python项目详细描述
pavlova是帮助将未知输入映射到 数据类。
fromdatetimeimportdatetimefromdataclassesimportdataclassfrompavlovaimportPavlova@dataclassclassInput:id:intname:strdate:datetimePavlova().from_mapping({'id':10,'name':100'date':'2018-08-10',},Input)# Input(id=10, name='100', date=datetime.datetime(2018, 8, 10, 0, 0))
巴甫洛娃出生于对 现有反序列化库。在 python 3.7,它们似乎是定义反序列化的完美工具。 架构。
支持的功能
解析布尔值、日期时间、浮点数、整数、字符串、小数、字典, 枚举,列表当前受支持。
还有更多的解析器,但是要实现自己的自定义解析器, 只需在pavlova.parsers中实现pavlovaparser,并在 带有register_parser方法的pavlova对象。
安装
pip install pavlova
与烧瓶一起使用
fromdataclassesimportdataclass,asdictfromflaskimportFlask,jsonifyfrompavlova.flaskimportFlaskPavlovapavlova=FlaskPavlova()app=Flask(__name__)@dataclassclassSampleInput:id:intname:str@app.route('/post',methods=['POST'])@pavlova.use(SampleInput)defdata(data:SampleInput):data.id=data.id*len(data.name)returnjsonify(asdict(data))app.run()
添加自定义类型
有两种不同的方法可以在 巴甫洛娃。一般来说,这个过程是添加一个特定类型的解析器。为了 验证您应该引发typeerror或valueerror。
第一个是创建一个扩展现有基类型的新类型。在这里 是一个关于如何实现电子邮件类型的示例,它是一个字符串,但执行 验证。
frompavlovaimportPavlovafrompavlova.parsersimportGenericParserclassEmail(str):def__new__(cls,input_value:typing.Any)->str:ifisinstance(input_value,str):if'@'ininput_value:returnstr(input_value)raiseValueError()raiseTypeError()pavlova=Pavlova()pavlova.register_parser(Email,GenericParser(pavlova,Email))
另一种方法是实现自己的pavlova解析器,而不是使用 内置的常规解析器。
importdatetimefromtypingimportAny,TupleimportdateparserfrompavlovaimportPavlovafrompavlova.parsersimportPavlovaParserclassDatetimeParser(PavlovaParser[datetime.datetime]):"Parses a datetime"defparse_input(self,input_value:Any,field_type:Type,path:Tuple[str,...])->datetime.datetime:returndateparser.parse(input_value)pavlova=Pavlova()pavlova.register_parser(datetime.DateTime,DatetimeParser(pavlova))
要求
pavlova仅在python 3.6及更高版本上受支持。对于Python3.6,它将 安装dataclasses模块。 对于Python3.7及更高版本,它将使用内置的数据类模块。
许可证
GNU LGPLv3.请看LICENSE和 COPYING.LESSER。