В чем разница между полем Marshmallow, определенным с помощью `data_key`, и полем, определенным с помощью` attribute` (с обращенными идентификаторами?) - PullRequest
1 голос
/ 21 июня 2019

Есть ли разница между 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))

Вышеуказанные этапы.Это не вызывает никаких ошибок в моем проекте в настоящее время, но мне любопытно, в чем разница!Заранее спасибо.

1 Ответ

1 голос
/ 24 июня 2019

Вы правы. Обе схемы ведут себя одинаково.

Это можно рассматривать как избыточный API: из вашего примера вы можете задаться вопросом, почему attribute, если data_key обеспечивает такую ​​же функциональность.

На практике полезно иметь и то и другое, поскольку оно позволяет указывать ключи, которые являются недопустимыми именами переменных python для ключей загрузки и дампа.

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

AFAIK, это причина, по которой мы не понизили attribute зефира. Могут быть и другие причины, но эта уже кажется хорошей.

...