Я использую инструмент 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
(Этот фрагмент относится только к дате, поскольку все это касается моего приложения, но аналогичная логика может быть расширена, чтобы включить компонент времени.)
Мне интересно (надеется), что это лучший способ сделать это. Разбор одной и той же строки дважды для того, чтобы увидеть, заполняет ли она различные значения по умолчанию, по-видимому, представляет собой грубую трату ресурсов, по меньшей мере.
Здесь набор тестов (с использованием генераторов nosetest) для ожидаемого поведения:
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