@kicherov_maxim

Как красиво использовать strptime с различными форматами?

Добрый день. Нужно сделать функцию которая будет понимать дату в различных форматах. Написал портянку, тест проходит, но хочется сделать как то более красиво, и возможность в дальнейшем добавить еще строковые форматы.

Тест
@mark.parametrize(
    'arg, result',
    [
        (date(1996, 9, 1), date(1996, 9, 1)),
        (datetime(1996, 9, 1), date(1996, 9, 1)),
        ('01.09.2004', date(2004, 9, 1)),
        ('01/09/2004', date(2004, 9, 1)),
        ('2004-09-1', date(2004, 9, 1)),
    ],
)
def test_convert_date(arg, result):
    assert_that(convert_date(arg), is_(result))


Функция
def convert_date(value: date | datetime | str) -> date:
    if isinstance(value, datetime):
        return value.date()
    if isinstance(value, date):
        return value
    try:
        return datetime.strptime(value, '%d.%m.%Y').date()
    except ValueError:
        pass
    try:
        return datetime.strptime(value, '%d/%m/%Y').date()
    except ValueError:
        pass
    try:
        return datetime.strptime(value, '%Y-%m-%d').date()
    except ValueError as e:
        raise ValueError('Cant detect date format') from e
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Если тянуть зависимости не хотите и во что бы то ни стало желаете реализовать самостоятельно, а набор форматов, которые нужно поддерживать, понятен, то можно селать так.
Делаете список форматов в порядке оценки невозрастания вероятности его применения.
По списку форматов идёте циклом и пробуете каждый. Попытку парсинга внутри цикла заворачиваете в try\except и при отсутствии ошибки произойдёт спешный return, а по факту завершения цикла райсите свою ошибку о том, что не удалось подобрать формат для парсинга даты.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час