TGViewer
Реальный Python Реальный Python @python_real · 3.64K subscribers
Post #1032 1.32K
Практичные Python-привычки, которые реально повышают качество кода

1. Явное состояние и мемоизация
Скрытые состояния в замыканиях и декораторах часто приводят к трудноуловимым багам.


from functools import wraps

def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper


Использование @wraps сохраняет имя функции, docstring и метаданные — критично для дебага и интеграции с Flask.

2. Асинхронность для продакшн
Асинхронность часто ухудшает код, если использовать её неправильно.


import asyncio, aiohttp

TOTAL_REQUESTS = 1_000_000
sem = asyncio.Semaphore(1000)

async def fetch(session, url):
async with sem:
try:
async with session.get(url) as resp:
return await resp.text()
except aiohttp.ClientError:
return None

async def main():
urls = [f"https://api.site/{i}" for i in range(TOTAL_REQUESTS)]
async with aiohttp.ClientSession() as session:
for i in range(0, len(urls), 10_000):
chunk = urls[i:i+10_000]
tasks = [fetch(session, url) for url in chunk]
await asyncio.gather(*tasks)


Контроль через Semaphore + чанки предотвращает OOM и блокировки API. Используйте create_task() для управления жизненным циклом корутин.

3. Ошибки и raise
Не ловите всё подряд и используйте новые возможности языка.


# Python 3.11+
user.is_admin or raise PermissionError("Not allowed!")


raise как выражение и except* (Python 3.11) делают обработку ошибок лаконичной и безопасной:


# Python 3.11+
try:
await asyncio.gather(fail1(), fail2())
except* ValueError as ve: # Только ValueError
print(f"ValueErrors: {ve.exceptions}")
except* TypeError as te: # Только TypeError
print(f"TypeErrors: {te.exceptions}")


4. Типизация и валидация

from pydantic import validate_call
from typing import Annotated
from pydantic.types import Gt, Ge, Le

@validate_call
def calculate_discount(
price: Annotated[float, Gt(0)],
discount: Annotated[float, Ge(0), Le(100)]
) -> float:
return price * (1 - discount / 100)


Constraints прямо в аннотациях делают сигнатуры самодокументируемыми и безопасными без дублирования проверок.

5. Ленивая загрузка и кеширование
@cached_property и functools.cache экономят время при дорогих вычислениях.

from functools import cached_property
import time

class UserReport:
def __init__(self, user_id):
self.user_id = user_id
@cached_property
def total_spent(self):
print("Querying database...")
time.sleep(2) # expensive call
return 199.99

r = UserReport(123)
print(r.total_spent) # computed once
print(r.total_spent) # cached instantly
del r.__dict__["total_spent"]
print(r.total_spent) # recomputed after cache reset


Результат хранится в dict объекта, можно сбросить при необходимости. Отлично подходит для API-запросов и конфигураций.

6. Python 3.14+
Новые возможности языка ускоряют работу и упрощают код:

uuid7() — уникальные и сортируемые по времени ключи

ContextVar как контекстный менеджер

t-strings (t"...") для отложенных шаблонов

subTests для granular тестирования


from string.templatelib import Template

def render(template: Template):
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(item.value)
return "".join(parts)

user = "Alice"
role = "admin"
t = t"user: {user} — role: {role}"
s = render(t)


Жалко что не добавили .format() для t -строк

Заключение
Даже небольшие изменения в подходе к разработке дают ощутимый эффект на качество кода и скорость разработки.

👉 @python_real
  • 👍 3
More from @python_real
  1. Sep 22, 2026🔴 Тестовый собес на Middle Python с разработчиком из Яндекса завтра вечером! [+ разбор 50…
  2. Sep 22, 2026📊 Статистика в Python: с чего начать анализ данных Среднее значение может скрыть важную д…
  3. Sep 21, 2026🐍 В Python 3.15 появится frozendict - словарь, который нельзя изменить Это встроенный тип…
  4. Sep 1, 2026🔍Тестовое собеседование на Middle Python с разработчиком из Авито завтра вечером Уже завт…
  5. Sep 1, 2026🐍 Асинхронное программирование в Python: от генераторов до asyncio Почему обычная програм…
  6. Aug 24, 2026🐍 Как использовать Claude Code для разработки и отладки проектов на Python Real Python оп…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →