使用数据类简化反序列化

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.请看LICENSECOPYING.LESSER

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java中不同http客户端超时时间单位的重要性   java数据[i++]=data[i++]*2结果令我惊讶   java Quartz在使用spring的hibernate中执行事务时发生异常   java如何将我的对象传递给另一个类   java嵌套布局奇怪的问题   当使用javax时,有一种方法可以通过策略定义自定义订单。坚持不懈OrderBy注释?   xml Java DOM getElementByID   java使用intent将视图列表传递给另一个片段   带构造函数的Java枚举。通过构造函数参数获取值的最佳方法   java为什么不在单线程中执行此通量?   如何将JavaScript字符串传递给Nashorn引擎而不是Java字符串?   java二进制XML文件行#17:膨胀类片段时出错   java如何使用Seekbar值作为int变量?   java我想从数据存储中进行选择,但它不起作用   java如何处理幻灯片中的多分辨率图像?   java这意味着什么?类型不匹配:无法从列表<对象和可比<?>&可序列化>以列出<对象>“   java我如何让这个猜谜游戏发挥作用?   java将ZipInputStream传递给DocumentBuilder。parse()   java后添加maven依赖项,org。阿帕奇。卡塔琳娜。过滤器。当前错误消息   java有没有一种方法可以使用安卓通过按下便利键触发方法?