gpt4 book ai didi

python - 用 `data_key` 定义的 Marshmallow 字段和用 `attribute` 定义的 Marshmallow 字段有什么区别(标识符相反?)

转载 作者:行者123 更新时间:2023-12-01 07:41:15 28 4
gpt4 key购买 nike

marshmallow.Schema (v3.0+) 之间是否有区别,其中名称为 foo 的字段是使用 attribute="bar"< 定义的,另一个名称为 bar 的字段是用 data_key="foo"?

定义的

两者似乎都以相同的方式序列化和反序列化字典和其他简单对象:

import marshmallow

class MySchema1(marshmallow.Schema):
foo = marshmallow.fields.String(attribute="bar")

class MySchema2(marshmallow.Schema):
bar = marshmallow.fields.String(data_key="foo")

schema1 = MySchema1()
schema2 = MySchema2()

dictionary = {"bar": "hello world"}
assert schema1.dump(dictionary) == schema2.dump(dictionary)
assert schema1.load(schema1.dump(dictionary)) == schema2.load(schema2.dump(dictionary))

class Thingy:
def __init__(self):
self.bar = "hello world"

instance = Thingy()
assert schema1.dump(instance) == schema2.dump(instance)
assert schema1.load(schema1.dump(instance)) == schema2.load(schema2.dump(instance))

以上通过。目前这不会在我的项目中造成任何错误,但我很好奇有什么区别!提前致谢。

最佳答案

你是对的。两种模式的行为相同。

这可以被视为冗余 API:从您的示例中,您可能想知道如果 data_key 提供相同的功能,为什么还要有 attribute

实际上,同时拥有两者很有用,因为它允许为加载键和转储键指定无效的 python 变量名称。

class MySchema(marshmallow.Schema):
foo = marshmallow.fields.String(attribute="bar-load", data_key="bar-dump")

据我所知,这就是我们没有在棉花糖中删除属性的原因。可能还有其他原因,但这一个似乎已经是一个很好的原因了。

关于python - 用 `data_key` 定义的 Marshmallow 字段和用 `attribute` 定义的 Marshmallow 字段有什么区别(标识符相反?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56708349/

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