log_min_duration_statement в конфигурации. Это позволит записывать все запросы, выполняющиеся дольше указанного времени.EXPLAIN или EXPLAIN ANALYZE для просмотра плана выполнения запроса и оценки, где возникают задержки.pg_stat_statements, которое собирает информацию о времени выполнения и частоте запросов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥3
[async] with <функция> as <переменная>:
# до и после гарантированно срабатывают события входа в блок with и выхода из него.
__exit__ срабатывает в момент выхода из блока, в том числе по причине возникновения исключения. В этом случае в метод будут переданы exc_class, exc_instance и traceback.with open('file.txt') as f:
data = f.read()
process_data(data)Файл гарантированно закроется.
class Printable:
def __enter__(self):
print('enter')
def __exit__(self, type, value, traceback):
print('exit')
from contextlib import contextmanager
@contextmanager
def printable():
print('enter')
try:
yield
finally:
print('exit')
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🥰2🔥1🤔1
- Полнотекстовый поиск: Elasticsearch предоставляет мощные инструменты для полнотекстового поиска, что позволяет быстро находить данные в больших объемах текста.
- Агрегация данных: Elasticsearch позволяет агрегировать данные, что полезно для аналитики и создания дашбордов.
- Машинное обучение: Elasticsearch поддерживает машинное обучение, что позволяет автоматически обнаруживать аномалии и тенденции в данных.
- Распределенная архитектура: Elasticsearch является распределенной системой, что позволяет масштабировать поиск и анализ данных.
from elasticsearch import Elasticsearch
# Создание клиента Elasticsearch
es = Elasticsearch()
# Создание индекса
index_name = 'my_index'
es.indices.create(index=index_name)
# Агрегация данных
res = es.search(index=index_name, body={
'aggs': {
'author_count': {
'terms': {'field': 'author.keyword'}
}
}
})
print(res['aggregations'])
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3⚡2🔥1
Если операция случайно выполнится несколько раз (например, из-за сбоя в сети), идемпотентность гарантирует, что это не повлияет на итоговое состояние.
Позволяет избежать непреднамеренного добавления данных или повторного применения изменений.
Работа с HTTP:
1. GET — идемпотентен
GET /users/1
2. PUT — идемпотентен
PUT /users/1
{
"name": "Alice"
}
3. POST — не идемпотентен
POST /users
{
"name": "Alice"
}
Идемпотентный:
DELETE FROM users WHERE id = 5;
Не идемпотентный:
INSERT INTO users (name) VALUES ('Alice');Идемпотентность = безопасное повторное выполнение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3⚡3🔥2
- Сильные ссылки в замыканиях или глобальных структурах.
- Циклические ссылки (например, два объекта ссылаются друг на друга).
- Использование списков/словарей как кэшей без ограничения размера.
- Неочищенные обработчики событий, соединения или файлы.
- Использовать weakref для слабых ссылок.
- Очищать ненужные переменные (del, clear()).
- Контролировать размер кэшей.
- Проверять утечки с помощью инструментов вроде objgraph, gc, tracemalloc.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4⚡2🔥2
- Поверхностное копирование создает новый объект и сохраняет ссылки на вложенные объекты. Подходит для копирования объектов с иммутабельными вложенными элементами.
- Глубокое копирование создает полностью независимую копию объекта с вложенными элементами. Полезно при необходимости полностью отделить копию от оригинала.
import copy
original = [1, [2, 3], 4]
shallow_copied = copy.copy(original)
deep_copied = copy.deepcopy(original)
original[1][0] = 'изменено'
print(original) # [1, ['изменено', 3], 4]
print(shallow_copied) # [1, ['изменено', 3], 4] — вложенный список изменился
print(deep_copied) # [1, [2, 3], 4] — сохранено исходное состояние
Зная эту разницу при работе со сложными структурами данных, можно избежать неожиданного поведения. Но не забывайте, что глубокое копирование может быть более ресурсоемким.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3⚡2🔥1
А ведь он нужен там, где что бы ни случилось — надо прибраться:
1. Закрытие файлов / соединений:
f = open("data.txt")
try:
process(f)
finally:
f.close() # всегда выполнится2. Откат транзакций:
try:
db.begin()
db.do_stuff()
finally:
db.rollback_or_commit()
3. Остановка фоновых задач:
try:
start_worker()
finally:
stop_worker()
Это твоя гарантированная уборка.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍4⚡2
import secrets
# Хранение паролей
password_storage = {}
# Функция для создания и хранения хэша пароля
def store_password(username, password):
# Генерация случайного токена
token = secrets.token_hex(16)
password_storage[username] = {'token': token, 'password': password}
# Проверка пароля
def verify_password(username, provided_password):
if username in password_storage:
stored_password = password_storage[username]['password']
# Сравнение паролей с использованием secrets.compare_digest
return secrets.compare_digest(stored_password, provided_password)
return False
# Использование
store_password("user1", "my_secure_password")
# Проверка входящего пароля
if verify_password("user1", "my_secure_password"):
print("Пароль верный!")
else:
print("Неверный пароль.")
- Библиотека
secrets используется для генерации криптографически стойкого токена, который можно хранить, но в этом примере основной акцент сделан на безопасном сравнении паролей.- Функция
compare_digest сравнивает пароли безопасным способом, защищая от тайминговых атак.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍7⚡2🔥2
Во многих языках (
- Читаемость — код без лишних
- Принудительная структурность — нельзя "забыть закрыть скобку".
- Исторический фактор — Гвидо ван Россум вдохновлялся языком ABC.
➡️ Пример кода на Python:
➡️ Тот же код на C:
🐍 Pythoner
C, Java, JavaScript) блоки кода обозначаются {}. В Python же используются отступы. Почему так?- Читаемость — код без лишних
{} и end выглядит чище.- Принудительная структурность — нельзя "забыть закрыть скобку".
- Исторический фактор — Гвидо ван Россум вдохновлялся языком ABC.
for i in range(3):
print(i) # Отступ обязателен
for (int i = 0; i < 3; i++) {
printf("%d\n", i);
}Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤4👍4
🤔6🤷♀5❤2🤨1
sorted("Python") → ['P', 'h', 'n', 'o', 't', 'y'].
[::-1] переворачивает список → ['y', 't', 'o', 'n', 'h', 'P'].
[0] возвращает первый элемент → "y".
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥7👀2👍1
- Подготовка базы данных: Создание таблиц, миграции.
- Инициализация соединений: Подключение к Redis, Kafka.
- Очистка ресурсов: Закрытие соединений, удаление временных файлов.
Декоратор @ asynccontextmanager создает асинхронный контекстный менеджер. Функция lifespan определяет, какой код выполняется до и после запуска приложения.
from contextlib import asynccontextmanager
from fastapi import FastAPI
# (Предположим, у вас есть функции create_db и close_db)
async def create_db():
print("Подключаемся к базе данных...")
# Здесь будет код подключения к БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("База данных подключена!")
async def close_db():
print("Закрываем соединение с базой данных...")
# Здесь будет код закрытия соединения с БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("Соединение с базой данных закрыто!")
@asynccontextmanager
async def lifespan(app: FastAPI):
print("Запуск приложения...")
await create_db()
yield
print("Завершение приложения...")
await close_db()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
return {"message": "Hello World"}
# Запуск: uvicorn main:app --reload
- При запуске FastAPI (uvicorn main:app --reload) выполнится код до yield (создание таблиц).
- При остановке FastAPI выполнится код после yield (удаление таблиц).
lifespan + @ asynccontextmanager - это чистый и эффективный способ управлять ресурсами вашего FastAPI приложения!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3⚡2🔥1
a = 1000
b = 1000
print(a is b) # False
Даже если
a == b, a is b может вернуть False, потому что это разные объекты. Python кэширует только небольшие числа и короткие строки.if value is "test": # ❌
Правильно:
if value == "test": # ✅
is уместен?Только для сравнения с singleton'ами, такими как:
if x is None:
...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4⚡4🔥2
{key: value for item in iterable}numbers = [1, 2, 3, 4]
squared = {x: x**2 for x in numbers}
print(squared) # {1: 1, 2: 4, 3: 9, 4: 16}
original = {"a": 10, "b": 20, "c": 30}
filtered = {k: v for k, v in original.items() if v > 15}
print(filtered) # {'b': 20, 'c': 30}text = "hello"
char_count = {char: text.count(char) for char in set(text)}
print(char_count) # {'o': 1, 'l': 2, 'e': 1, 'h': 1}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7⚡2🔥2🤬1
- Автоматическое управление ресурсами: Контекстные менеджеры автоматически управляют ресурсами, что позволяет избежать утечек и ошибок.
- Поддержка различных ресурсов: Контекстные менеджеры могут использоваться для управления различными ресурсами, такими как файлы, сетевые соединения, базы данных и другие.
- Создание собственных контекстных менеджеров: Вы можете создавать свои собственные контекстные менеджеры, используя протокол контекстных менеджеров.
1. Создание контекстного менеджера с помощью класса:
class MyResource:
def __enter__(self):
print("Resource opened")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Resource closed")
# Использование контекстного менеджера
with MyResource() as resource:
print("Inside with block")
2. Работа с сетевыми соединениями:
import socket
class SocketManager:
def __init__(self, host, port):
self.host = host
self.port = port
self.socket = None
def __enter__(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
return self.socket
def __exit__(self, exc_type, exc_val, exc_tb):
self.socket.close()
# Использование контекстного менеджера
with SocketManager('example.com', 80) as sock:
sock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = sock.recv(4096)
print(response.decode())
Context Manager в Python удобен и надежен для работы с ресурсами, так как гарантирует их корректное освобождение и упрощает работу с ними.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3⚡2🔥1
Функция должна возвращать
True или False для каждого элемента, и filter() вернет только те элементы, для которых функция вернула True.filter(function, iterable)
- function: Функция, которая проверяет каждый элемент. Если None, то возвращаются все элементы, которые являются истинными (truthy).
- iterable: Итерируемый объект, который нужно фильтровать.
# Функция, которая проверяет, является ли число четным
def is_even(n):
return n % 2 == 0
# Исходный список
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Фильтрация четных чисел
even_numbers = filter(is_even, numbers)
# Преобразуем результат в список и выводим
even_numbers_list = list(even_numbers)
print(even_numbers_list) # Вывод: [2, 4, 6, 8, 10]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5🔥3⚡2
1. Strawberry:
На базе dataclass + type hints = лаконично и читаемо.
@strawberry.type
class User:
name: str
@strawberry.type
class Query:
@strawberry.field
def hello(self) -> str:
return "Привет!"
schema = strawberry.Schema(Query)
Работает с FastAPI и ASGI
2.Ariadne:
GraphQL-схема через SDL (как в JS/GraphQL-ecosystem). Гибкость + контроль:
type_defs = """
type Query {
hello: String!
}
"""
@query.field("hello")
def resolve_hello(_, info):
return "Привет из Ariadne"
Легко интегрируется с Starlette / FastAPI, поддерживает subscriptions
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7⚡3👍3🔥1
SQL (Structured Query Language) - это язык программирования, который используется для управления реляционными базами данных. SQL базы данных используют таблицы для хранения информации, а каждая таблица состоит из строк и столбцов. SQL базы данных поддерживают транзакции, что обеспечивает целостность данных. Они также легко масштабируются, что позволяет управлять большими объемами данных.
NoSQL (Not Only SQL) базы данных - это новый тип баз данных, который не использует традиционные таблицы для хранения информации. Вместо этого, они используют документы, ключи и значения, графы или колоночные семейства. NoSQL базы данных были созданы для управления большими объемами данные с высокой скоростью и производительностью. Они также легко масштабируются, что делает их отличным выбором для приложений, которые необходимо расширять.
Основное различие между SQL и NoSQL базами данных заключается в том, как они хранят и управляют данными. SQL базы данных используют таблицы, которые связаны друг с другом по ключам внешних таблиц. NoSQL базы данных используют документы, ключи и значения, графы или колоночные семейства, которые могут хранить неструктурированные данные. SQL базы данных имеют строгую схему, что означает, что каждый элемент данных должен соответствовать заданной схеме. NoSQL базы данных, с другой стороны, не имеют строгой схемы, что позволяет добавлять данные без необходимости изменения схемы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥4👍3