FAQ Портал
Категории
Поиск
О нас
Контакты
UK
RU
EN
Главная
Технологии
Программирование
Python
Python
100 вопросов
Как создать виртуальное окружение?
•
python -m venv venv.
•
Активация Windows: venv\Scripts\activate.
•
Linux/Mac: source venv/bin/activate.
•
Деактивация: deactivate.
•
pip install package.
Чем отличаются списки, кортежи, множества?
•
Список list — изменяемый: [1,2,3].
•
Кортеж tuple — неизменяемый: (1,2,3).
•
Множество set — без дубликатов: {1,2,3}.
•
Словарь dict — ключ-значение.
•
Кортежи хешируемы.
Что такое декораторы?
•
Функция, модифицирующая другую функцию.
•
@decorator над определением.
•
def log(f): def wrapper(*a): return f(*a); return wrapper.
•
functools.wraps сохраняет имя/докстринг.
•
Примеры: @property, @staticmethod.
Как работать с файлами?
•
with open('file.txt', 'r', encoding='utf-8') as f:.
•
f.read() или for line in f:.
•
Режимы: r, w, a, rb.
•
with автоматически закрывает файл.
•
pathlib.Path — современный подход.
Что такое генераторы?
•
Функция с yield.
•
Возвращает итератор.
•
Ленивое вычисление (экономит память).
•
next(gen) — получить следующий элемент.
•
Генераторное выражение: (x*2 for x in range(10)).
Как установить Python и проверить, что он работает?
•
Скачай с python.org или поставь через пакетный менеджер.
•
Проверь: python --version (или python3 --version).
•
Проверь pip: python -m pip --version.
•
Обнови pip: python -m pip install -U pip.
•
Запусти REPL: python.
Чем отличаются python и python3 в Linux?
•
В некоторых дистрибутивах python = Python 2 (исторически) или отсутствует.
•
python3 всегда указывает на Python
3.
•
Для скриптов лучше использовать shebang: #!/usr/bin/env python3.
•
pip/pip3 аналогично.
•
Виртуальные окружения решают конфликт версий.
Как правильно ставить зависимости в проект?
•
Создай venv.
•
Ставь пакеты через python -m pip install ....
•
Зафиксируй зависимости: pip freeze > requirements.txt.
•
На другом ПК: pip install -r requirements.txt.
•
Для больших проектов рассмотри Poetry/uv.
Что такое PEP 8 и зачем он нужен?
•
PEP 8 — стиль кода Python.
•
Делает код читаемым и единым в команде.
•
Отступы: 4 пробела.
•
Имена: snake_case для функций/переменных, PascalCase для классов.
•
Автоформаттер: black, линтер: ruff.
Как работает импорт модулей (import) в Python?
•
import ищет модуль в sys.path.
•
Локальная папка проекта обычно в начале sys.path.
•
Файл __init__.py делает папку пакетом (в старых версиях обязательно).
•
Относительные импорты: from .sub import x.
•
Избегай циклических импортов.
Чем отличается shallow copy от deep copy?
•
Shallow copy копирует только верхний уровень контейнера.
•
Вложенные объекты остаются общими.
•
Deep copy рекурсивно копирует всё.
•
Shallow: list.copy(), copy.copy().
•
Deep: copy.deepcopy() (может быть дорогим).
Когда использовать list, а когда tuple?
•
list — если нужно менять содержимое.
•
tuple — если данные должны быть неизменяемыми.
•
tuple можно использовать как ключ dict (если элементы хешируемы).
•
tuple обычно чуть компактнее.
•
Для возвращаемых “пакетов” значений tuple удобен.
Как устроены словари dict и какие операции быстрые?
•
dict — хеш-таблица.
•
Доступ/вставка/удаление по ключу обычно O(1).
•
Ключ должен быть хешируемым (immutable).
•
Порядок вставки сохраняется (Python 3.7+ гарантировано).
•
Для подсчёта используй collections.Counter.
Как красиво формировать строки (f-string)?
•
f'Привет, {name}'.
•
Формат: f'{value:.2f}' для float.
•
Даты: f'{dt:%Y-%m-%d}'.
•
Ширина: f'{n:>10}'.
•
Для отладки: f'{var=}' (3.8+).
Как работает распаковка *args и **kwargs?
•
*args — позиционные аргументы в кортеж.
•
**kwargs — именованные аргументы в dict.
•
Можно проксировать вызов: f(*args, **kwargs).
•
Распаковка коллекций: [*a, *b].
•
Распаковка dict: {**d1, **d2}.
Что такое list comprehension и когда его использовать?
•
Короткий синтаксис создания списка.
•
Пример: [x*x for x in range(
•
if x % 2 == 0].
•
Читается лучше, чем ручной цикл (если выражение простое).
•
Для генератора используй (...).
•
Для вложенных циклов — аккуратно, не усложняй.
Чем отличается generator expression от list comprehension?
•
List comprehension создаёт список сразу.
•
Generator expression создаёт элементы лениво.
•
Генератор экономит память на больших данных.
•
Пример: sum(x*x for x in data).
•
Генератор можно “исчерпать” один раз.
Как работает enumerate и почему он удобен?
•
enumerate(iterable) даёт (index, value).
•
Пример: for i, item in enumerate(items, start=1): ...
•
Избавляет от ручного счётчика.
•
Работает с любым итератором.
•
Улучшает читаемость.
Как правильно сортировать списки (sorted vs sort)?
•
list.sort() сортирует на месте и возвращает None.
•
sorted(iterable) возвращает новый список.
•
key= — функция ключа: sorted(users, key=lambda u: u.age).
•
reverse=True — обратный порядок.
•
Стабильная сортировка (важно для многоуровневой).
Как объединять и фильтровать коллекции (map/filter) и когда лучше comprehension?
•
map/filter возвращают итераторы.
•
Пример: map(str, nums).
•
filter(fn, items) оставляет элементы где fn=True.
•
Comprehension часто читается проще.
•
Для сложной логики лучше обычный цикл.
Как устроена обработка исключений try/except/else/finally?
•
try — код который может упасть.
•
except ловит конкретные исключения (не лови голый except).
•
else выполняется, если исключения не было.
•
finally выполняется всегда (cleanup).
•
raise для проброса/создания ошибки.
Как создать собственное исключение?
•
Наследуйся от Exception: class MyError(Exception): pass.
•
Используй осмысленное имя.
•
Передавай сообщение: raise MyError('...').
•
Для параметров — сохраняй их в атрибутах.
•
Не наследуйся от BaseException.
Что такое контекстный менеджер и with?
•
with гарантирует освобождение ресурса.
•
Файлы, блокировки, соединения.
•
Свой менеджер: реализуй __enter__ и __exit__.
•
Или используй contextlib.contextmanager.
•
Упрощает безопасный код.
Как работать с датой и временем (datetime)?
•
datetime.datetime.now() — текущее локальное.
•
Лучше хранить UTC: datetime.datetime.now(datetime.timezone.utc).
•
Парсинг: datetime.datetime.fromisoformat(...).
•
Формат: dt.strftime('%Y-%m-%d').
•
Разница: timedelta.
Как безопасно работать с путями (pathlib)?
•
from pathlib import Path.
•
p = Path('data') / 'file.txt'.
•
p.exists(), p.is_file(), p.read_text(encoding='utf-8').
•
Создать папку: p.parent.mkdir(parents=True, exist_ok=True).
•
Кроссплатформенно и читабельно.
Как читать/писать JSON?
•
import json.
•
json.loads(text) → dict/list.
•
json.dumps(obj, ensure_ascii=False) → строка.
•
Для файлов: json.load(fp), json.dump(obj, fp).
•
Для datetime делай преобразование (например, ISO строка).
Что такое dataclass и зачем он нужен?
•
dataclass уменьшает boilerplate для классов данных.
•
@dataclass автоматически создаёт __init__/__repr__/__eq__.
•
Можно делать frozen=True (иммутабельность).
•
default_factory для списков/словари.
•
Удобно для DTO/моделей.
Как сделать иммутабельный объект в Python?
•
Используй dataclass(frozen=True).
•
Или NamedTuple / typing.NamedTuple.
•
Для коллекций: tuple вместо list, frozenset вместо set.
•
Не мутируй внутренние структуры.
•
Для конфигов это снижает баги.
Что такое @property и когда его использовать?
•
Делает метод похожим на поле.
•
Позволяет вычисляемые свойства.
•
Можно добавить валидацию в setter.
•
Помогает скрывать внутреннее представление.
•
Не злоупотребляй — сложность тоже растёт.
Как работает наследование и super()?
•
class Child(Parent): ...
•
super() вызывает методы базового класса по MRO.
•
В multiple inheritance MRO критичен.
•
Всегда используй super() в кооперативных классах.
•
Проверить MRO: Class.mro().
Что такое MRO и почему оно важно?
•
MRO — порядок поиска методов при наследовании.
•
Используется алгоритм C3 linearization.
•
Влияет на super() в множественном наследовании.
•
Ошибки MRO → TypeError при создании класса.
•
Смотри Class.__mro__ / Class.mro().
Что такое dunder методы (__str__, __repr__, __iter__)?
•
Это протоколы поведения объектов.
•
__repr__ — для разработчика, __str__ — для пользователя.
•
__len__ делает объект совместимым с len().
•
__iter__/__next__ — итератор.
•
__enter__/__exit__ — контекстный менеджер.
Как правильно реализовать __repr__?
•
Делай однозначное представление.
•
Идеально: чтобы можно было восстановить объект (если реально).
•
Используй f'ClassName(x={self.x!r})'.
•
Не делай тяжёлых вычислений.
•
Для dataclass __repr__ генерируется автоматически.
Что такое итератор и итерируемый объект?
•
Итерируемый — то, по чему можно пройти for.
•
Итератор — объект с __iter__ и __next__.
•
iter(obj) возвращает итератор.
•
next(it) даёт следующий элемент или StopIteration.
•
Генераторы — итераторы.
Как использовать itertools для эффективных циклов?
•
itertools.chain объединяет последовательности.
•
itertools.islice делает “срез” итератора.
•
itertools.groupby группирует (на отсортированных данных).
•
itertools.product для декартового произведения.
•
Хорошо для больших потоков данных.
Чем отличаются * и / в сигнатуре функции (keyword-only и positional-only)?
•
f(a, /, b) — a только позиционно.
•
f(*, x, y) — x и y только именованные.
•
Уменьшает ошибки при вызове.
•
Помогает поддерживать API.
•
Часто используется в библиотечном коде.
Что такое typing и зачем нужны type hints?
•
Type hints — подсказки типов (не обязательны для интерпретатора).
•
Улучшают автодополнение IDE.
•
Помогают статическим анализаторам (mypy/pyright).
•
Документируют API.
•
Снижают количество багов в больших проектах.
Как использовать Optional, Union и | (PEP 604)?
•
Optional[str] = Union[str, None].
•
В 3.10+: str | None.
•
Union[int, str] = int | str.
•
Предпочитай | в современном коде.
•
Не забывай об обработке None.
Что такое Protocol и когда он полезен?
•
Protocol описывает “утиный тип” по методам.
•
Позволяет типизировать интерфейсы без наследования.
•
Пример: объект с методом .read().
•
Полезно для моков и абстракций.
•
Нужен typing.Protocol (3.8+) или typing_extensions.
Как правильно логировать (logging) вместо print?
•
import logging; log = logging.getLogger(__name__).
•
Используй уровни: debug/info/warning/error.
•
Настрой формат и handler.
•
Не логируй секреты (токены/пароли).
•
В библиотеке не конфигурируй root-logger.
Как читать большие файлы без загрузки в память?
•
Итерируй по строкам: for line in f:.
•
Для бинарных — читай чанками: f.read(8192).
•
Используй генераторы для пайплайна.
•
Не делай f.read() на гигабайтах.
•
Для CSV — csv.reader построчно.
Как работать с CSV?
•
import csv.
•
reader = csv.DictReader(f).
•
Пиши: csv.DictWriter(...).writeheader(); writer.writerow(...).
•
Укажи newline='' при open.
•
Для кодировок используй encoding='utf-8'.
Как быстро искать минимум/максимум по ключу?
•
min(items, key=...).
•
max(items, key=...).
•
key может быть lambda или attrgetter.
•
Для словаря: max(d, key=d.get).
•
Это читаемее ручных циклов.
Как использовать collections.Counter и defaultdict?
•
Counter считает частоты: Counter(words).
•
most_common(n) — топ-N.
•
defaultdict(list) удобно для группировки.
•
defaultdict(int) — счётчик без if.
•
Улучшает читаемость и скорость написания кода.
Как группировать элементы списка по ключу?
•
Для небольших данных: defaultdict(list).
•
group[key].append(item).
•
Для groupby нужно предварительно отсортировать по ключу.
•
key функция должна быть стабильной.
•
Результат обычно dict[key] -> list[items].
Как сделать HTTP-запросы в Python?
•
Популярно: requests (если доступен).
•
В стандартной библиотеке: urllib.request (менее удобен).
•
Для async: httpx или aiohttp.
•
Всегда ставь таймаут.
•
Проверяй статус и обрабатывай ошибки.
Как безопасно парсить пользовательский ввод?
•
Явно приводить типы: int(x), float(x) с try/except.
•
Проверять диапазоны и формат.
•
Не использовать eval/exec для входных данных.
•
Для JSON использовать json.loads.
•
Для путей — pathlib и whitelisting.
Что такое f-string и почему он лучше format?
•
f-string быстрее и читаемее.
•
Поддерживает выражения внутри {}.
•
Удобное форматирование чисел/дат.
•
Легче поддерживать, чем конкатенация.
•
format полезен, когда шаблон хранится отдельно.
Как сделать CLI-скрипт на Python?
•
Входная точка: if __name__ == '__main__': main().
•
Парсинг аргументов: argparse.
•
Возврат кода: sys.exit(code).
•
Логи вместо print в сложных утилитах.
•
Укажи shebang для Linux.
Как использовать argparse для аргументов командной строки?
•
parser = argparse.ArgumentParser().
•
parser.add_argument('--path', required=True).
•
args = parser.parse_args().
•
Поддержка subcommands: add_subparsers().
•
Автогенерация help.
Что такое asyncio и когда оно нужно?
•
asyncio — конкурентность для I/O (сеть/файлы) без потоков.
•
Используй async def и await.
•
Не ускоряет CPU-heavy задачи.
•
Подходит для web-сервисов/ботов/парсеров.
•
Для CPU — multiprocessing.
В чём разница между threading и multiprocessing?
•
threading — потоки в одном процессе, общий GIL.
•
Хорошо для I/O задач.
•
multiprocessing — отдельные процессы, параллелит CPU.
•
IPC и сериализация дороже.
•
Выбор зависит от профиля нагрузки.
Что такое GIL и как он влияет на производительность?
•
GIL ограничивает выполнение байткода Python одним потоком.
•
CPU-задачи не масштабируются потоками.
•
I/O задачи обычно нормально работают с потоками.
•
Для CPU — multiprocessing или NumPy (C-код).
•
Альтернатива: PyPy, Cython, Rust/Go расширения.
Как запустить несколько async задач параллельно?
•
Создай задачи: asyncio.create_task(coro()).
•
Собери: await asyncio.gather(*tasks).
•
Для ограничения параллелизма используй Semaphore.
•
Обрабатывай исключения (return_exceptions).
•
Не забывай про таймауты.
Как правильно делать таймауты в asyncio?
•
asyncio.wait_for(coro, timeout=...).
•
В Python 3.11+: asyncio.timeout().
•
На сетевых клиентах ставь таймауты на уровне библиотеки.
•
Лови asyncio.TimeoutError.
•
Делай retry с backoff при необходимости.
Как писать тесты: unittest или pytest?
•
unittest — стандартная библиотека, более “Java-стиль”.
•
pytest — проще синтаксис, мощные фикстуры.
•
В CI удобно гонять pytest.
•
Структурируй тесты по модулям/фичам.
•
Изолируй внешние зависимости моками.
Как мокать зависимости в тестах?
•
Используй unittest.mock (patch, MagicMock).
•
Мокай на месте использования, а не определения.
•
Предпочитай dependency injection там, где возможно.
•
Проверяй вызовы: assert_called_once_with.
•
Не превращай тест в копию реализации.
Как работать с фикстурами в pytest?
•
@pytest.fixture для подготовки данных.
•
scope=function/module/session.
•
fixture может возвращать объект или yield для teardown.
•
Фикстуры можно параметризовать.
•
Это уменьшает дублирование тестов.
Как измерять покрытие тестами?
•
coverage.py или pytest-cov.
•
Запуск: pytest --cov=package.
•
Смотри отчёт HTML.
•
Высокое покрытие не гарантирует качество, но помогает.
•
Цель: покрывать критичную бизнес-логику.
Как профилировать Python-код?
•
cProfile для общего профиля.
•
timeit для микробенчмарков.
•
line_profiler для построчного анализа.
•
py-spy для продакшена без внедрения.
•
Сначала измеряй, потом оптимизируй.
Что такое генераторы контекста (contextlib.contextmanager)?
•
Позволяет писать with через generator.
•
@contextmanager над функцией.
•
yield разделяет enter/exit.
•
В finally делай cleanup.
•
Удобно для временных настроек/ресурсов.
Как кэшировать вычисления (functools.lru_cache)?
•
@lru_cache(maxsize=...).
•
Работает для чистых функций.
•
Аргументы должны быть хешируемыми.
•
cache_clear() очищает.
•
Для сложных кейсов — внешний кэш (Redis).
Как использовать @dataclass с default_factory?
•
Для mutable значений нельзя делать default=[].
•
Делай field(default_factory=list).
•
Аналогично для dict/set.
•
Это предотвращает общий список на все экземпляры.
•
Частая ошибка новичков.
Почему опасно писать def f(x, arr=[])?
•
Значение по умолчанию вычисляется один раз при определении функции.
•
Список будет общим между вызовами.
•
Правильно: def f(x, arr=None): arr = arr or [].
•
То же для dict/set.
•
Это классическая ловушка Python.
Как обрабатывать конфигурацию проекта?
•
Разделяй конфиг и код.
•
Используй переменные окружения для секретов.
•
Для .env можно использовать python-dotenv.
•
Валидируй конфиг (pydantic/settings).
•
Не коммить секреты в git.
Как работать с SQLite (sqlite3)?
•
import sqlite3; conn = sqlite3.connect('db.sqlite').
•
cursor.execute('SELECT ...', params).
•
Используй параметризацию, не конкатенацию.
•
conn.commit() для записи.
•
conn.close() или context manager.
Что такое SQLAlchemy и зачем он нужен?
•
ORM и SQL toolkit.
•
Позволяет писать запросы через Python-выражения.
•
Удобные миграции через Alembic.
•
Хорошо для сложных проектов.
•
Для простого скрипта sqlite3 может хватить.
Как правильно работать с файлами в бинарном режиме?
•
open(path, 'rb') для чтения байт.
•
Для записи: 'wb'.
•
Не указывай encoding в бинарном режиме.
•
Для больших файлов — чанки.
•
Для хэшей — hashlib.
Как посчитать хэш файла (sha256)?
•
import hashlib.
•
h = hashlib.sha256().
•
Читай файл чанками и h.update(chunk).
•
В конце h.hexdigest().
•
Не читай огромный файл целиком.
Как работать с регулярными выражениями (re)?
•
re.search/findall/sub.
•
Компилируй шаблон: re.compile(pattern).
•
Используй raw строки: r'\d+'.
•
Флаги: re.I, re.M, re.S.
•
Не усложняй regex, если можно проще.
Как писать читаемый код: функции маленькие, имена понятные?
•
Одной функции — одна ответственность.
•
Понятные имена важнее комментариев.
•
Избегай “магических” чисел — выноси в константы.
•
Пиши docstring для публичного API.
•
Рефакторь, если стало трудно читать.
Как пользоваться линтерами и форматтерами (ruff/black)?
•
Black форматирует код автоматически.
•
Ruff объединяет линт и правила.
•
Настрой в pyproject.toml.
•
Запусти в CI, чтобы не ловить стиль руками.
•
Не спорь со стилем — автоматизируй.
Как устроены пакеты и файлы __init__.py?
•
Пакет — папка с модулями.
•
__init__.py может экспортировать публичный API.
•
Не делай тяжёлых импортов в __init__.py.
•
Избегай циклических зависимостей.
•
Старайся держать структуру простой.
Как работать с виртуальными окружениями в IDE?
•
Создай venv в корне проекта.
•
Выбери интерпретатор venv в настройках IDE.
•
Поставь зависимости в этот venv.
•
Проверь, что терминал IDE тоже использует venv.
•
Не смешивай глобальные и проектные пакеты.
Как упаковать проект (pyproject.toml) и сделать установку?
•
Современный стандарт — pyproject.toml.
•
Укажи зависимости и метаданные.
•
Используй Poetry/uv/pip-tools по выбору.
•
Делай версии и релизы осознанно.
•
Публикация в PyPI — отдельный шаг (twine).
Как организовать структуру проекта для приложения?
•
Разделяй domain/logic и инфраструктуру (IO).
•
Не смешивай API-слой и бизнес-логику.
•
Держи зависимости явными.
•
Добавь tests/ рядом с кодом или отдельно.
•
Вынеси конфиги в отдельный модуль.
Как работать с зависимостями: requirements.txt vs poetry.lock?
•
requirements.txt — простой список зависимостей (pip).
•
lock-файл фиксирует точные версии.
•
Poetry делает lock автоматически.
•
Для продакшена важна воспроизводимость.
•
Не обновляй зависимости без тестов.
Как читать переменные окружения в Python?
•
import os.
•
os.environ['KEY'] (упадёт, если нет).
•
os.getenv('KEY', default) безопаснее.
•
Приводи типы явно (int/bool).
•
Для .env используй python-dotenv (в dev).
Как безопасно работать с секретами (API ключи)?
•
Никогда не храни ключи в репозитории.
•
Используй env vars/secret manager.
•
Ограничивай права ключа (минимальные).
•
Ротируй ключи при утечках.
•
Маскируй в логах и ошибках.
Как обрабатывать HTTP ошибки и ретраи?
•
Проверяй статус ответа и response.raise_for_status() (requests).
•
Делай таймауты.
•
Делай retry только для идемпотентных запросов.
•
Используй exponential backoff.
•
Логируй причины неуспеха.
Что такое контракты типов в рантайме (pydantic)?
•
Type hints сами по себе не валидируют данные.
•
Pydantic валидирует входящие данные в модели.
•
Удобно для API/конфигов.
•
Генерирует понятные ошибки.
•
Не используй для “горячего” пути, где важна каждая наносекунда.
Как сериализовать dataclass в dict/JSON?
•
dataclasses.asdict(obj) → dict.
•
Потом json.dumps(dict).
•
С datetime делай преобразование в строку.
•
Для вложенных объектов asdict работает рекурсивно.
•
Для контроля формата используй pydantic или явный код.
Как правильно сравнивать строки и учитывать регистр/локаль?
•
Для простого: s.lower() или s.casefold().
•
casefold лучше для Unicode.
•
Для локали нужна отдельная обработка (locale).
•
Не забудь strip() для ввода.
•
Для поиска используйте in/startswith/endswith.
Как работать с кодировками и Unicode?
•
Всегда указывай encoding при работе с текстовыми файлами.
•
Для терминала/Windows иногда нужны настройки.
•
Внутри Python строки — Unicode.
•
Байты ↔ строка: encode/decode.
•
Проблемы решай на границе (IO).
Как обрабатывать ошибки ввода-вывода (IOError/OSError)?
•
Лови конкретные исключения: FileNotFoundError, PermissionError.
•
Проверяй существование файла при необходимости.
•
Делай атомарную запись (через temp файл).
•
Логируй контекст (путь, операция).
•
Не скрывай ошибки молча.
Как сделать атомарную запись файла?
•
Пиши во временный файл рядом.
•
fsync при необходимости.
•
Потом replace/rename на целевой путь (atomic на большинстве FS).
•
Используй pathlib и os.replace.
•
Это защищает от битых файлов при падении.
Как устроены генераторы исключений и цепочки raise from?
•
raise NewError() from e сохраняет причину.
•
Это улучшает диагностику.
•
Без from причина теряется или становится неочевидной.
•
Используй для обёрток над низкоуровневыми ошибками.
•
Можно подавить контекст: raise ... from None.
Как правильно писать docstring?
•
Кратко: что делает функция.
•
Описание аргументов и возвращаемого.
•
Укажи исключения, если важно.
•
Примеры использования помогают.
•
Следуй одному стилю (Google/Numpy) в проекте.
Как работать с датами в ISO формате?
•
Сохраняй даты как ISO 8601 строку или UTC timestamp.
•
Парсинг: datetime.fromisoformat (для стандартного ISO).
•
Форматирование: dt.isoformat().
•
Для timezone используй timezone-aware datetime.
•
Не смешивай naive и aware datetime.
Что такое менеджер зависимостей uv и почему он популярен?
•
uv — быстрый менеджер пакетов/виртуальных окружений (на Rust).
•
Быстро создаёт venv и ставит пакеты.
•
Удобно в CI.
•
Альтернатива pip/poetry для многих команд.
•
Выбор инструмента зависит от процессов команды.
Как писать REST API на Python (FastAPI кратко)?
•
FastAPI использует type hints и pydantic.
•
Опиши эндпоинты через @app.get/post.
•
Модели данных — через BaseModel.
•
Запуск: uvicorn app:app --reload.
•
Документация генерируется автоматически (Swagger).
Чем отличается Flask от FastAPI?
•
Flask — минималистичный, синхронный по умолчанию.
•
FastAPI — современный, async-friendly.
•
FastAPI генерирует OpenAPI по типам.
•
В Flask больше ручной работы с валидацией.
•
Выбор зависит от требований и привычек команды.
Как работать с файловыми загрузками в web (общий подход)?
•
Ограничивай размер загрузки.
•
Проверяй MIME/расширение (не доверяй только расширению).
•
Генерируй новое имя файла.
•
Сохраняй вне публичной директории, если нужно.
•
Логируй события и ошибки.
Как избежать утечек памяти в Python приложениях?
•
Не держи глобальные коллекции без контроля.
•
Следи за кешами и ростом списков.
•
Закрывай файлы/соединения.
•
Для профилирования памяти используй tracemalloc/memory_profiler.
•
Ищи циклы ссылок и большие объекты.
Что такое weakref и когда он полезен?
•
weakref хранит слабую ссылку, не удерживая объект.
•
Полезно для кэшей и наблюдателей.
•
Когда объект удаляется, weakref становится пустым.
•
Есть WeakKeyDictionary/WeakValueDictionary.
•
Используй аккуратно, чтобы не получить неожиданный None.
Как ускорять “медленный” Python код без переписывания всего?
•
Сначала профилируй и найди горячие места.
•
Замени алгоритм/структуры данных.
•
Используй встроенные функции (они на C и быстрее).
•
Рассмотри NumPy/пакеты на C.
•
Только потом думай о Cython/расширениях.
Как работать с потоками данных (pipeline) через генераторы?
•
Делай функции-генераторы, которые yield элементы.
•
Соединяй их цепочкой.
•
Фильтрация/маппинг делаются лениво.
•
Это экономит память.
•
Хорошо для обработки больших файлов/логов.
Как правильно закрывать ресурсы при ошибках?
•
Используй with/context managers.
•
Для нескольких ресурсов: with a() as x, b() as y:.
•
В try/finally закрывай то, что не поддерживает with.
•
Логируй исключение и контекст.
•
Не оставляй соединения/файлы открытыми.
Как читать и обновлять словарь безопасно в многопоточности?
•
В CPython отдельные операции dict атомарны, но логика из нескольких шагов — нет.
•
Используй threading.Lock вокруг критической секции.
•
Для очередей используй queue.Queue.
•
Избегай shared mutable state.
•
Для multiprocessing — Manager или очереди процессов.
Какие “must know” инструменты для Python-разработчика?
•
venv/pip (или uv/poetry) для окружения.
•
ruff/black для стиля и линта.
•
pytest для тестов.
•
mypy/pyright для типов (по желанию).
•
Git + CI для автоматических проверок.