【问题标题】:Validation of nested dictionary's value type验证嵌套字典的值类型
【发布时间】:2020-03-13 08:07:10
【问题描述】:

我查看了marshmallow中的python数据,food字段是一个list,list里面存放的是dict。我只能做到这一步。事实上,我想验证dict中的值是int而不是string。我应该如何修改我的代码?

from marshmallow import Schema, fields, pprint

class UserSchema(Schema):
    name = fields.Str()
    food = fields.List(fields.Dict)

user_data = {
    "name": "Ken",
    "food": [{'apple': 2, 'banana': 4}, {'apple': '2', 'banana': '4'}]
}

result = UserSchema().load(user_data)
pprint(result)

【问题讨论】:

    标签: python marshmallow


    【解决方案1】:

    下面的代码应该可以验证您的数据模式。
    看代码中的cmets,很简单的解释。

    from marshmallow import ValidationError, Schema, fields, pprint # Added `ValidationError`.
    
    user_data = {
        "name": "Ken",
        "food": [
            {'apple': 2, 'banana': 4}, 
            {'apple': '2', 'banana': '4'}
        ]
    } # `user_data` is as is without changes.
    
    # New function for validation your dictionary.
    def validate_value_type(dict):
        for key in dict:
            if type(dict[key]) is not int:
                raise ValidationError(f'Type of {key}\'s value is not Integer')
    
    # `UserSchema` class with changes.
    class UserSchema(Schema):
        name = fields.Str()
        food = fields.List(fields.Dict(validate=validate_value_type)) # Added validation function.
    
    # Wrapped `load` in `try/catch`.
    try:
        UserSchema().load(user_data)
    except ValidationError as err:
        pprint(err.messages)
    

    以上代码输出:

    {'food': {1: ["Type of apple's value is not Integer"]}}
    

    【讨论】:

      【解决方案2】:

      尝试像这样遍历并检查每个值类型

      DictList = [{'apple': 2, 'banana': 4}, {'apple': '2', 'banana': '4'}]
      
      user_data = {
          "name": "Ken",
          "food": DictList
      }
      
      
      
      def verify():
          for i in DictList:
              for k in i:
                  if type(i[k]) == int:
                      return True
                  return False
      
      
      
      
      if verify():
          result = UserSchema().load(user_data)
          pprint(result)
      

      【讨论】:

      【解决方案3】:

      在您的函数中检查此代码:

      print(type(var_name)) 
      

      【讨论】:

        猜你喜欢
        • 2020-02-12
        • 1970-01-01
        • 2016-01-11
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多