Zen of Python
20.1K subscribers
1.3K photos
180 videos
37 files
3.32K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Вопросы подписчиков

Zen of Python поддерживает новоприбывших (и не только) в особой рубрике. Как это работает:

— Спрашивайте что угодно (в комментариях под этим постом), связанное с Python. Здесь нет плохих вопросов!
— Сообщество вас поддержит. Самые интересные вопросы мы разберём в отдельном посте.

#обсуждение
@zen_of_python
Пользователь Reddit поделился Python-библиотекой для быстрых запросов к файловой системе и выполнения действий над найденными файлами.

Основная идея: вместо кучи строк кода, os.stat и datetime писать так:
query = Query(
where_expr=(AgeDays() > 7) & (Size() > "10 mb") & Suffix(".log"),
from_paths="C:/logs",
threaded=True
)
result_set = query.select()

Т.е. найти логи старше 7 дней и больше 10 МБ.

Выглядит удобно, но как-то не очень pythonic, вам не кажется? Как будто если делаешь что-то SQL-like, то лучше напрямую SQL и взять, а не изобретать мини-язык внутри Python. И это как раз самое интересное — в комментах начали предлагать как можно сделать лучше.

Например, вот так:
query(lambda p: p.age_days < 7 and p.size > 10_000_000 and p.suffix == ".log")

Добавить обёртку, которая будет вычислять необходимые свойства по запросу с использованием cached_property и получим по сути то же самое, но проще.

Или использовать модуль ast и такой синтаксис:
query("age_days < 7 and size > 10_000_000 and suffix == '.log'")


А может вообще что-то lisp-подобное:
query(("and", ("age_days", ">", 7),
("size", ">", 10_000_000),
("suffix", "==", ".log")))


Или добавить callable-объекты, которые можно передавать в фильтры, получится куда более нативно:
dir = pathlib.Path('/var')
for file in filter(OlderThan(days=7) & LargerThan(MB=10),dir.rglob("*")):
print(file.as_posix())


Лично мне, админу канала @zen_of_python, последний вариант кажется самым удобным. Не самый привычный синтаксис, но читается однозначно. И возможность задавать время и размер файлов в привычных единицах — тоже плюс.

Если для ускорения добавить конкурентность и кэширование, как сделал автор исходной библиотеки, то получится прекрасный инструмент.

А какой стиль вам больше понравился? Как бы вы реализовали?
🔥5