Лучшие практики для проверки правильности формата элементов в списке диктов - PullRequest
0 голосов
/ 23 октября 2018

У меня есть список диктов, содержащих данные, полученные из 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}]

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

только некоторые второстепенные модификации:

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
0 голосов
/ 23 октября 2018

Вы почти у цели:

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
...