棉花糖Str()不起作用,但Function()能

2024-09-22 20:25:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用marshmallow来序列化我的数据对象,因为尽管仅仅写出json dicts确实非常简单,但出于某些原因,每个人都认为使用包更像python。在

问题是,它不像广告上说的那样有效。Str()字段应该从同名属性中生成字符串;Function()字段是执行代码所必需的。我认为这里不需要执行代码,但是Str()不工作,而{}可以。在

>>> 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属性。当我创建一个具有这些特性的虚拟对象时,它并不能证明问题所在。qorigin属性没有诡计,所以我不知道出了什么问题。但我希望你能给我一些提示。在


Tags: 对象代码fields属性schemalocalfunctionorigin
1条回答
网友
1楼 · 发布于 2024-09-22 20:25:01

我找到了答案:它在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

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

这可能是文档错误。在

相关问题 更多 >