Добрый день. Нужно сделать функцию которая будет понимать дату в различных форматах. Написал портянку, тест проходит, но хочется сделать как то более красиво, и возможность в дальнейшем добавить еще строковые форматы.
Тест
@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