如何定义模式使列表不允许为空?

用户

python-eve REST API framework中,我在资源中定义了一个列表,列表项的类型是dict。我不希望列表为空。那么,如何定义模式呢?在

{
    'parents' : {
        'type' : 'list',
        'schema' : {
            'parent' : 'string'
        }
    }
}


已被浏览了7947次
更新日期: 2020-10-22 22:27:38
2 个回答
fefe Tyson

当前,empty验证规则仅适用于字符串类型,但您可以将标准验证器子类化,使其能够处理列表:

from eve.io.mongo import Validator

class MyValidator(Validator):
    def _validate_empty(self, empty, field, value):
        # let the standard validation happen
        super(Validator, self)._validate_empty(empty, field, value)
        # add your custom list validation
        if isinstance(value, list) and len(value) == 0 and not empty:
            self._error(field, "list cannot be empty")

或者,如果要提供标准的empty错误消息:

^{pr2}$

然后按如下方式运行API:

^{3}$

PS:我计划将来某个时候将列表和dict添加到Cerberus的empty规则中。在

评论 - 2020年8月7日 23:12
fefe Tyson

没有一种内在的方法可以做到这一点。不过,您可以为列表定义一个包装类:

class ListWrapper(list):
    # Constructor
    __init__(self, **kwargs):
        allIsGood = False
        # 'kwargs' is a dict with all your 'argument=value' pairs
        # Check if all arguments are given & set allIsGood
        if not allIsGood:
            raise ValueError("ListWrapper doesn't match schema!")
        else:
            # Call the list's constructor, i.e. the super constructor
            super(ListWrapper, self).__init__()

            # Manipulate 'self' as you please

在需要非空列表的任何地方使用ListWrapper。如果您愿意,您可以将模式的定义外部化,并将其作为输入添加到构造函数中。在

另外:您可能想看看this

评论 - 2020年8月7日 23:12

最新Python问答

推荐Python问答