Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从棉花糖中的嵌套键加载_Python_Marshmallow - Fatal编程技术网

Python 从棉花糖中的嵌套键加载

Python 从棉花糖中的嵌套键加载,python,marshmallow,Python,Marshmallow,我正在尝试使用棉花糖从字典中加载嵌套键,但我不知道如何实现 例如,我有一个字段'price',它映射到传入字典的值字典['price']['value']。我找不到棉花糖支持这一点的内置方式,所以我尝试使用pre_load处理器来压平字典。然而,我无法让它工作。我的示例单元测试失败,所有嵌套键都出现此错误: 不是有效的字符串 有什么想法吗 import unittest class ResultSchema(Schema): title = fields.String() d

我正在尝试使用棉花糖从字典中加载嵌套键,但我不知道如何实现

例如,我有一个字段
'price'
,它映射到传入字典的值
字典['price']['value']
。我找不到棉花糖支持这一点的内置方式,所以我尝试使用
pre_load
处理器来压平字典。然而,我无法让它工作。我的示例单元测试失败,所有嵌套键都出现此错误:

不是有效的字符串

有什么想法吗

import unittest


class ResultSchema(Schema):
    title = fields.String()
    description = fields.String()
    brand = fields.String(load_from='brand__name')
    price = fields.String(load_from='price__value')
    url = fields.String(load_from='url__value')

    @pre_load
    def flatten_fields(self, data):
        keys = [('brand', 'name'), ('price', 'value'), ('url', 'value')]

        for outer, inner in keys:
            try:
                data[outer + '__' + inner] = data[outer][inner]
            except (KeyError, TypeError):
                pass

        return data

class SchemaTests(unittest.TestCase):

    def setUp(self):
        self.resultSchema = ResultSchema()
        self.expected = {
            'title': 'fake title',
            'description': 'fake description',
            'brand': {'name': 'fake brand name'},
            'price': {'value': '$82.99', 'integral': 8299},
            'url': {'value': 'fake url'},
            'images': [
                {'value': 'small url', 'xsize': 60, 'ysize': 60},
                {'value': 'small-medium url', 'xsize': 100, 'ysize': 100},
                {'value': 'medium-large url', 'xsize': 160, 'ysize': 160},
                {'value': 'large url', 'xsize': 400, 'ysize': 400}
            ]
        }

    def test_schema_load(self):
        loaded, err = self.resultSchema.load(self.expected)
        if err:
            self.fail(err)

load\u from
参数指定的键名在字段名生效时,如果原始键被删除,您的方法将起作用:

data[outer + '__' + inner] = data[outer][inner]
del data[outer]
但是,为什么不直接更改嵌套字段的值,那么
load\u from=…
就变得不必要了:

data[outer] = data[outer][inner]

啊,明白了。谢谢