Рик Поджи прав, строка «Июнь» не может быть месяцем для python-dateutil
. Немного углубившись в dateutil/parser.py
, основная проблема в том, что этот модуль достаточно интернационализирован для работы с западноевропейскими языками латинского алфавита. Он не предназначен для работы с такими языками, как русский, с использованием нелатинских шрифтов, таких как кириллица.
Самым большим препятствием является dateutil/parser.py:45-48
, где лексический анализатор class _timelex
определяет символы, которые можно использовать в токенах, включая названия месяца и дня:
class _timelex(object):
def __init__(self, instream):
# ... [some material omitted] ...
self.wordchars = ('abcdfeghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'
'ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'
'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ')
self.numchars = '0123456789'
self.whitespace = ' \t\r\n'
Поскольку wordchars
не включает буквы кириллицы, _timelex
испускает каждый байт в строке даты как отдельный символ. Это то, что заметил Рик.
Другое большое препятствие заключается в том, что dateutil
использует байтовые строки Python вместо строк Юникода для внутренней обработки. Это означает, что, даже если _timelex был расширен для приема букв кириллицы, все равно будут несоответствия между обработкой байтов и символов и проблемами, вызванными различием в кодировании строк между вызывающим и исходным кодом python_dateutil
.
Существуют и другие незначительные проблемы, такие как предположение, что название каждого месяца имеет длину не менее 3 символов (не относится к японскому языку), а также множество деталей, связанных с григорианским календарем. Было бы полезно, чтобы поле wordchars
было выбрано из parserinfo
, если оно есть, чтобы parserinfo могла определить правильный набор символов для своих названий месяцев и дней.
python_dateutil
v 2.0 был портирован на Python 3, но вышеперечисленные проблемы проектирования существенно не изменились. Различия между 2.0 и 1.5 связаны с изменениями языка Pyhon, а не с дизайном dateutil и структурами данных.
Олег, вы смогли изменить parserinfo, и я подозреваю, что вам это удалось, потому что ваш тестовый код не использовал parser()
(и _timelex
) python_dateutil
. Вы по сути поставили свой собственный парсер и лексер.
Исправление этой проблемы потребовало бы довольно значительных улучшений в обработке текста python_dateutil
. Было бы замечательно, если бы кто-то сделал патч с этим изменением, и сопровождающие пакета смогли бы включить его.