Skip to content
This repository has been archived by the owner on Jun 27, 2023. It is now read-only.

Latest commit

 

History

History
279 lines (224 loc) · 12.6 KB

ru_README.md

File metadata and controls

279 lines (224 loc) · 12.6 KB

Проект: tense
Лицензия: Apache 2.0
Описание: Инструмент для парсинга времени
OS: Независимый
Python: 3.9+
Typing: Аннотирован
Тема: Утилиты


Документация · Сообщить о баге · Предложить идею

Оглавление
  1. О проекте
  2. Приступить к использованию
  3. Использование
  4. Примеры
  5. Вклад в проект
  6. Лицензия
  7. Контакт
  8. Благодарности
  9. История проекта

О проекте

PyPi Mypy badge Black Supported python versions

Добро пожаловать

Нужно ли Вам было конвертировать, например, строку "1д1минута 2 сек" в кол-во секунд или обьект datetime.timedelta?

Нет? Тогда посоветуйте наш проект своим друзьям :) Если вы всё ещё здесь - давайте двигаться дальше!

Приступить к использованию

PyPi

$ pip3 install tense

Poetry

$ 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"

FAQ

Но что если нам нужно парсить строку типа: "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! Проблему решить можно двумя способами:
    1. Вы пишете свой time_resolver
    2. Вы выбираете из уже существующих 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, поэтому я предлагаю Вам продолжить просмотр примеров использования тут:


Tense Примеры

Вклад в проект

Вклады — это то, что делает сообщество с открытым исходным кодом таким замечательным местом для обучения, вдохновения и творчества. Любой ваш вклад очень ценится.

Если у вас есть предложение, которое могло бы улучшить это, разветвите репозиторий и создайте запрос на включение. Вы также можете просто открыть вопрос с тегом «enhancement». Не забудьте поставить звезду проекту! Спасибо ещё раз!

  1. Создайте форк проекта
  2. Создайте вашу ветку с нововведением (git checkout -b feature/AmazingFeature)
  3. Подтвердите изменения (git commit -m 'Add some AmazingFeature')
  4. Внесите изменения на ветку (git push origin feature/AmazingFeature)
  5. Создайте пулл реквест

Лицензия

Распространяется под лицензией Apache 2.0. См. детальнее LICENSE.

Контакт

Благодарности

История

Изначально проект был сделан асинхронным, что существенно замедляло процесс парсинга, ведь 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 также останется в открытом доступе.