Python 验证DICT列表中元素正确格式的最佳实践
我有一个DICT列表,其中包含来自API的数据,我希望遍历该列表,并验证每个键的数据的格式是否正确。我有单独的功能来实现这一点,但是我想将它们集成到一个整体功能中 e、 g.由此: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
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