Лицензия: Apache 2.0
Описание: Инструмент для парсинга времени
OS: Независимый
Python: 3.9+
Typing: Аннотирован
Тема: Утилиты
Документация
·
Сообщить о баге
·
Предложить идею
Оглавление
Нужно ли Вам было конвертировать, например, строку "1д1минута 2 сек" в кол-во секунд или обьект datetime.timedelta?
Нет? Тогда посоветуйте наш проект своим друзьям :) Если вы всё ещё здесь - давайте двигаться дальше!
$ pip3 install tense
$ poetry add tense
import datetime
from tense import TenseParser
time_string = "1d2minutes 5 sec"
# <-- Digit parser -->
digit_parser = TenseParser(TenseParser.DIGIT)
assert digit_parser.parse(time_string) == 86525
# <-- Timedelta parser -->
delta_parser = TenseParser(TenseParser.TIMEDELTA)
delta_value = delta_parser.parse(time_string)
# <-- Assertions -->
assert isinstance(delta_value, datetime.timedelta)
assert str(delta_value) == "1 day, 0:02:05"
from tense import TenseParser, from_tense_file_source
config_emulation = """
[model.Tense]
multiplier = 2 # секундное значение каждой единицы времени будет умножено на 2
# !!! Уточнение: Если multiplier <= 0, тогда парсеры могут работать некорректно
# В данном случае будет выслано предупреждение в консоль.
[units.Minute]
duration = 120 # Почему бы и нет?...
aliases = моя_минута, моя_мин, моих_мин, минут
"""
parser = TenseParser(
TenseParser.TIMEDELTA,
tenses=from_tense_file_source(config_emulation),
)
delta_value = parser.parse("1 моя_мин 10моих_мин 9 минут")
assert str(delta_value) == "1:20:00" # (каждая 120 * 2)
from tense import TenseParser, from_tense_file_source
config_emulation = """
[model.Tense] # Этот заголовок обязателен.
[units.Year]
duration = exp(year)
aliases = год, лет
[units.Second]
duration = exp(second)
aliases = с, сек, секунд
[virtual]
duration = exp(year * 10)
aliases = десятилетие, десятилетий
"""
parser = TenseParser(
TenseParser.TIMEDELTA,
tenses=from_tense_file_source(config_emulation),
)
delta_value = parser.parse("1год 10 десятилетий5 секунд")
assert str(delta_value) == "36865 days, 0:00:05"
Но что если нам нужно парсить строку типа: "1day and 10 minutes + 5 seconds"? Давайте посмотрим:
>> > from tense import TenseParser
>> > complex_string = "1day and 10 minutes + 5 seconds"
>> > parser = TenseParser(TenseParser.TIMEDELTA)
>> > parser.parse(complex_string)
'0:00:05'
Подождите... Что? 5 секунд? Но там же дни и минуты...
- Всё окей, вы же используете гибкий tense! Проблему решить можно двумя способами:
- Вы пишете свой time_resolver
- Вы выбираете из уже существующих tense.resolvers
Давайте продемонстрирую! Я буду использовать второй вариант, так как существующие резольверы мне подходят.
>> > from tense import TenseParser, resolvers
>> > complex_string = "1day and 10 minutes + 5 seconds"
>> > parser = TenseParser(TenseParser.TIMEDELTA, time_resolver=resolvers.smart_resolver)
>> > parser.parse(complex_string)
'1 day, 0:10:05'
Ну, так-то лучше!
tense.application.resolvers.smart_resolver() так же является не чувствительным к регистру!
>> > from tense import TenseParser, resolvers
>> > complex_string = "1DAY and 10 MINUTES + 5 SECONDS"
>> > parser = TenseParser(TenseParser.TIMEDELTA, time_resolver=resolvers.smart_resolver)
>> > parser.parse(complex_string)
'1 day, 0:10:05'
Если Вы думаете, что на этом возможности tense заканчиваются, то вы ошибаетесь! Возможностей tense слишком много для README, поэтому я предлагаю Вам продолжить просмотр примеров использования тут:
Вклады — это то, что делает сообщество с открытым исходным кодом таким замечательным местом для обучения, вдохновения и творчества. Любой ваш вклад очень ценится.
Если у вас есть предложение, которое могло бы улучшить это, разветвите репозиторий и создайте запрос на включение. Вы также можете просто открыть вопрос с тегом «enhancement». Не забудьте поставить звезду проекту! Спасибо ещё раз!
- Создайте форк проекта
- Создайте вашу ветку с нововведением (
git checkout -b feature/AmazingFeature
) - Подтвердите изменения (
git commit -m 'Add some AmazingFeature'
) - Внесите изменения на ветку (
git push origin feature/AmazingFeature
) - Создайте пулл реквест
Распространяется под лицензией Apache 2.0. См. детальнее LICENSE
.
- Choose an Open Source License
- Img Shields
- GitHub Pages
- Python
- Python Community
- MkDocs
- MkDocs Material
Изначально проект был сделан асинхронным, что существенно замедляло процесс парсинга, ведь tense является CPU-bound модулем.
Отрефакторив проект, мы получили ~x22.31
ускорение в обработке сложных строк (с помощью smart_resolver
).
Было:
~0.00095030...
μs | Стало:~0.00004260...
μs
И ~x38.28
ускорение в обработке простых строк, соответственно (с помощью basic_resolver
).
Было:
~0.00062400...
μs | Стало:~0.00001630...
μs
Предыдущая (асинхронная) версия по-прежнему доступна в ветках репозитория - https://github.com/Animatea/tense/tree/async-final, но сайт с документацией будет изменён. Пакет на PyPi также останется в открытом доступе.