sorcery — это удобная отладочная библиотека, которая позволяет печатать переменные с их именами с помощью магического
print(expr)
— без необходимости вручную писать имена.Полезна, когда нужно быстро выводить значения переменных для отладки, но лень писать
f"{var=}"
или использовать ic()
.from sorcery import spell
@spell
def test():
name = "Alice"
age = 30
print(name, age) # Автоматически напечатает: name='Alice', age=30
test()
name='Alice', age=30
➕ Преимущества:
pip install sorcery
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
cloup — это расширение для Click, добавляющее поддержку группировки опций, взаимных зависимостей и контекстных ограничений.
Полезно, если ты создаёшь сложные CLI-инструменты с множеством параметров и хочешь сделать интерфейс логичным и защищённым от ошибок пользователя.
import cloup
from cloup import option_group
@cloup.command()
@option_group(
"Авторизация",
cloup.option("--user", help="Имя пользователя"),
cloup.option("--token", help="API токен")
)
@option_group(
"Настройки вывода",
cloup.option("--verbose", is_flag=True),
cloup.option("--json", is_flag=True)
)
def cli(user, token, verbose, json):
print(f"👤 User: {user}, Token: {token}")
print(f"🔧 Verbose: {verbose}, JSON: {json}")
if __name__ == "__main__":
cli()
➕ Преимущества:
--help
pip install cloup
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤🔥2
PyFunctional — это мощная библиотека для декларативной обработки коллекций в стиле функционального программирования. Позволяет применять map, filter, reduce и другие операции к потокам данных с лаконичным синтаксисом.
Идеально подходит, если ты хочешь работать с данными в цепочках и писать код, близкий к Scala или LINQ.
from functional import seq
# Работа с коллекцией: фильтрация, преобразование, агрегация
data = seq([1, 2, 3, 4, 5]) \
.filter(lambda x: x % 2 == 0) \
.map(lambda x: x * 10) \
.reduce(lambda x, y: x + y)
print(data) # 60
# Обработка строк и списков словарей
names = seq(["Alice", "Bob", "Charlie"]).map(str.upper).to_list()
print(names) # ['ALICE', 'BOB', 'CHARLIE']
users = [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 20},
{"name": "Charlie", "age": 25}
]
youngest = seq(users).min_by(lambda u: u["age"])
print(youngest) # {'name': 'Bob', 'age': 20}
➕ Преимущества:
filter
, map
, group_by
, sum
, reduce
, flatten
pip install PyFunctional
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4
yaspin — это легковесная и мощная библиотека для отображения текстовых спиннеров в терминале во время длительных операций.
Отлично подходит для CLI-приложений — улучшает UX, показывает, что скрипт активно работает, и при этом не усложняет код.
import time
from yaspin import yaspin
# Начало спиннера с текстом и цветом
with yaspin(text="Загрузка...", color="cyan") as spinner:
time.sleep(2) # длительная операция
spinner.ok("✅ ") # смена иконки при успешном завершении
Или как декоратор:
from yaspin import yaspin
@yaspin(text="Обработка данных...")
def process():
time.sleep(3)
return "done"
process()
➕ Преимущества:
stdout/stderr
— шрифты не слетаютpip install yaspin
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍12
python-box — это удобная библиотека, которая превращает обычные словари в объекты с доступом по точке (
dot notation
). Позволяет обращаться к полям как к атрибутам, что упрощает чтение и работу с конфигами или API-ответами.Идеально подходит для тех, кто устал писать
dict["key"]
и хочет более лаконичный стиль кода.from box import Box
data = {
"user": {
"name": "Alice",
"age": 30
},
"settings": {
"theme": "dark"
}
}
# Преобразуем в Box
box_data = Box(data)
# Доступ по точке
print(box_data.user.name) # Alice
print(box_data.settings.theme) # dark
# Изменения также работают
box_data.user.age = 31
print(box_data.user.age) # 31
➕ Преимущества:
obj.key
вместо obj['key']
Box.to_dict()
)pip install python-box
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥11👍7🤔2
addict — это минималистичная библиотека, превращающая обычные словари в объекты с доступом к ключам через точку (dot notation), создавая при этом вложенные поля на лету.
Идеальна, если ты хочешь создавать или модифицировать конфигурации, структуры данных или JSON-like объекты в удобной форме без лишней возни.
from addict import Dict
config = Dict()
# Автоматически создаёт вложенные структуры
config.user.name = "Alice"
config.user.age = 30
config.theme.dark_mode = True
print(config) # {'user': {'name': 'Alice', 'age': 30}, 'theme': {'dark_mode': True}}
# Обратная совместимость
print(config['user']['name']) # Alice
➕ Преимущества:
pip install addict
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
glom — это мощный инструмент для безопасного доступа, трансформации и извлечения данных из сложных вложенных структур (
dict
, list
, JSON и др.).Идеальна, если ты работаешь с вложенными данными из API, конфигов или сериализованных структур и хочешь избежать множества
try/except
и проверок ключей.from glom import glom
data = {
"user": {
"profile": {
"name": "Alice",
"contacts": {
"email": "alice@example.com"
}
}
}
}
# Извлекаем вложенное значение
name = glom(data, 'user.profile.name')
print(name) # Alice
# Значение по умолчанию, если путь не существует
phone = glom(data, 'user.profile.contacts.phone', default='N/A')
print(phone) # N/A
# Преобразование структуры
spec = {
"username": "user.profile.name",
"email": "user.profile.contacts.email"
}
user_info = glom(data, spec)
print(user_info) # {'username': 'Alice', 'email': 'alice@example.com'}
➕ Преимущества:
dict
, list
, tuple
, lambda
)pip install glom
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
exrex — это генератор строк, соответствующих заданному регулярному выражению. В отличие от стандартной библиотеки
re
, он не проверяет соответствие строки паттерну, а генерирует строки, которые этому паттерну соответствуют.import exrex
# Сгенерировать одну случайную строку по шаблону
print(exrex.getone(r'[A-Z]{3}\d{2}'))
# ➔ Например: 'QWE84'
# Все возможные строки (для ограниченных шаблонов)
for s in exrex.generate(r'ab[1-2]'):
print(s)
# ➔ ab1, ab2
# Количество всех возможных совпадений (если конечное множество)
count = sum(1 for _ in exrex.generate(r'[A-B][1-3]'))
print(count) # ➔ 6
# Выводит шаблон в обратную сторону (reverse regex)
print(exrex.getone(r'(foo|bar){2}\d{1,2}'))
➕ Преимущества:
pip install exrex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥2
porcupine — это минималистичная библиотека для создания простых интерактивных CLI-приложений с возможностью подсветки, автодополнения и асинхронного ввода.
Основана на prompt_toolkit, но упрощает его использование.
from porcupine import interactive
@interactive
def shell():
while True:
cmd = input(">> ")
if cmd == "exit":
break
print(f"Вы ввели: {cmd}")
shell()
➕ Преимущества:
click
, rich
, prompt_toolkit
pip install porcupine
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤🔥2
icontract — это надёжная библиотека для Design by Contract (контрактное программирование) в Python. Добавляет
@require
, @ensure
, @invariant
, что помогает явно описывать предусловия, постусловия и инварианты в коде.Идеальна для повышения читаемости функции, обнаружения ошибок на ранних этапах и самодокументирования.
import icontract
@icontract.require(lambda x: x >= 0)
@icontract.ensure(lambda result: result >= 0)
def sqrt(x: float) -> float:
return x ** 0.5
print(sqrt(16)) # ➔ 4.0
sqrt(-1) # ❌ ViolationError: x >= 0
@icontract.invariant(lambda self: self.balance >= 0)
class Account:
def __init__(self, balance: int) -> None:
self.balance = balance
@icontract.require(lambda self, amount: amount > 0)
@icontract.ensure(lambda self, OLD: self.balance == OLD.self.balance - amount)
def withdraw(self, amount: int) -> None:
self.balance -= amount
➕ Преимущества:
pip install icontract
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥3
pyrsistent — это функциональная библиотека для работы с неизменяемыми (immutable) структурами данных: списками, словарями, множествами и др.
Идеально подходит для надёжных систем, где важно избежать нежелательных побочных эффектов и сохранить предыдущие состояния данных — например, в конфигурациях, многопоточности и тестах.
from pyrsistent import pvector, pmap
# Неизменяемый список
v = pvector([1, 2, 3])
v2 = v.append(4)
print(v) # ➔ [1, 2, 3]
print(v2) # ➔ [1, 2, 3, 4]
# Неизменяемый словарь
m = pmap({"user": "alice", "active": True})
m2 = m.set("active", False)
print(m["user"]) # ➔ alice
print(m2["active"]) # ➔ False
# Все оригинальные данные остаются неизменными
print(m["active"]) # ➔ True
➕ Преимущества:
dataclasses
и copy.deepcopy
)pip install pyrsistent
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥6👍2
returns — это библиотека для написания чистого и безопасного функционального кода в Python. Она добавляет контейнеры вроде
Result
, Maybe
, IO
, и другие концепции из Haskell / Scala, помогая избавиться от None
, try/except
, и повышая предсказуемость кода.Идеальна, если ты хочешь писать декларативно, безопасно и без side-effect'ов.
from returns.result import Result, Success, Failure
def divide(x: int, y: int) -> Result[float, str]:
if y == 0:
return Failure("Деление на ноль")
return Success(x / y)
result = divide(10, 2).map(lambda x: x * 2)
print(result) # ➔ <Success: 10.0>
error = divide(10, 0).map(lambda x: x * 2)
print(error) # ➔ <Failure: 'Деление на ноль'>
➕ Преимущества:
Result
, Maybe
, IO
, RequiresContext
— как в языках с strong typingtry/except
.map()
, .bind()
и .alt()
для чистого, цепочного кодаmypy
и типизациейpip install returns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥2
deal — это декларативная библиотека контрактного программирования, которая позволяет добавлять к функциям проверяемые условия: предусловия, постусловия, инварианты, исключения и побочные эффекты.
Она не просто валидирует логику — она анализирует и тестирует ваш код, включая статическую проверку через
mypy
и deal lint
.import deal
@deal.pre(lambda x: x >= 0)
@deal.post(lambda result: result >= 0)
def sqrt(x: float) -> float:
return x ** 0.5
print(sqrt(9)) # ✔️
print(sqrt(-4)) # ❌ deal.PreContractError
@deal.raises(ZeroDivisionError)
def div(a, b):
return a / b
➕ Преимущества:
@pre
, @post
, @raises
— чёткие и читаемые контрактыdeal lint
— предупреждает ошибки ещё до запускаmypy
, pytest
, hypothesis
pip install deal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍5
jaxtyping — это библиотека для декларативного описания размерностей и типов массивов (
numpy
, torch
, jax
) прямо в type hints. Она усиливает проверку типов при работе с тензорами, помогая ловить ошибки ещё до выполнения кода.Идеальна для научных вычислений, ML/AI, CV — когда важна строгая типизация массивов и предсказуемость размерностей.
from jaxtyping import Float, Int64
import torch
from typing import Callable
# Функция принимает Float32 тензор размером (batch, 3)
def normalize(x: Float[torch.Tensor, "batch 3"]) -> Float[torch.Tensor, "batch 3"]:
return x / x.norm(dim=1, keepdim=True)
# Пример с проверкой
x = torch.randn(32, 3)
normalize(x) # ✅
➕ Преимущества:
shape
и dtype
прямо в аннотацияхpip install jaxtyping
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
pyinstrument
— это минималистичный, но мощный профилировщик производительности. Он показывает, что именно замедляет выполнение Python-программы, и в каком участке кода тратится больше всего времени — в виде читаемого дерева вызовов.Идеален для быстрого анализа "узких мест" в скриптах, API, CLI и любом CPU-bound коде.
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
# код, который нужно проанализировать
total = 0
for i in range(1000000):
total += i ** 0.5
profiler.stop()
profiler.print()
Timer started at: 15:20:42
Total time: 0.42s
Program:
0.420s [self] your_script.py:7
└─ 0.420s your_script.py:10 total += i ** 0.5
➕ Преимущества:
main()
pip install pyinstrument
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3
scalene — это высокоточный профилировщик Python, который измеряет использование CPU, памяти и даже GPU по строкам кода. В отличие от стандартных профилировщиков, он почти не замедляет выполнение и даёт точную картину “узких мест”.
Идеален для оптимизации тяжёлых вычислений, анализа утечек памяти и ускорения кода.
# Запуск профилировщика прямо из терминала
# Анализ CPU и памяти для скрипта myscript.py
python -m scalene myscript.py
Line │ CPU % │ Memory MB │ Memory %
─────────────────────────────────────────────────────────────
10 │ 75.0% │ 120.5 │ 65.2% total += i ** 0.5
15 │ 20.0% │ 20.0 │ 10.8% data.append(x * 2)
➕ Преимущества:
pip install scalene
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
plumbum — это мощный инструмент для написания системных скриптов на Python. Она позволяет выполнять команды оболочки, управлять путями и удалёнными машинами через SSH — всё в стиле "shell-like" синтаксиса.
Отличная альтернатива bash-скриптам: удобно, кроссплатформенно, с полной силой Python.
from plumbum import local
# Выполнение shell-команды
ls = local['ls']
print(ls('-l'))
# Комбинирование команд как в shell
print((local['ls']['-la'] | local['grep']['py'])())
# Работа с файлами
from plumbum.cmd import cp, rm
cp('a.txt', 'b.txt')
rm('-f', 'b.txt')
# Удалённое выполнение по SSH
from plumbum.machines import SshMachine
with SshMachine('remote.host.com', user='user') as remote:
print(remote['uname']('-a'))
➕ Преимущества:
path
, FG
, run()
, tmux
, rsync
, screen
subprocess
+ os.system
pip install plumbum
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
addict
— это лёгкая библиотека, которая превращает словари в объекты с доступом к полям через точку. Позволяет удобно работать с deeply nested структурами, создавать их "на лету" и избегать лишних проверок наличия ключей.Идеальна для конфигураций, API-ответов, JSON/YAML-данных, когда хочется лаконичный и читаемый код.
from addict import Dict
cfg = Dict()
cfg.server.host = "localhost"
cfg.server.port = 8080
print(cfg)
# ➔ {'server': {'host': 'localhost', 'port': 8080}}
print(cfg.server.host)
# ➔ localhost
# Автоматически создаёт вложенные структуры
cfg.database.user = "admin"
print(cfg.database)
# ➔ {'user': 'admin'}
# Можно легко конвертировать в dict
data = cfg.to_dict()
➕ Преимущества:
obj.key
)pip install addict
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤🔥3🗿1
bidict — это двунаправленный словарь для Python: быстрый поиск как по ключам, так и по значениям, с гарантией уникальности пар и удобным обратным отображением через
.inv
.Идеальна для задач «A ↔️ B»: коды и имена, ID и алиасы, HTTP-статусы и описания.
from bidict import bidict, frozenbidict
# Двунаправленное отображение
colors = bidict({'red': '#f00', 'green': '#0f0', 'blue': '#00f'})
print(colors['red']) # ➔ #f00
print(colors.inv['#0f0']) # ➔ green (обратный вид)
# Добавление пары остается консистентным в обе стороны
colors['yellow'] = '#ff0'
print(colors['yellow'], colors.inv['#ff0']) # ➔ #ff0 yellow
# Попытка дублировать значение — ошибка (сохранение биекции)
try:
colors['scarlet'] = '#f00'
except ValueError as e:
print(e) # ➔ Value already present: '#f00'
# Неизменяемая версия для безопасного шаринга
immutable = frozenbidict({'a': 1, 'b': 2})
# immutable['c'] = 3 # ➔ TypeError
➕ Преимущества:
pip install bidict
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
dacite — это утилита для преобразования словарей (например, JSON) в экземпляры
dataclass
с поддержкой вложенных структур, конвертации типов, значений по умолчанию и хуков для кастомного парсинга.Идеальна для безопасной загрузки конфигов и API-ответов прямо в строго типизированные модели dataclass.
from dataclasses import dataclass
from typing import Optional, List
from datetime import datetime
from dacite import from_dict, Config
@dataclass
class Profile:
created_at: datetime
tags: List[str]
@dataclass
class User:
id: int
name: str
is_active: bool = True
profile: Optional[Profile] = None
raw = {
"id": "42",
"name": "Alice",
"profile": {
"created_at": "2025-08-01T10:00:00Z",
"tags": ["admin", "team"]
}
}
# Хук для преобразования ISO-строки в datetime
cfg = Config(type_hooks={
datetime: lambda s: datetime.fromisoformat(s.replace("Z", "+00:00"))
})
user = from_dict(User, raw, config=cfg)
print(user) # ➔ User(id=42, name='Alice', is_active=True, profile=Profile(...))
print(user.profile.created_at) # ➔ 2025-08-01 10:00:00+00:00
➕ Преимущества:
type_hooks
dataclass
и Optional/Union
полейpip install dacite
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2