Рассказываю, как кеширование в Django Ninja помогает выдерживать рост нагрузки без боли и апгрейда железа. Один и тот же ответ — не значит один и тот же расчёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
Контекстные менеджеры — мощный механизм Python для безопасного и автоматического управления ресурсами: файлами, сетевыми соединениями, блокировками и т.д.
# Классический with для работы с файлами
with open("example.txt", "w") as f:
f.write("Hello, world!")
# Свой контекстный менеджер через декоратор
from contextlib import contextmanager
@contextmanager
def custom_context():
print("Вход в контекст")
yield
print("Выход из контекста")
with custom_context():
print("Работаем внутри")
# Класс-контекст для измерения времени
class Timer:
def __enter__(self):
from time import perf_counter
self.start = perf_counter()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
from time import perf_counter
print(f"Заняло времени: {perf_counter() - self.start:.4f} секунд")
with Timer():
sum(i * i for i in range(10_000_000))
with гарантирует вызов __enter__ при входе и __exit__ при выходеcontextlib.contextmanager — простой способ обернуть логику до и после yieldPlease open Telegram to view this post
VIEW IN TELEGRAM
👍9
Что происходит, если переопределить __eq__ без __hash__ в Python?
Пример
class Person:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return isinstance(other, Person) and self.name == other.name
p1 = Person("Alice")
p2 = Person("Alice")
print(p1 == p2) # ➔ True
print(set([p1, p2])) # ➔ TypeError: unhashable type: 'Person'
Ответ
Если в классе вы переопределяете метод __eq__, но не определяете __hash__, то объект становится нехэшируемым, и его нельзя использовать, например, в set или в качестве ключа dict.
🔧 Почему так:
Python требует, чтобы если a == b, то hash(a) == hash(b). Поэтому, когда вы задаёте своё поведение __eq__, Python автоматически сбрасывает __hash__ в None.
Это делается во избежание несогласованного поведения в хэш-таблицах.
✅ Как исправить:
class Person:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return isinstance(other, Person) andself.name == other.name
def __hash__(self):
return hash(self.name )
🟢 Когда использовать:
— Когда объекты должны быть сравнимы по значению, но также использоваться как ключи в словарях, множествах и других структурах, зависящих от хэширования.
❗️Нарушение этого правила может привести к неожиданным ошибкам и багам, особенно в больших кодовых базах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1👏1
Рассказываю, как наш AI-бот внезапно стал утечкой и зачем всё-таки стоит ставить защиту до запуска. Быстро, по делу и с примерами, как не повторить нашу 2-часа-ночи-паника-в-Telegram ситуацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
SymPy — это мощная библиотека для символьных вычислений на Python.
🟢 Упрощение алгебраических выражений и работа с формулами🟢 Дифференцирование, интегрирование и пределы🟢 Решение уравнений и систем уравнений🟢 Поддержка матриц, полиномов, рядов, уравнений с модулями и др.🟢 Преобразование выражений в LaTeX и код других языков (C, Fortran)
from sympy import symbols, simplify, diff, solve, Eq
x = symbols('x')
expr = (x**2 + 2*x + 1) / (x + 1)
# Упрощение выражения
print(simplify(expr)) # ➔ x + 1
# Дифференцирование
print(diff(expr, x)) # ➔ производная по x
# Решение уравнения
eq = Eq(x**2 - 4, 0)
print(solve(eq)) # ➔ [-2, 2]
pip install sympy
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Python Tips — это онлайн-книга, собравшая десятки полезных приёмов и рекомендаций по Python: от простых до продвинутых. Автор делает упор на idiomatic Python — читаемый, лаконичный и эффективный код.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Покажу, как One Pixel атака рушит работу CV-моделей и разберу, какие архитектурные решения делают сети уязвимыми или устойчивыми к таким трюкам. Это не магия, а инженерные детали.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Counter из модуля collections — это удобный инструмент для подсчёта количества элементов в последовательностях. Работает как словарь, где ключи — элементы, а значения — их количество.from collections import Counter
# Подсчёт частоты символов
text = "abracadabra"
counter = Counter(text)
print(counter) # ➔ Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
# Наиболее частые элементы
print(counter.most_common(2)) # ➔ [('a', 5), ('b', 2)]
# Подсчёт слов в списке
words = ["python", "java", "python", "c++", "python", "java"]
word_counter = Counter(words)
print(word_counter) # ➔ Counter({'python': 3, 'java': 2, 'c++': 1})
Counter создаёт словарь с элементами и их количеством.most_common(n) возвращает n самых популярных элементов.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Модуль
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() задаёт уровень, формат и место сохранения логов.handlers. Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Перепилил рекомендации с PHP‑монолита на микросервисы с 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]
🟢 Когда важно помнить:
— При использовании списков, словарей, множеств как аргументов по умолчанию.
— Чтобы избежать неожиданных накоплений данных между вызовами.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
В этой статье узнаем как написать 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