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