В этой статье узнаем как написать CI/CD для сборки Docker-образа и деплоя проекта, а также, как получить бесплатно Portainer BE.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1
Mouse Vs Python — это личный блог Майкла Драммонда, который более 10 лет публикует статьи о Python. Здесь можно найти гайды по стандартной библиотеке, обзоры полезных библиотек и советы по “питоничному” коду.
Please open Telegram to view this post
VIEW IN TELEGRAM
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, чтобы ограничить количество повторенийPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1
Расскажу, как растянуть трюк с XOR до миллиардов строк: собираю обратимый фильтр Блума, ищу тысячи пропавших ID, считаю память, бьюсь с коллизиями и показываю минимальный код. Без магии
Please open Telegram to view this post
VIEW IN TELEGRAM
Модуль
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 из файлаPlease open Telegram to view this post
VIEW IN TELEGRAM
❤6
Что произойдёт, если переопределить метод __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
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁26
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
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Прогнал домофонный архив через dlib/face_recognition на GPU: мерил скорость, собирал капризное окружение, чинил драйверы; делюсь выводами. Код на GitHub.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🤯1
PyMOTW — это серия статей с практическими примерами по модулям стандартной библиотеки: от itertools, collections и functools до asyncio, pathlib и contextlib.
Материал подан в формате «что делает модуль, когда применять и какие есть подводные камни» — с короткими, рабочими примерами.
Please open Telegram to view this post
VIEW IN TELEGRAM
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() — статистика хитов/промахов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
В статье рассказывается о создании стратегии для позиционной торговли. Показан опыт разработки инструмента для проверки торговых идей.
Описывается реализация стратегии, основанной на принципе «моментума» (когда растущие акции продолжают расти), и её улучшение с помощью оптимизации параметров.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2❤1
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() — удобные операции с файламиPlease open Telegram to view this post
VIEW IN TELEGRAM
❤2
Почему этот код печатает [2, 2, 2], а не [0, 1, 2]?
Пример
# Неверно: late binding захватывает ИМЯ переменной i
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs]) # ➔ [2, 2, 2]
# Верно: захватить ТЕКУЩЕЕ значение через аргумент по умолчанию
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs]) # ➔ [0, 1, 2]
Ответ
Лямбды/замыкания в Python делают позднее связывание (late binding): они запоминают не значение i, а имя. Когда вызов происходит, цикл уже завершён, и i == 2 для всех функций. Передача i как аргумента по умолчанию фиксирует значение в момент создания функции.
🟢 Запомнить:
В замыканиях значения берите через lambda i=i: ... или functools.partial(...).
Та же ловушка есть в comprehensions и циклах с замыканиями.
Проверяйте такие конструкции тестом — легко промахнуться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Покажу PEP 723+uv: зависимости в комментариях, раннер сам ставит и запускает. Примеры, плюсы и грабли, отдельно — про риски безопасности. Без README-плясок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Tenacity — гибкая библиотека для ретраев (повторных попыток) с поддержкой экспоненциального бэкоффа, фильтрации по исключениям/результатам и асинхронных функций. Полезна для сетевых запросов, нестабильных API и flaky-тестов.
🟢 Декларативные ретраи через декоратор @retry🟢 Стратегии ожидания: фиксированная, экспоненциальная, джиттер, лимиты🟢 Условия повтора по типам исключений или значениям результата🟢 Хуки before/after и поддержка async def
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests
@retry(
stop=stop_after_attempt(5), # максимум 5 попыток
wait=wait_exponential(multiplier=0.5, max=8), # экспоненциальный бэкофф
retry=retry_if_exception_type((
requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
)),
reraise=True # пробросить последнее исключение
)
def fetch_json(url: str) -> dict:
resp = requests.get(url, timeout=2)
resp.raise_for_status()
return resp.json()
data = fetch_json("https://httpbin.org/json")
print(data["slideshow"]["title"])
pip install tenacity
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1