簡體   English   中英

驗證字典列表中元素的正確格式的最佳實踐

[英]Best practice for validating correct format of elements in list of dicts

我有一個包含來自 API 的數據的字典列表,我想遍歷這個列表,並驗證每個鍵的數據格式是否正確。 我有單獨的功能來實現這一點,但是我想將這些集成到一個整體功能中。

例如從這個:

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}]

您快到了:

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')
  1. 不是一個普通的except而是一個except ValueError (如果字典不包含'date'鍵,這將不會捕獲引發的異常;這可能應該在其他地方處理)
  2. 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM