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

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

Цены: @heywan_media

Реклама на бирже: https://telega.in/c/+IOa15XDNbxRkYzNi
Download Telegram
👩‍💻 Логирование в Python с помощью logging

Модуль logging — стандартный инструмент Python для записи логов. Он позволяет выводить сообщения разных уровней (debug, info, warning, error, critical) в консоль, файлы или другие хранилища.

⚙️ Пример: базовая настройка и логирование в файл

import logging  

# Базовая конфигурация логирования
logging.basicConfig(
level=logging.DEBUG, # Минимальный уровень логов
format="%(asctime)s - %(levelname)s - %(message)s", # Формат сообщений
filename="app.log", # Логируем в файл
filemode="w" # Перезаписываем файл при каждом запуске
)

# Примеры логов разных уровней
logging.debug("Отладочное сообщение")
logging.info("Информационное сообщение")
logging.warning("Предупреждение")
logging.error("Ошибка")
logging.critical("Критическая ошибка")


💬 Как это работает:

🟢 basicConfig() задаёт уровень, формат и место сохранения логов.
🟢 Уровни: DEBUG < INFO < WARNING < ERROR < CRITICAL.
🟢 Можно писать логи в разные файлы, консоль или базы данных через handlers.

🐍 Ghostly Python | #гайды
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 Рефакторинг системы рекомендаций: как мы перешли с монолита на микросервисы

Перепилил рекомендации с PHP‑монолита на микросервисы с Python. Рассказываю, как разрулили хаос зависимостей, разделили зоны ответственности и получили масштабируемую систему.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Вопрос с собеса

Что произойдёт, если изменить mutable-объект, который используется как значение по умолчанию в аргументе функции?

Пример🔽
def add_item(item, items=[]):
items.append(item)
return items

print(add_item(1)) # ➔ [1]
print(add_item(2)) # ➔ [1, 2]
print(add_item(3)) # ➔ [1, 2, 3]


Ответ🔽
В Python значения по умолчанию вычисляются один раз при определении функции, а не при каждом её вызове.
Если это изменяемый объект (например, список или словарь), изменения будут сохраняться между вызовами функции.

Как исправить: использовать None и инициализировать объект внутри функции.

python
Копировать
Редактировать
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items

print(add_item(1)) # ➔ [1]
print(add_item(2)) # ➔ [2]
🟢 Когда важно помнить:
— При использовании списков, словарей, множеств как аргументов по умолчанию.
— Чтобы избежать неожиданных накоплений данных между вызовами.


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13
🖼️ Библиотека: Rich

Rich — это современная библиотека для красивого и функционального вывода в терминал на Python.

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

🟢 Цветной и стилизованный текст (поддержка ANSI-цветов)
🟢 Таблицы, прогресс-бары, markdown, дерево файлов
🟢 Подсветка синтаксиса кода прямо в терминале
🟢 Логирование с цветами и форматированием
🟢 Поддержка эмодзи и адаптация под размеры терминала


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

from rich.console import Console
from rich.table import Table

console = Console()

# Цветной текст
console.print("[bold green]Успех![/bold green] [yellow]Предупреждение[/yellow]")

# Таблица
table = Table(title="Рейтинг")
table.add_column("Имя", style="cyan")
table.add_column("Очки", style="magenta")

table.add_row("Алиса", "1500")
table.add_row("Боб", "1200")

console.print(table)


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

pip install rich


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

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
👩‍💻 Применение Portainer в CI/CD процессах

В этой статье узнаем как написать CI/CD для сборки Docker-образа и деплоя проекта, а также, как получить бесплатно Portainer BE.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
➡️ Mouse Vs Python — блог с полезными материалами и примерами по Python

Mouse Vs Python — это личный блог Майкла Драммонда, который более 10 лет публикует статьи о Python. Здесь можно найти гайды по стандартной библиотеке, обзоры полезных библиотек и советы по “питоничному” коду.

⛓️ Ссылка на ресурс

🐍 Ghostly Python | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22👍4💯1
📱 Фишка: itertools.cycle —

cycle из модуля itertools позволяет зациклить любую последовательность, повторяя её элементы бесконечно. Полезно для создания повторяющихся шаблонов, циклических счётчиков и генераторов данных.

import itertools

colors = ["red", "green", "blue"]

# Бесконечно повторяем список
for i, color in zip(range(10), itertools.cycle(colors)):
print(i, color)

# ➔ 0 red
# ➔ 1 green
# ➔ 2 blue
# ➔ 3 red
# ➔ ...


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

🟢 itertools.cycle(iterable) создаёт итератор, который повторяет элементы без конца
🟢 Можно комбинировать с zip или islice, чтобы ограничить количество повторений
🟢 Подходит для бесконечных анимаций, чередования задач и тестирован.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
👩‍💻 Блум на стероидах: XOR ищет пропавших

Расскажу, как растянуть трюк с XOR до миллиардов строк: собираю обратимый фильтр Блума, ищу тысячи пропавших ID, считаю память, бьюсь с коллизиями и показываю минимальный код. Без магии

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Чтение и запись JSON в Python с помощью json

Модуль json из стандартной библиотеки позволяет легко работать с JSON — популярным форматом обмена данными между сервисами и приложениями.

⚙️ Пример: базовая настройка и логирование в файл

import json  

# Пример данных
data = {
"name": "Alice",
"age": 30,
"skills": ["Python", "SQL"]
}

# Запись в JSON-строку
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)

# Запись в файл
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)

# Чтение из файла
with open("data.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)

print(loaded_data)


💬 Как это работает:

🟢 json.dumps() — преобразует объект Python в JSON-строку.
🟢 json.dump() — записывает объект прямо в файл.
🟢 json.loads() — читает JSON-строку и превращает её в объект Python.
🟢 json.load() — читает JSON из файла

🐍 Ghostly Python | #гайды
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17🤯5👻2👨‍💻1
Вопрос с собеса

Что произойдёт, если переопределить метод __bool__ у объекта в Python?

Пример🔽
class Weird:
def __init__(self, value):
self.value = value

def __bool__(self):
return self.value % 2 == 0 # True, только если число чётное

obj1 = Weird(2)
obj2 = Weird(3)

print(bool(obj1)) # ➔ True
print(bool(obj2)) # ➔ False


Ответ🔽
Метод __bool__ управляет тем, как объект ведёт себя в булевом контексте (if, while, bool()).
По умолчанию, если __bool__ не определён, Python пытается вызвать __len__: объект считается True, если его длина > 0.
Если нет ни __bool__, ни __len__, объект всегда будет True.

Когда использовать:
— Для кастомных структур данных, где важно задать собственные правила "пустоты" или "валидности".
— Для удобной проверки состояния объекта (if stack: ..., if db_connection: ...).

❗️Важно: __bool__ должен возвращать именно True или False, иначе Python выбросит TypeError


🐍 Ghostly Python | #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🖼️ Библиотека: Pendulum

Pendulum — это улучшенная альтернатива стандартному модулю datetime в Python. Она делает работу с датами и временем проще, удобнее и безопаснее.

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

🟢 Простое создание и парсинг дат/времени
🟢 Поддержка временных зон "из коробки"
🟢 Удобная работа с периодами и интервалами (разница дат)
🟢 Форматирование дат в ISO 8601 и человеко-читаемый вид
🟢 Совместимость с datetime


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

import pendulum  

# Создание даты
dt = pendulum.datetime(2025, 5, 17, tz="Europe/Moscow")
print(dt) # ➔ 2025-05-17T00:00:00+03:00

# Парсинг строки
parsed = pendulum.parse("2025-08-16T14:30:00Z")
print(parsed.in_timezone("Europe/Moscow"))

# Разница дат
start = pendulum.date(2025, 1, 1)
end = pendulum.date(2025, 8, 16)
print(end.diff(start).in_days()) # ➔ 227

# Человекочитаемый формат
print(end.diff_for_humans(start)) # ➔ "7 months after"


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

pip install pendulum


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

🐍 Ghostly Python | #библиотеки
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
👩‍💻 Анализ лиц с домофона: как я победил несовместимости и собрал dlib+CUDA на Ubuntu — готовый скрипт

Прогнал домофонный архив через dlib/face_recognition на GPU: мерил скорость, собирал капризное окружение, чинил драйверы; делюсь выводами. Код на GitHub.

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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤯1
➡️ Python Module of the Week — глубокие разборы стандартной библиотеки Python

PyMOTW — это серия статей с практическими примерами по модулям стандартной библиотеки: от itertools, collections и functools до asyncio, pathlib и contextlib.

Материал подан в формате «что делает модуль, когда применять и какие есть подводные камни» — с короткими, рабочими примерами.


⛓️ Ссылка на ресурс

🐍 Ghostly Python | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁3
📱 Фишка: functools.lru_cache — мемоизация в одну строку

lru_cache кэширует результаты функции по её аргументам, резко ускоряя повторные вызовы. Идеально для рекурсий, дорогостоящих вычислений и запросов, которые часто повторяются с одинаковыми параметрами.

from functools import lru_cache
from time import perf_counter

@lru_cache(maxsize=256) # LRU-кэш на 256 последних комбинаций аргументов
def fib(n: int) -> int:
if n < 2:
return n
return fib(n - 1) + fib(n - 2)

t0 = perf_counter(); print(fib(35)); t1 = perf_counter() - t0
t0 = perf_counter(); print(fib(35)); t2 = perf_counter() - t0
print(f"Первый вызов: {t1:.4f} c, повторный: {t2:.6f} c") # второй практически мгновенный


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

🟢 @lru_cache(maxsize=N) запоминает результаты по хэшируемым аргументам и автоматически очищает старые записи (LRU).
🟢 maxsize=None — безлимитный кэш; func.cache_clear() — сброс; func.cache_info() — статистика хитов/промахов.
🟢 Работает только с хэшируемыми аргументами (числа, строки, кортежи и т.п.); для неизменяемых структур данных — идеально.

🐍 Ghostly Python | #фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
👩‍💻 Позиционный трейдинг + ML: от нуля до торговой стратегии за год

В статье рассказывается о создании стратегии для позиционной торговли. Показан опыт разработки инструмента для проверки торговых идей.

Описывается реализация стратегии, основанной на принципе «моментума» (когда растущие акции продолжают расти), и её улучшение с помощью оптимизации параметров.


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

🐍 Ghostly Python | #статьи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔21
👩‍💻 Работа с файловой системой на Python с помощью pathlib

pathlib — современный и удобный способ работать с путями, файлами и директориями кроссплатформенно. Заменяет os.path и делает код короче и понятнее.

⚙️ Пример: создание папки, запись/чтение файла, поиск по маске, переименование и удаление

from pathlib import Path

# Базовая директория проекта
base = Path.cwd()

# Создаём папку data (если нет)
data_dir = base / "data"
data_dir.mkdir(parents=True, exist_ok=True)

# Путь к файлу
file = data_dir / "notes.txt"

# Запись текста в файл (перезапишет если существует)
file.write_text("Привет, pathlib!\n", encoding="utf-8")

# Дозапись строки
with file.open("a", encoding="utf-8") as f:
f.write("Ещё одна строка.\n")

# Чтение всего содержимого
content = file.read_text(encoding="utf-8")
print("Содержимое файла:\n", content)

# Перебор всех .txt в папке
for p in data_dir.glob("*.txt"):
print("Файл:", p.name, "| размер:", p.stat().st_size, "байт")

# Переименование файла
archived = file.with_name("notes-archived.txt")
file.rename(archived)

# Удаление файла (раскомментируйте при необходимости)
# archived.unlink()


💬 Как это работает:

🟢 Path — объектный путь; оператор / соединяет сегменты путей.
🟢 mkdir(parents=True, exist_ok=True) создаёт дерево директорий безопасно.
🟢 write_text() / read_text() — быстрые шорткаты для записи/чтения.
🟢 open("a") — дозапись без перезаписи.
🟢 glob("*.txt") и rglob("**/*.txt") — поиск по маске (включая рекурсивно).
🟢 with_name(), rename(), unlink() — удобные операции с файлами

🐍 Ghostly Python | #гайды
Please open Telegram to view this post
VIEW IN TELEGRAM
2