Стрелка успешно анализирует некоторые входные данные не по умолчанию

При неправильном вводе стрелка поднимается ParserError:

>>> arrow.get('abc')
ParserError: Could not match input to any of [u'YYYY-MM-DD', u'YYYY/MM/DD', u'YYYY.MM.DD', u'YYYY-MM', u'YYYY/MM', u'YYYY.MM', u'YYYY', u'YYYY', u'YYYY'] on 'abc'
>>> arrow.get('09-10-201')
ParserError: Could not match input to any of [u'YYYY-MM-DD', u'YYYY/MM/DD', u'YYYY.MM.DD', u'YYYY-MM', u'YYYY/MM', u'YYYY.MM', u'YYYY', u'YYYY', u'YYYY'] on '09-10-201'

Здесь показаны все подходящие шаблоны, которые использовала стрелка до вызова исключения. Однако иногда, даже если входные данные не соответствуют ни одному из этих шаблонов, он молча преобразует его в объект:

>>> arrow.get('09-10-2017')
<Arrow [2017-01-01T00:00:00+00:00]>  # Succeeds with incorrect date

Объясняется ли это дополнительными скрытыми шаблонами разбора, предоставляемыми моей системной локалью? Если это так, почему он должен анализировать 2017 год и не включать 09 и 10? Если нет, то почему анализ был успешным?

1 ответ

Решение

Стрелка использует регулярное выражение, чтобы сопоставить данную строку с форматом даты.

Например:

arrow.get('aaa2012-01-21aa')

принимается как вход

<Arrow [2012-01-21T00:00:00+00:00]>

потому что это соответствует формату YYYY-MM-DD который внутренне был преобразован в регулярное выражение вида '(?P<YYYY>\d{4})-(?P<MM>\d{2})-(?P<DD>\d{2})' и это регулярное выражение захватывает случай.

Ваш вход соответствует только для YYYY и остальная часть строки отбрасывается.

Для выявления ошибки и форсирования определенного формата очень полезен совет, данный @asongtoruin.

Другие вопросы по тегам