Ghostly Python
8.56K subscribers
547 photos
24 videos
617 links
Погружаемся в мир Python: задачи, фишки, библиотеки и террабайты полезного материала.

Сотрудничество: @heywan_n1
менеджер: @shmyzna

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+IOa15XDNbxRkYzNi
Download Telegram
👩‍💻 Викторина: что выведет код?

def make_counter():
count = [0]

def increment():
count[0] += 1
return count[0]

def get():
return count[0]

return increment, get

inc1, get1 = make_counter()
inc2, get2 = make_counter()

inc1()
inc1()
inc2()
inc1()

print(get1(), get2())
print(inc2())
print(get1(), get2())


🐍 Ghostly Python | #викторина
Please open Telegram to view this post
VIEW IN TELEGRAM
💩9😁2🤮1
📱 Фишка: __slots__ — отключаем_slots__ —для экономии памяти

По умолчанию каждый экземпляр Python хранит атрибуты в словаре dict. Это удобно, но съедает много памяти.__ —для экофиксирует набор атрибутов, убираяlots__ —дли� Фишка: __sl

class Report:
— отключае= ('user_id', 'stats') # только эти атрибуты

def __init__(self, user_id):
self.user_id = user_id
self.stats = {} # теперь stats не динамический

r = Report(123)
r.new_attr = 42 # AttributeError!


📌 Как это работает?

— Вместо dict создаются дескрипторы для каждого атрибута из slots.
— Экземпляр хранит значения в компактном массиве, не в хэш-таблице.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👎6🤔6😱1
Не репутация, а мечта

🐍 Ghostly Python | #мем
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15
🖼️ Библиотека: glom

glom — декларативная библиотека для извлечения и трансформации вложенных структур данных (dict/list/tuple). Позволяет описывать «что достать и как преобразовать» короткой спецификацией вместо ручных циклов и if.

ℹ️ Основные возможности:

🟢 Доступ к глубоко вложенным полям без try/except
🟢 Маппинг и агрегирование списков одной строкой
🟢 Значения по умолчанию и безопасные обходы отсутствующих ключей
🟢 Композиция спецификаций для сложных преобразований


⚙️ Пример использования:

from glom import glom, T

data = {
"user": {"name": "Alice", "age": 30, "emails": ["a@x.io", "b@y.io"]},
"orders": [{"id": 1, "total": 99.9}, {"id": 2, "total": 15.0}]
}

spec = {
"username": T["user"]["name"],
"primary_email": T["user"]["emails"][0],
"order_ids": (T["orders"], [T["id"]]),
"sum_total": (T["orders"], sum, [T["total"]]), # суммируем totals
}

print(glom(data, spec))
# ➔ {'username': 'Alice', 'primary_email': 'a@x.io', 'order_ids': [1, 2], 'sum_total': 114.9}

# Безопасный доступ с дефолтом:
print(glom(data, "user.phone", default="no phone")) # ➔ 'no phone'


✔️ Установка:

pip install glom


➡️ Ссылка на документацию

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👩‍💻 Создание MCP‑серверов на FastMCP: 7 ошибок, которых стоит избегать

Автор в статье дает конкретные советы по исправлению каждой проблемы и предупреждает о реальных рисках безопасности (включая известные CVE).

➡️ Ссылка на статью

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📱 Фишка: asyncio.Semaphore — контроль одновременных корутин

Semaphore ограничивает количество корутин, которые могут выполнять определённый блок кода одновременно. Полезно для защиты API от превышения лимитов или для ограничения нагрузки на базу данных.

import asyncio

class ApiClient:
def __init__(self, max_concurrent=3):
self._semaphore = asyncio.Semaphore(max_concurrent)

async def fetch(self, url):
async with self._semaphore:
print(f"Начало запроса к {url}")
await asyncio.sleep(1) # имитация сетевого вызова
print(f"Завершён: {url}")
return {"data": url}

async def main():
client = ApiClient(max_concurrent=2) # максимум 2 запроса одновременно

urls = ["/api/1", "/api/2", "/api/3", "/api/4"]
tasks = [client.fetch(url) for url in urls]
results = await asyncio.gather(*tasks)

print(f"Получено {len(results)} результатов")

asyncio.run(main())


📌 Как это работает?

— При входе в async with счётчик семафора уменьшается на 1.
— Если счётчик 0, корутина ждёт, пока кто-то не выйдет (счётчик не увеличится).
— При выходе из блока счётчик снова увеличивается.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
«Вайб-кодинг» — слово года по версии словаря Collins

(на сленге - безработный 🙂)

🐍 Ghostly Python | #мем
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥41👍1😁1🤣1
🖼️ Библиотека tenacity — умные повторные попытки для ненадёжного кода

Tenacity — это библиотека, которая автоматически перезапускает функцию при ошибке. Идеально для работы с сетевыми запросами, API, базами данных — везде, где код может временно упасть, но потом отработать.

⚙️ Пример использования:

from tenacity import retry, stop_after_attempt
import requests

# Повторить 3 раза при любой ошибке
@retry(stop=stop_after_attempt(3))
def get_data():
return requests.get("https://api.example.com/data").json()

# Использование
data = get_data() # если упадёт — автоматически повторит до 3 раз


✔️ Установка:

pip install tenacity

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
👩‍💻 Автоматизация отдела продаж в Bitrix24

Автор статьи максимально рассказал об автоматизации продаж и квалифицировании лидов в битрикс.

➡️ Ссылка на статью

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
📱 Фишка: asyncio.TaskGroup — надёжное управление группами задач

TaskGroup автоматически следит за всеми запущенными в нём задачами. Если любая задача падает с ошибкой — отменяются все остальные, и вы точно ничего не пропустите. Удобнее и безопаснее, чем ручной gather/wait.

import asyncio

async def worker(name, delay):
print(f"Задача {name} стартует")
await asyncio.sleep(delay)
if name == "fail":
raise ValueError("Ошибка в задаче!")
print(f"Задача {name} завершена")
return f"Результат {name}"

async def main():
try:
async with asyncio.TaskGroup() as tg:
task1 = tg.create_task(worker("A", 1))
task2 = tg.create_task(worker("B", 2))
task3 = tg.create_task(worker("fail", 0.5))
task4 = tg.create_task(worker("C", 1.5))
# сюда мы попадём, только если все задачи успешны
print("Все задачи завершены без ошибок")
except Exception as e:
print(f"Перехвачено исключение: {e}")
# все незавершённые задачи уже отменены автоматически

asyncio.run(main())


📌 Как это работает?

— При входе в async with создаётся группа задач.
— Как только одна задача вызывает исключение — группа немедленно отменяет все остальные.
— После выхода из блока можно быть уверенным: либо все задачи выполнились успешно, либо ни одна «незакрытая» ошибка не осталась незамеченной.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
🔲 Захватывающая драма 21 века

На всякий случай:

yt-dlp --download-sections "*start_time-end_time"
<video_url>


🐍 Ghostly Python | #мем
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31😁1