首页 > 解决方案 > 验证字典列表中元素的正确格式的最佳实践

问题描述

我有一个包含来自 API 的数据的 dicts 列表,并且想要遍历这个列表,并验证每个键的数据格式是否正确。我有实现此目的的单独功能,但是我想将它们集成到一个整体功能中。

例如从这个:

validate_date = datetime.datetime.strptime(date, '%d-%m-%Y')
validate_name = isinstance(name, str)

对于这样的事情:

def validate_content(row):
    try:
        datetime.datetime.strptime(row[0], '%d-%m-%Y')
    except:
        raise ValueError('Incorrect date format detected')

    try:
        isinstance(row[1], str)
    except:
        raise ValueError('Incorrect name format detected')

显然这种语法不正确,有人可以告诉我验证多个字段的最佳解决方案吗?

样本数据(索引 4 和 5 应该抛出错误):

names_and_dates = [{'date': '10-10-2018', 'name': 'Monday'},
                   {'date': '11-10-2018', 'name': 'Tuesday'},
                   {'date': '12-10-2018', 'name': 'Wednesday'},
                   {'date': '13-10-2018', 'name': 'Thursday'},
                   {'date': '2018-10-14', 'name': 'Friday'},
                   {'date': '15-10-2018', 'name': 55}]

标签: pythonvalidationtry-catch

解决方案


您快到了:

import datetime

def validate_content(row):
    try:
        datetime.datetime.strptime(row["date"], '%d-%m-%Y')
    except:
        raise ValueError('Incorrect date format detected: {}'.format( row["date"] ))

    if not  isinstance(row["name"], str):
        raise ValueError('Incorrect name format detected: {}'.format( row["name"] ))


names_and_dates = [{'date': '10-10-2018', 'name': 'Monday'},
                   {'date': '11-10-2018', 'name': 'Tuesday'},
                   {'date': 'Hello world', 'name': 'Tuesday'},
                   {'date': '12-12-2020', 'name': 55},
                   ]

for index, item in enumerate(names_and_dates):
    try:
        validate_content(item)
    except Exception as e:
        print("Error in item {}: {}".format(index, e))

输出:

Error in item 2: Incorrect date format detected: Hello world
Error in item 3: Incorrect name format detected: 55

推荐阅读