热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IncorrectimplementationofListfielddeserialization

Problemexplanation:

Problem explanation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 python

from marshmallow import Schema, fields, validate, validates, validates_schema, ValidationError





class IntRangeSchema(Schema):

    first = fields.Integer(required=True)

    last = fields.Integer(required=True)





class PoolSchema(Schema):

    name = fields.String(required=True)

    ranges = fields.List(fields.Nested(IntRangeSchema))



    ('ranges')

    def validate_ranges(self, ranges):

        print 'validate_ranges %s' % repr(ranges)

When I load valid data, the validate_ranges() is called with a list of dictionaries (which is expected):

1
2
3
4
5
6
7
8
9
10
11
12
 python

schema = PoolSchema(strict=True)

data = {

    'name': 'pool1',

    'ranges': [

        {'first': 1, 'last': 10},

        {'first': 11, 'last': 20},

    ],

}

print repr(schema.load(data).data)

# => validate_ranges [{'last': 10, 'first': 1}, {'last': 20, 'first': 11}]

# => {'ranges': [{'last': 10, 'first': 1}, {'last': 20, 'first': 11}], 'name': u'pool1'}

But when I load an invalid data, then the validates_ranges() receives only a non-valid dictionary, not a list:

1
2
3
4
5
6
7
8
9
10
11
 python

data = {

    'name': 'pool2',

    'ranges': [

        {'first': 1, 'last': 10},

        {'last': 10},

    ],

}            

print repr(schema.load(data).data)

# => validate_ranges {'last': 10}

# => ... ValidationError

Moreover, if I add complete schema validation (via

1
validates_schema

), this is what passed to it:

1
{'ranges': {'last': 10}, 'name': u'pool2'}

I see multiple problems here:
1) naive deserialization in List field type
2) running validations for fields that have already failed by other means.

The second issue is addressed in https://github.com/marshmallow-code/marshmallow/issues/323, so I'll focus on the first one.

Let's take List field as example. Deserialization of list types is basically:

1
2
3
 python

def _deserialize(self, value, attr, data):

    return [self.container.deserialize(each) for each in value]

By definition container is a field type which will report deserialization/validation errors by raise ValidationError exceptions. That means that you will get an error for the first invalid item in the list and the rest of items won't be validated at all. The proper way would be to accumulate all errors:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 python

def _deserialize(self, value, attr, data):

    if not utils.is_collection(value):

        self.fail('invalid')

    result = []

    errors = {}

    for idx, each in enumerate(value):

        try:

            result.append(self.container.deserialize(each))

        except ValidationError as e:

            result.append(e.data)

            errors.update({str(idx): e.message})



    if errors:

        raise ValidationError(errors, data=result)



    return result

该提问来源于开源项目:marshmallow-code/marshmallow

Thank you for the detailed report.



I think collecting errors is the desired and expected behavior. I would gladly review and merge a PR for this.


   



推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
author-avatar
mobiledu2502894753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有