python - 有没有更好的方法来覆盖 Marshmallow.fields.List?

标签 python json python-3.x marshmallow

我创建了一个 NonEmptyList Marshmallow.fields.List 对象,以确保输入 JSON 列表至少有一个元素。这就是我所做的。

class NonEmptyList (fields.List):
    def __init__ (self, *args, **kwargs):
        kwargs['validate'] = Length(min=1)
        super(NonEmptyList, self).__init__(*args, **kwargs)

这有一个问题,因为它会覆盖传递给对象的验证参数。因此,如果有人尝试将我的新 NonEmptyList 与他们自己的验证参数一起使用,它将不起作用。我尝试推送到我在代码中找到的私有(private)字段 _validators,但出现名称错误。另外,这不是一个有记录的字段,因此使用它并不是一个好主意。

使用:Python 3.6.7 和 marshmallow-3.0.0b19

最佳答案

我认为您最初的尝试非常接近正常工作。您只需要考虑传入 validate 关键字的可能性 - 此 kwarg 接受可调用验证器验证器集合。在这两种情况下,您需要确保不覆盖传递的对象,而只是将最小长度要求附加到其他要求(如果有)。

类似这样的事情:

class NonEmptyList(fields.List): 
    def __init__ (self, *args, **kwargs): 
        validate = kwargs.pop("validate", []) 
        if callable(validate): 
            validate = [validate, Length(min=1)] 
        else: 
            validate = list(validate) + [Length(min=1)] 
        kwargs["validate"] = validate 
        super(NonEmptyList, self).__init__(*args, **kwargs) 

演示:

>>> class LibrarySchema(Schema): 
...     books = NonEmptyList(Str) 
...
>>> LibrarySchema().load({"books": ["The Stinky Cheese Man and Other Fairly Stupid Tales"]})
{'books': ['The Stinky Cheese Man and Other Fairly Stupid Tales']}
>>> LibrarySchema().load({"books": []})
# ValidationError: {'books': ['Shorter than minimum length 1.']}

关于python - 有没有更好的方法来覆盖 Marshmallow.fields.List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53729831/

相关文章:

python - pip 或 pip3 为 Python 3 安装包?

python - 是否可以使用 lambda 作为字典默认值?

Python 写入 xml 文件

javascript - 如何根据多个条件对特定 json 对象的值求和(例如,对象 "TYPE"的值是 "ABC")?

python 使用嵌套列表检查列表

python - Scrapy 一遍又一遍地为德国网站上的不同网址抓取同一页面

php - Ajax Response Json 在表格或div数组中打印结果

ios - 如何在 Firestore 中删除 int、double、float 的可选值?

python - 迭代和连接 2 个列表占用大量内存

python - 无法读取美丽汤的 html 页面