Python 验证DICT列表中元素正确格式的最佳实践

Python 验证DICT列表中元素正确格式的最佳实践,python,validation,try-catch,Python,Validation,Try Catch,我有一个DICT列表,其中包含来自API的数据,我希望遍历该列表,并验证每个键的数据的格式是否正确。我有单独的功能来实现这一点,但是我想将它们集成到一个整体功能中 e、 g.由此: validate_date = datetime.datetime.strptime(date, '%d-%m-%Y') validate_name = isinstance(name, str) 对这样的事情: def validate_content(row): try: datetim

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

e、 g.由此:

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应抛出错误):

你就快到了:

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

只是一些小的修改:

from datetime import datetime

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

    if not isinstance(row['name'], str):
        raise ValueError('Incorrect name format detected')
  • 不是普通的
    except
    ,而是
    except-ValueError
    (如果字典不包含
    'date'
    键,则不会捕获引发的异常;这可能应该在其他地方处理)
  • isinstance
    仅返回
    False
    ,但如果实例不是
    str
    ,则不会引发错误;用
    try/except
    包围它不会产生您想要的效果
  • 这一行动:

    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}]
    
    for row in names_and_dates:
        try:
            validate_content(row)
            print('valid row {}'.format(row))
        except ValueError as e:
            print('invalid row {}\n  exception: {}'.format(row, e))
    
    将输出:

    valid row {'date': '10-10-2018', 'name': 'Monday'}
    valid row {'date': '11-10-2018', 'name': 'Tuesday'}
    valid row {'date': '12-10-2018', 'name': 'Wednesday'}
    valid row {'date': '13-10-2018', 'name': 'Thursday'}
    invalid row {'date': '2018-10-14', 'name': 'Friday'}
      exception: Incorrect date format detected
    invalid row {'date': '15-10-2018', 'name': 55}
      exception: Incorrect name format detected
    

    因此,所涉及的只是用if函数替换第二个try语句?谢谢,第二个try语句的替换仅仅是因为isinstance方法吗?e、 g.如果我添加了另一个函数来检查时间键的格式,是否需要重试?这取决于您的检查函数是否返回
    True/False
    (不需要异常处理)或异常失败(例如
    int(x)
    将失败,为
    x='a'
    引发
    ValueError
    );然后你需要一个
    try/except
    块。太好了,谢谢你的帮助,把事情弄清楚了。
    valid row {'date': '10-10-2018', 'name': 'Monday'}
    valid row {'date': '11-10-2018', 'name': 'Tuesday'}
    valid row {'date': '12-10-2018', 'name': 'Wednesday'}
    valid row {'date': '13-10-2018', 'name': 'Thursday'}
    invalid row {'date': '2018-10-14', 'name': 'Friday'}
      exception: Incorrect date format detected
    invalid row {'date': '15-10-2018', 'name': 55}
      exception: Incorrect name format detected