Я использую инструмент python dateutil.parser
для анализа некоторых дат, которые я получаю от третьего вечеринка. Он позволяет указать дату по умолчанию, которая по умолчанию равна сегодняшнему дню, для заполнения недостающих элементов анализируемой даты. Хотя это в целом полезно, для моего варианта использования нет разумного значения по умолчанию, и я бы предпочел рассматривать частичные даты, как если бы я вообще не получил дату (поскольку это почти всегда означает, что я получил искаженные данные).Я написал следующее решение:
from dateutil import parser
import datetime
def parse_no_default(dt_str):
dt = parser.parse(dt_str, default=datetime.datetime(1900, 1, 1)).date()
dt2 = parser.parse(dt_str, default=datetime.datetime(1901, 2, 2)).date()
if dt == dt2:
return dt
else:
return None
(Этот фрагмент кода смотрит только на дату, поскольку это все, что меня волнует для моего приложения, но аналогичная логика может быть расширена, чтобы включить компонент времени.)
Я интересно (надеясь), что есть лучший способ сделать это. Двойной синтаксический анализ одной и той же строки, чтобы убедиться, что она заполняется разными значениями по умолчанию, кажется, мягко говоря, пустой тратой ресурсов.
Вот набор тестов (с использованием генераторов тестов) для ожидаемого поведения:
import nose.tools
import lib.tools.date
def check_parse_no_default(sample, expected):
actual = lib.tools.date.parse_no_default(sample)
nose.tools.eq_(actual, expected)
def test_parse_no_default():
cases = (
('2011-10-12', datetime.date(2011, 10, 12)),
('2011-10', None),
('2011', None),
('10-12', None),
('2011-10-12T11:45:30', datetime.date(2011, 10, 12)),
('10-12 11:45', None),
('', None),
)
for sample, expected in cases:
yield check_parse_no_default, sample, expected