Marshmallow Str() 不起作用,但 Function() 起作用
Marshmallow Str() does not work but Function() does
我正在尝试 marshmallow
序列化我的数据对象,因为即使只是写出 json 指令真的很容易,出于某种原因每个人都认为使用包更像 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
属性 只是 returns 属性。当我只是创建一个具有这些特征的虚拟对象时,它并没有说明问题。 q
的 origin
属性 没有任何诡计,所以我不知道哪里出了问题。但我会很感激任何提示。
我找到了答案:它在 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 在尝试 getattr
之前先尝试 __getitem__
;我的对象在 __getitem__
返回空,而不是引发关键错误。
这可能是文档错误。
我正在尝试 marshmallow
序列化我的数据对象,因为即使只是写出 json 指令真的很容易,出于某种原因每个人都认为使用包更像 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
属性 只是 returns 属性。当我只是创建一个具有这些特征的虚拟对象时,它并没有说明问题。 q
的 origin
属性 没有任何诡计,所以我不知道哪里出了问题。但我会很感激任何提示。
我找到了答案:它在 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 在尝试 getattr
之前先尝试 __getitem__
;我的对象在 __getitem__
返回空,而不是引发关键错误。
这可能是文档错误。