我有一个包含来自 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}]
最佳答案
只是一些小的修改:
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'
,这不会捕获引发的异常key;这可能应该在其他地方处理) 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
关于python - 验证字典列表中元素格式正确的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950797/