用“data_key”定义的 Marshmallow 字段和用“attribute”定义的 Marshmallow 字段有什么区别(标识符颠倒了?)
What is the difference between a Marshmallow field defined with `data_key` and one defined with `attribute` (with the identifiers reversed?)
marshmallow.Schema
(v3.0+) 中名称为 foo
的字段定义为 attribute="bar"
与另一个名称为 [= 的字段之间是否存在差异15=] 定义为 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")
AFAIK,这就是我们没有在棉花糖中加入 attribute
的原因。可能还有其他原因,但这一个似乎已经很好了。
marshmallow.Schema
(v3.0+) 中名称为 foo
的字段定义为 attribute="bar"
与另一个名称为 [= 的字段之间是否存在差异15=] 定义为 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")
AFAIK,这就是我们没有在棉花糖中加入 attribute
的原因。可能还有其他原因,但这一个似乎已经很好了。