gpt4 book ai didi

python - 在 Python 中结合棉花糖模式定义和 OO 的最佳实践是什么?

转载 作者:IT老高 更新时间:2023-10-28 21:14:26 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




假设在 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())

这里的用例是使用内存对象的应用程序,以及序列化/反序列化到 JSON,即没有 SQL 数据库。

使用标准 json库我可以解析符合此模式的 JSON 对象,并以诸如 person1['address']['city'] 的方式访问对象。 ,但是在冗长的语法中使用容易打错字的字符串有些不尽人意。

手工制作的OO模型

我可以定义一个并行的 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

但是重复不是很好(我什至没有在模式中包含描述)。

没有OO模型

可以说显式 OO 模型并没有买多少——它是基本的数据访问器,没有行为。我可以使用 jsobject 获得一些语法糖,这样我就可以写例如 person1.address.city .但这似乎也不太对。作为开发人员,我没有明确的 python 类 API 来确定要使用的字段,我可以引用棉花糖模式,但这感觉非常间接。

代码生成

从棉花糖模式定义生成上面的 OO 代码是相当容易的。我很惊讶似乎没有这样的图书馆。也许代码生成被认为是非常非pythonic的?它当然只适用于数据访问风格的类定义;添加非通用行为将是严格禁止的。

对于代码的用户,他们不需要知道使用了代码生成方法 - 一切都将通过显式 API 存在,文档与 readthedocs 等中的其余代码一起可见。

动态类

另一种方法是从棉花糖定义派生的动态类。同样,据我所知,没有这样的库(尽管 python 中动态类生成方法的范围令人印象深刻,但我可能错过了一些)。可以说,与 jsobjects 方法相比,这不会给您带来太多好处,但可能有一些优势 - 可以将其与一些具有定义行为的显式代码交织在一起。动态方法的缺点是在 Python 世界中显式优于隐式。

什么是最pythonic的?

这里缺少库意味着我要么没有找到任何东西,要么没有以适当的 Pythonic 方式看待这个问题。我很高兴为 pypi 贡献一些东西,但在添加另一个元 OO 库之前,我想确保我已经在这里做了尽职调查。

最佳答案

你的问题很模糊,我的回答也是如此,而且很主观,我希望没关系。我只是一个花一天时间阅读 python 中的序列化选项的家伙。

我认为 Marshmallow 从根本上来说是非 Pythonic 的,并且没有很好的方法来使用它,我不打算使用它。我将给出对我来说是两个明确的例子。

  • 您有一个类,该类将其他对象的混合类型列表作为字段。这是python,所以你可以这样做。在棉花糖中,您无法 native 或巧妙地处理此问题。有一个非常自然的解决方案,即使用已注册的序列化程序放下/打开类列表。但是在 Marshmallow 中,您必须编写自己的代码并更改每个可能的类的序列化程序,以确保它在传递给嵌套 func 的某些内容中注册。它没有为类注册序列化程序,您必须添加它。 Issue describing.
  • 您想将字符串的混合(文字)字典序列化为未知类。这与上面的几乎相同,您必须自己实现它。另外,您必须为您想要执行此操作的每个原语编写一个序列化程序/de 自己。他们为原语编写了字段而不是模式的代码,对我来说,这不是包含电池或一种明显的方式。

  • 通用的序列化库有点像一个深坑,因为你真正谈论的东西需要类型系统的元素、解析器和图遍历算法一次性完成。默认情况下,Marshmallow 不进行递归解析,因此它在第 (2) 点失败。在第 (1) 点,(有点因为 2),它要么需要大量的黑客攻击,要么需要您接受类似 java 的类型系统(一切都是已知的枚举类型)。

    您询问了一般的序列化库,我发现库 Camel 很有趣,并且有关于它的博客文章。对于泡菜,有一个强大的扩展名为 dill和处理 versioning 的 mixin

    关于python - 在 Python 中结合棉花糖模式定义和 OO 的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805767/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com