Marshmallow Str()不起作用,但Function()起作用

时间:2018-04-18 00:14:36

标签: python marshmallow

我正在尝试marshmallow来序列化我的数据对象,因为尽管只写出json dicts真的很容易,但出于某种原因,每个人都认为使用包更加pythonic。

问题是,它没有按照它宣传的方式运作。 Str()字段应该从同名属性中生成一个字符串;执行代码需要Function()字段。我不认为此处应该执行代码,但Str()无效,Function()是。

>>> q.origin
'local.qdb'

>>> from marshmallow import Schema, fields
>>> class StrSchema(Schema):
        origin = fields.Str()

>>> StrSchema().dump(q)
MarshalResult(data={'origin': ''}, errors={})

>>> class FunctionSchema(Schema):
        origin = fields.Function(lambda x: x.origin)

>>> FunctionSchema().dump(q)
MarshalResult(data={'origin': 'local.qdb'}, errors={})

我错过了什么吗? q这里是一个复杂的对象,但它有一个_origin属性和一个只返回属性的origin属性。当我只是创建一个具有这些特征的虚拟对象时,它不会证明问题。 origin q属性中没有任何诡计,所以我不知道错误是什么。但我很欣赏任何提示。

1 个答案:

答案 0 :(得分:1)

我找到了答案:它位于utils文件的_get_value_for_key函数中:

def _get_value_for_key(key, obj, default):
    try:
        return obj[key]
    except (KeyError, AttributeError, IndexError, TypeError):
        try:
            attr = getattr(obj, key)
            return attr() if callable(attr) else attr
        except AttributeError:
            return default
    return default

基本上,Marshmallow在尝试__getitem__之前尝试getattr;我的对象在__getitem__上返回空,而不是引发一个关键错误。

这可能是文档错误。