Ліцензія: Apache 2.0
Опис: Інструмент для парсингу часу
OS: Незалежний
Python: 3.9+
Typing: Annotated
Тема: Утиліти
Документація
·
Сповістити про баг
·
Запропонувати ідею
Зміст
Чи потрібно Вам було конвертувати, наприклад, строку "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 також залишиться у відкритому доступі.