Стрелка успешно анализирует некоторые входные данные не по умолчанию
При неправильном вводе стрелка поднимается 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.