Анализ даты в python без использования значения по умолчанию

Я использую инструмент 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
13
задан Zero Piraeus 24 July 2013 в 22:58
поделиться