Chr*_*all 18 python oop marshmallow
假设在marshmallow中定义了一个简单的模式
class AddressSchema(Schema):
street=fields.String(required=True)
city=fields.String(required=True)
country=fields.String(default='USA')
class PersonSchema(Schema):
name=fields.String(required=True)
address=fields.Nested(AddressSchema())
Run Code Online (Sandbox Code Playgroud)
这里的用例是使用内存中对象的应用程序,以及对JSON的序列化/反序列化,即没有SQL数据库.
使用标准json库,我可以解析符合此模式的JSON对象,并以某种方式访问对象person1['address']['city'],但在详细语法中使用易于输入错误的字符串有点不能令人满意.
我可以定义一个并行的OO模型,并使用@post_load装饰器注释我的模式,例如:
class Address(object):
def __init__(self, street, city, country='USA'):
self.street=street
self.city=city
self.country=country
class Person(object):
def __init__(self, street, city=None):
self.street=street
self.city=city
Run Code Online (Sandbox Code Playgroud)
但重复不是很好(我甚至没有在模式中包含描述).
可以说明确的OO模型买不多 - 它是基本的数据访问者,没有行为.我可以使用jsobject获得一些语法糖,所以我可以写例如person1.address.city.但这似乎也不对.作为开发人员,我没有明确的python类API可供参考以确定要使用的字段,我可以引用marshmallow模式,但这感觉非常间接.
从marshmallow模式定义生成上面的OO代码相当容易.我很惊讶似乎没有这样的图书馆.也许代码生成被认为是非常单一的?它当然只适用于数据访问样式类定义; 添加非泛型行为将严格禁止.
对于代码的用户,他们不需要知道使用了codegen方法 - 一切都将使用显式API,文档可以与readthedocs中的其余代码一起显示.
另一种方法是从棉花糖定义派生的动态类.同样,据我所知,没有这样的库(虽然python中动态类生成方法的范围令人印象深刻,但我可能已经错过了一些).可以说这不会对jsobjects方法产生太大的影响,但可能会有一些优点 - 可以将它与一些具有已定义行为的显式代码交织在一起.动态方法的缺点是,在Python世界中,显式优于隐式.
这里缺少图书馆意味着我要么找不到东西,要么不以适当的pythonic方式看待这个.我很高兴为pypi贡献一些东西,但在添加另一个meta-OO库之前,我想确保我已经在这里做了尽职调查.
小智 1
你的问题很模糊,我的回答也很模糊,而且很主观,我希望没关系。我只是一个花了一天时间阅读 python 序列化选项的人。
我认为 Marshmallow 根本上是非Pythonic的,并且没有很好的方法来使用它,我不打算使用它。我将给出两个对我来说是明确的例子。
通用序列化库是一种很深的兔子洞,因为您真正谈论的内容需要一次性包含类型系统、解析器和图形遍历算法的元素。Marshmallow 默认情况下不进行递归解析,因此它失败了第 (2) 点。关于第 (1) 点(有点因为第 2 点),它要么需要大量的黑客攻击,要么要求您接受类似 java 的类型系统(一切都是已知的枚举类型)。
您询问了通用序列化库,我发现库驼很有趣以及围绕它的博客文章。对于 pickle,有一个名为dill的强大扩展和一个处理版本控制的 mixin
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |