Модульный учебник Python для разработчиков уровня Middle

🎓 Модульный учебник по Python для Middle-разработчиков

Этот учебник создан для тех, кто уже пишет на Python, но хочет выйти за рамки базовых конструкций. Здесь — практичные модули с упором на архитектуру, производительность, тестирование, чистый код и современные практики разработки.

🔧 Каждый модуль — это отдельный блок знаний: теория + реальные кейсы + трюки из индустрии.
🎯 Только то, что реально нужно миддлу: от дебага и профилирования до async, typing, CI/CD и LLM-интеграций.

Без воды. С кодом. По делу.

pythonl – в нашем канале мы учим python на кринках и шортах, структурировано, наглядно, понятно.

Настройка окружения и инструментов Python

Модульный учебник Python для разработчиков уровня Middle

Чтобы разработка была управляемой, создавайте виртуальные окружения. Модуль venv позволяет создавать изолированные «виртуальные окружения» с собственным набором пакетов Python 1 . Обычно после установки Python менеджер pip уже доступен (например, при установке с официального сайта или при создании venv) 2 . Для создания и активации окружения используйте команды: – python -m venv venv – создать окружение в папке venv .

source venv/bin/activate (Linux/macOS) или .\venv\Scripts\activate (Windows) – активировать окружение. – pip install -r requirements.txt – установить зависимости. Рекомендуется не хранить папку окружения в системе контроля версий, а фиксировать зависимости через requirements.txt или pyproject.toml. Poetry – современный инструмент для управления зависимостями и создания пакетов. Он использует файл

pyproject.toml и обеспечивает детерминированные сборки через poetry.lock 3 . Poetry удобно устанавливать через системный менеджер пакетов (например, pipx ), а не внутри каждого проекта 4 .

Проектная структура. Следите за чистотой структуры: держите код модульным, с понятными именами файлов. Рекомендуют использовать короткие имена модулей (всё в нижнем регистре, без спецсимволов) 5 . Избегайте запутанных зависимостей между модулями и большого глобального состояния. Стандартная структура проекта может быть, например: page1image51908672 page1image51908880 page1image51908256 page1image51909504 

my_project/ ├─ .venv/ ├─ src/

  • │  ├─ package/
  • │  └─ module.py ├─ tests/
# виртуальное окружение (в .gitignore)
# исходный код (можно вместо src/ корень)
# главный пакет с __init__.py

# тесты
├─ requirements.txt # или pyproject.toml, poetry.lock

└─ README.md

– Практическое задание: Создайте виртуальное окружение, установите туда библиотеку ( pip install ) и попробуйте импортировать её в интерпретаторе. Попрактикуйтесь с venv и pip (напишите команды).

Веб-разработка с Django, Flask, FastAPI

Веб-фреймворки помогают быстро развивать сервисы. Django – «батарейки в комплекте», включает ORM, админку, шаблонизатор. Flask – минималистичный микрофреймворк для небольших проектов и API. FastAPI – современный асинхронный фреймворк, ориентированный на высокую производительность, автоматически генерирует документацию и использует

аннотации типов 6 . Как правило, выбирают Flask для небольших API, Django для крупных приложений и администраторов, FastAPI для критичных по скорости сервисов 7 6 .

При построении REST API следуйте архитектурным принципам REST: ресурсы (сущности) обращаются через HTTP-методы ( GET , POST , PUT , DELETE ) 8 . Например, Django REST Framework или FastAPI отлично подходят для создания REST API. Пример простого FastAPI- сервиса:

page2image51989136 

  from fastapi import FastAPI
  from pydantic import BaseModel
  app = FastAPI()
  class Item(BaseModel):
      name: str

price: float

  @app.get("/items/{item_id}")
  async def read_item(item_id: int):
      return {"id": item_id, "name": f"Item{item_id}"}
  @app.post("/items/")
  async def create_item(item: Item):

return {“id”: 1, “name”: item.name, “price”: item.price}
Такой API будет доступен по HTTP, автоматически сгенерирует Swagger-документацию

Архитектура (Django MVT). Django использует паттерн MVT (Model–View–Template) – аналог MVC. Модель (Model) описывает данные и логику доступа к БД, Представление (View) обрабатывает запросы и формирует контекст, Шаблон (Template) рендерит HTML на основе данных 9 10 . На схеме ниже показана схема взаимодействия частей MVT: модель хранит данные, представление передаёт их в шаблон, шаблон выводит пользователю 9 .

page3image35151856

Рисунок: упрощённая схема MVT в Django (Model — View — Template) 9 .

Деплой. В продакшене веб-сервисы обычно запускают через WSGI/ASGI-сервер (Gunicorn, uWSGI, Daphne, Uvicorn) за обратным прокси (Nginx). Например, для Django часто используют Gunicorn + Nginx 11 . Nginx обрабатывает статические файлы и SSL, перенаправляя запросы на Gunicorn. FastAPI запускают через Uvicorn или Hypercorn за Nginx. После настройки сервера контейнеры или виртуальные машины, релиз загружают на прод (например, через Docker, докер-композ, облачные CI/CD).

• Задача: Напишите простой REST API (на Flask или FastAPI) с одним GET -эндпоинтом и протестируйте его локально. Попробуйте задеплоить простой Django-проект на локальный Nginx+Gunicorn или с помощью Docker Compose.

Асинхронное программирование (asyncio, aiohttp)

Модульный учебник Python для разработчиков уровня Middle

В Python для высокопроизводительных I/O-ориентированных приложений используют асинхронность на основе asyncio. Модуль asyncio предоставляет инфраструктуру для конкурентного выполнения задач через цикл событий, используя синтаксис async/await 12 . Например:

  import asyncio
  async def main():
      print("Hello ...")
      await asyncio.sleep(1)  # имитирует асинхронную операцию
      print("... World!")
  asyncio.run(main())

Этот код создаёт и запускает корутину main , печатает «Hello …», ждёт секунду и печатает «… World!» 13 . Асинхронные функции позволяют одновременно обрабатывать множество операций ввода-вывода (HTTP-запросы, БД, файлы), не блокируя поток.

page3image52347088 page3image52347504 page3image52347920 

Для веб-запросов есть aiohttp – асинхронный HTTP-клиент/сервер на базе asyncio 14 . Он позволяет писать async-клиенты и серверы. Например, клиентская часть:

  import aiohttp, asyncio
  async def fetch(url):
      async with aiohttp.ClientSession() as session:
          async with session.get(url) as resp:
              return await resp.text()
  text = asyncio.run(fetch("http://example.com"))
  print(text)

Асинхронные веб-фреймворки (Sanic, FastAPI) и драйверы к БД ( asyncpg для PostgreSQL, databases для SQL, aiomysql , motor для MongoDB) базируются на asyncio 12 . Благодаря

этому мы можем обрабатывать множество соединений без создания сотен потоков.

• Задача: Реализуйте две асинхронные корутины и запустите их вместе через asyncio.gather , чтобы увидеть конкурентное выполнение. Попробуйте написать

простую async-функцию, которая обращается к публичному API с помощью aiohttp . Data Science и машинное обучение (Pandas, NumPy, scikit-

learn, PyTorch/TensorFlow)

Для анализа данных и машинного обучения в Python существует мощный стек библиотек:

• NumPy – фундаментальный пакет для работы с многомерными массивами и линейной алгеброй. «NumPy – это основной пакет для вычислений с массивами в Python» 15 . Он обеспечивает быстрые операции над массивами numpy.ndarray с векторизацией. Пример:

       import numpy as np
       a = np.arange(1, 6)         # array([1,2,3,4,5])
       print(a * 2)                # [2 4 6 8 10]

• Pandas – библиотека для манипуляций данными в табличном виде. «Pandas – быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных, написанный на Python» 16 . Она предоставляет структуры DataFrame и Series для работы с таблицами. Пример:

       import pandas as pd
       df = pd.DataFrame({"age": [25, 30], "name": ["Alice", "Bob"]})
       print(df.loc[0, "name"])    # Alice

• scikit-learn – библиотека для классического машинного обучения. «Scikit-learn – это библиотека для машинного обучения, предоставляющая простые и эффективные

инструменты для анализа и моделирования данных» 17 . Она включает алгоритмы классификации, регрессии, кластеризации и т.д. Пример:

       from sklearn.linear_model import LinearRegression
       import numpy as np
       X = np.array([[1], [2], [3]])
       y = np.array([2, 4, 6])
       model = LinearRegression().fit(X, y)
       print(model.predict([[4]]))  # ~8.0

• TensorFlow и PyTorch – фреймворки для глубокого обучения. TensorFlow – «end-to-end платформа с гибкой экосистемой» 18 от Google, подходит для промышленной разработки. PyTorch – «открытый фреймворк для глубинного обучения, известный гибкостью и удобством» 19 . PyTorch особенно удобен для прототипирования благодаря динамическим вычислительным графам 20 . Пример (PyTorch):

       import torch
       x = torch.tensor([[1.0, 2.0]])
       linear = torch.nn.Linear(2, 1)
       print(linear(x))  # выводит предсказание (веса случайны)

В типичном ML-проекте создаётся конвейер (pipeline): загрузка данных → предобработка → разделение на тренировочную/тестовую выборки → обучение модели → валидация и сохранение модели. На рисунке ниже схематично показаны этапы стандартного ML-пайплайна (DAG с зависимостями между этапами) 21 :

• Задача: С использованием Pandas прочитайте CSV-файл в DataFrame, выполните простую фильтрацию и статистику. Постройте модель регрессии из scikit-learn на синтетических данных. Попробуйте натренировать простой нейрон (PyTorch или TensorFlow) и оценить его на тестовых данных.

Тестирование и обеспечение качества (pytest, unittest, mock, flake8, mypy, CI)

Код должен быть покрыт тестами и проверен статически. В Python есть встроенный фреймворк unittest и популярный внешний pytest. unittest – структурированный (в духе JUnit) фреймворк, где тесты оформляются как методы внутри класса 22 . pytest – более гибкий и удобный: нет нужды в классах, используются обычные функции с assert , есть мощная система фикстур и плагинов 23 . Например, тест на pytest: def add(a, b):

      return a + b
def test_add(): assert add(1, 2) == 3


Pytest автоматически обнаружит test_ -функцию и запустит её. Он также предоставляет

расширенные возможности (параметризация, замечательный вывод ошибок и т.п.) 24 .

Мокирование. Для имитации частей системы в тестах используют unittest.mock . С его помощью можно подменять реальные объекты (например, запросы к БД или сети) на фиктивные. Пример:

  from unittest.mock import patch
  @patch('requests.get')
  def test_fetch(mock_get):
      mock_get.return_value.status_code = 200
      mock_get.return_value.text = 'ok'
      import requests
      resp = requests.get('http://example.com')
      assert resp.text == 'ok'

Статика кода. Инструменты линтинга и проверки кода полезны для качества. flake8 – линтер, проверяет соответствие PEP8, находит синтаксические ошибки. mypy – статическая проверка типов: анализирует аннотации и находит несоответствия. Например, если функция объявлена как принимающая str , а передаётся int , mypy об этом скажет (во время статического анализа, а не при запуске).

CI/CD. Автоматизация тестов и проверок на каждый коммит делается с помощью CI-систем (GitHub Actions, GitLab CI и др.). Например, в GitHub Actions есть готовые шаблоны для Python: actions/setup-python , затем запускаем pytest , flake8 , и т.п. Документация GitHub отмечает: «Можно создать CI workflow для сборки и тестирования вашего Python-проекта» 25 .page6image52348336

Настройте файл .github/workflows/ci.yml с шагами: checkout , setup-python , pip install , pytest и прочими.

• Задача: Напишите несколько тестов на pytest для небольшой функции (например, вычисление факториала или работу со строками). Настройте простейший GitHub Actions workflow, который запускает эти тесты и линтер при каждом пуше.

DevOps и контейнеризация (Docker, Docker Compose, GitHub Actions, деплой)

Современные приложения часто контейнеризуют через Docker. Docker упрощает настройку окружения на сервере. Dockerfile описывает, как собрать образ. Рекомендации для Python- контейнеров: использовать мультиступенчатую сборку для уменьшения финального размера и безопасности 26 , минимальные базовые образы ( python:3.X-slim или alpine ), объединять команды RUN для уменьшения числа слоёв 27 28 . Например, распространённый паттерн:

  # Stage 1: сборка
  FROM python:3.12-slim AS builder
  WORKDIR /app
  COPY requirements.txt .
  RUN pip wheel --no-cache-dir -r requirements.txt -w wheels
  # Stage 2: рантайм
  FROM python:3.12-slim
  WORKDIR /app
  COPY --from=builder /app/wheels /wheels
  COPY requirements.txt .
  RUN pip install --no-index --no-cache /wheels/*
  COPY . .
  CMD ["python", "app.py"]

Это позволяет на этапе сборки устанавливать компиляторы и зависимости, а в итоговый образ попадёт только то, что нужно для запуска (образ становится «легче, безопаснее» 26 ).

Docker Compose позволяет описать мультиконтейнерные приложения (например, web-сервис + база данных + кеш) в docker-compose.yml . В нём задают сервисы, сети и тома. Также CI/CD (например, GitHub Actions) могут собирать образы и деплоить их. В GitHub Actions можно использовать официальные Docker Build и Docker push actions для автоматической публикации образов.

• Задача: Напишите простой Dockerfile для вашего Python-приложения (например, Flask или скрипта) и убедитесь, что образ успешно строится. Попробуйте запустить приложение внутри контейнера. Настройте docker-compose.yml для запуска приложения вместе с сервисом базы данных (PostgreSQL или Redis).page7image51927552

Работа с базами данных (SQLAlchemy, PostgreSQL, Alembic, Redis, MongoDB)

Хранение данных – важная часть. Для реляционных баз часто используют PostgreSQL. Чтобы не писать сырые SQL-запросы, используют ORM-библиотеки, например SQLAlchemy: «SQLAlchemy – это Python-инструментарий для работы с SQL и ORM, который даёт разработчикам полную гибкость SQL» 29 . Пример модели и запроса на SQLAlchemy:

  from sqlalchemy import create_engine, Column, Integer, String
  from sqlalchemy.orm import declarative_base, sessionmaker
  Base = declarative_base()
  class User(Base):
      __tablename__ = "users"
      id = Column(Integer, primary_key=True)
      name = Column(String)
  engine = create_engine("postgresql://user:pass@localhost/db")
  Session = sessionmaker(bind=engine)
  session = Session()
  # Создание таблиц
  Base.metadata.create_all(engine)
  # Создание и запрос
  user = User(name="Alice")
  session.add(user)
  session.commit()
  print(session.query(User).filter_by(name="Alice").first().id)

Для управления версиями схем баз данных используют Alembic – инструмент миграций для SQLAlchemy 30 . Он позволяет автоматически генерировать скрипты миграций после изменения моделей и применять их к базе.

Redis – это быстрый ключ-значение хранилище в оперативной памяти. «Redis – это открытое (BSD) хранилище ключ-значение, которое может работать как in-memory база и как кэш» 31 . Его часто применяют для кеширования часто используемых данных или для реализации очередей/ pub-sub. Python-клиент – redis-py .

MongoDB – популярная документная NoSQL-база. В ней данные хранятся в виде гибких JSON- подобных документов (BSON) вместо таблиц. Документные базы – это нереляционные базы данных, которые используют гибкие схемы 32 . В Python для работы есть драйвер pymongo и ODM (например, motor для асинхронных операций).

• Задача: С помощью SQLAlchemy создайте модель и миграцию Alembic для простой таблицы (например, Book(id, title) ). Реализуйте несколько запросов на SQLAlchemy (добавление, выборку, обновление). Настройте redis и сохраните в него пару ключ- значение через redis-py . Если есть время, попробуйте сохранить JSON-документ в MongoDB и прочитать его на Python.

Шаблоны проектирования и архитектура (SOLID, Чистая архитектура)

Модульный учебник Python для разработчиков уровня Middle

Для крупных проектов важно проектировать код правильно. SOLID-принципы – фундамент в ООП, улучшают читаемость и поддержку кода 33 : – S (SRP): каждый класс/модуль должен иметь одну ответственность. – O (OCP): «закрыт для модификации, открыт для расширения». – L (LSP): наследник должен корректно заменять базовый класс. – I (ISP): клиент не должен зависеть от методов, которыми он не пользуется (интерфейсы маленькие). – D (DIP): зависимости – через абстракции, а не конкретные реализации. Эти идеи помогают, например, разделять логику работы с данными, бизнес-логику и представление, что делает код гибче 33 .

Чистая архитектура (Clean Architecture). Идея – поместить бизнес-логику в центр приложения, а внешние детали (БД, UI, фреймворки) – «на периферию». Core-слой знает только об интерфейсах внешних компонентов, но не о конкретных реализациях. Внешние модули (контроллеры, адаптеры) реализуют интерфейсы и подключаются к ядру. По сути, все зависимости«смотрятвнутрь»(DependencyInversion) 34 .Такойподходупрощаеттестированиеи замену компонентов. К примеру, слой взаимодействия с БД может реализовывать общий интерфейс репозитория; при этом ядро бизнес-логики ничего не знает о конкретной СУБД.

• Задача: Примените один из шаблонов (например, Repository или Factory) в небольшом примере. Определите абстракции (интерфейсы) и реализуйте их в классах. Проверьте, что ваш класс зависит от интерфейса, а не от конкретной реализации (пример DIP).

Оптимизация производительности и профилирование (GIL, многопоточность, multiprocessing, профилировщики)

Python имеет Global Interpreter Lock (GIL) – глобальную блокировку интерпретатора: в каждый момент только один поток выполняет Python-байт-код 35 . Это означает, что чисто вычислительные задачи на нескольких потоках не распараллеливаются на нескольких ядрах – каждый поток берёт GIL по очереди 35 . Поэтому для CPU-bound задач в Python обычно используют многопроцессность ( multiprocessing ) или инструменты за пределами CPython (например, C-расширения, модули numba ). В то же время I/O-bound задачи (сетевые запросы, ввод-вывод) выигрывают от потоков или asyncio – потому что во время ожидания GIL отпускается, и другой поток может исполняться.

Для измерения производительности и поиска «узких мест» служат профилировщики. В стандартной библиотеке есть cProfile – детерминированный профайлер на C (рекомендуется для большинства случаев) 36 . Запустив программу через cProfile , получаем статистику времени выполнения функций. Пример использования:

  python -m cProfile myscript.py

Он выведет таблицу вызовов функций и затраченного на них времени. Для более тонкого анализа есть инструменты типа line_profiler (строковый профиль) и memory_profiler (память). Для быстрого измерения небольших фрагментов кода полезен модуль timeit (точный таймер для маленьких тестов) 36 .

• Задача: Напишите функцию, выполняющую какую-нибудь тяжёлую операцию (например, суммирование в цикле) и проанализируйте её с помощью cProfile . Обратите внимание, какие функции занимают больше всего времени. Попробуйте также использовать timeit для сравнения разных реализаций.

Расширенные возможности Python (метапрограммирование, декораторы, дескрипторы, typing)

Python предоставляет гибкие инструменты для метапрограммирования:
• Метапрограммирование. Вы можете создавать классы динамически с помощью type ,

изменять атрибуты объектов, использовать метаклассы. Например:

       MyClass = type("MyClass", (object,), {"x": 10})
       obj = MyClass()
       print(obj.x)  # 10

Это создаёт класс с атрибутом x . Метаклассы ( __metaclass__ ) позволяют менять класс- природу, перехватывая его создание. Часто их используют для регистрации классов или автоматической генерации методов.

•Декораторы позволяют оборачивать функции (и методы/классы) в другие функции, расширяя их поведение «снаружи», без изменения самого тела. «Декораторы позволяют модифицировать или расширять поведение функций и методов без изменения их кода. При использовании декоратора мы оборачиваем функцию в другую функцию, которая получает оригинальную как аргумент и возвращает её модифицированную версию» 37 . Пример:

       def log_calls(func):
           def wrapper(*args, **kwargs):
               print(f"Calling {func.__name__}")
               return func(*args, **kwargs)
           return wrapper
       @log_calls
       def greet(name):
           print(f"Hello, {name}")
       greet("Alice")
       # Вывод: Calling greet
       #        Hello, Alice

Декораторы часто используют для логирования, проверки прав доступа, кэширования результатов и т.д.

Дескрипторы – объекты, которые контролируют доступ к атрибутам через методы __get__ , __set__ и __delete__ . Если класс А имеет атрибут x = Descriptor() , то при обращении к a.x вызываются методы дескриптора. Это удобно, например, для валидации данных при присвоении. (Свойство @property – частный случай

дескриптора). Например, дескриптор, проверяющий тип:

       class StringDescriptor:
           def __get__(self, instance, owner):
               return instance._s
           def __set__(self, instance, value):
               if not isinstance(value, str):
                   raise TypeError("Expected a string")
               instance._s = value
       class A:
           s = StringDescriptor()
       a = A()
       a.s = "hello"     # ОК
       # a.s = 123       # Ошибка: Expected a string

• Типизация (typing). В Python 3 поддерживаются аннотации типов. Модуль typing содержит продвинутые подсказки (например, List[int], Optional[str], Union, Protocol и пр.). Аннотации не выполняются во время работы программы, а служат для

статического анализа (mypy, IDE) 38 . Пример: def add(x: int, y: int) -> int:

return x + y

Здесь указано, что x и y ожидаются как int , а функция возвращает int . Сама по себе проверка типов в рантайме не происходит (это подчёркивает документация: «рантайм не выполняет проверки типов; их обрабатывают сторонние инструменты» 38 ).

• Задача: Напишите свой декоратор (например, для кэширования результатов функции или для учёта времени выполнения). Попробуйте создать дескриптор (например, для числового атрибута с контролем диапазона). Добавьте аннотации типов к нескольким функциям и проверьте их с помощью mypy .

Источники: 

1 venv — Creation of virtual environments — Python 3.13.3 documentation https://docs.python.org/3/library/venv.html

2 Installation – pip documentation v25.1.1 https://pip.pypa.io/en/stable/installation/

3 4 Dependency Management With Python Poetry – Real Python https://realpython.com/dependency-management-python-poetry/

5 Structuring Your Project — The Hitchhiker’s Guide to Python https://docs.python-guide.org/writing/structure/

6 7 Comparison of Flask, Django, and FastAPI: Advantages, Disadvantages, and Use Cases | by Gen. Devin DL. | Medium https://medium.com/@tubelwj/comparison-of-flask-django-and-fastapi-advantages-disadvantages-and-use- cases-63e7c692382a

8 REST – Wikipedia https://en.wikipedia.org/wiki/REST

9 10 Django Project MVT Structure | GeeksforGeeks https://www.geeksforgeeks.org/django-project-mvt-structure/

11 Securely Deploy a Django App With Gunicorn, Nginx, & HTTPS – Real Python https://realpython.com/django-nginx-gunicorn/

12 13 asyncio — Asynchronous I/O — Python 3.13.3 documentation https://docs.python.org/3/library/asyncio.html

14 Welcome to AIOHTTP — aiohttp 3.12.6 documentation https://docs.aiohttp.org/en/stable/

15 numpy · PyPI https://pypi.org/project/numpy/1.22.0/

16 pandas – Python Data Analysis Library https://pandas.pydata.org/

17 What is python scikit library? | GeeksforGeeks https://www.geeksforgeeks.org/what-is-python-scikit-library/

18 TensorFlow | Google Open Source Projects https://opensource.google/projects/tensorflow

19 20 What is PyTorch? | Data Science | NVIDIA Glossary https://www.nvidia.com/en-us/glossary/pytorch/

21 ML Pipeline Architecture Design Patterns (With Examples) https://neptune.ai/blog/ml-pipeline-architecture-design-patterns

22 23 24 Pytest vs Unittest: A Comparison | BrowserStack https://www.browserstack.com/guide/pytest-vs-unittest

25 Building and testing Python – GitHub Docs https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-python

26 27 28 Docker Best Practices for Python Developers | TestDriven.io https://testdriven.io/blog/docker-best-practices/

29 SQLAlchemy – The Database Toolkit for Python https://www.sqlalchemy.org/

30 Welcome to Alembic’s documentation! — Alembic 1.16.1 documentation https://alembic.sqlalchemy.org/en/latest/

31 Using GridPane Redis Object Caching | GridPane https://gridpane.com/kb/using-gridpane-redis-object-caching/

32 Document Database – NoSQL | MongoDB https://www.mongodb.com/resources/basics/databases/document-databases

33 SOLID Principles: Improve Object-Oriented Design in Python – Real Python https://realpython.com/solid-principles-python/

34 Understanding Hexagonal, Clean, Onion, and Traditional Layered Architectures: A Deep Dive | by Roman Glushach | Mediumhttps://romanglushach.medium.com/understanding-hexagonal-clean-onion-and-traditional-layered-architectures-a-deep- dive-c0f93b8a1b96

35 What Is the Python Global Interpreter Lock (GIL)? – Real Python https://realpython.com/python-gil/

36 The Python Profilers — Python 3.13.3 documentation https://docs.python.org/3/library/profile.html

37 Primer on Python Decorators – Real Python https://realpython.com/primer-on-python-decorators/

38 typing — Support for type hints — Python 3.13.3 documentation https://docs.python.org/3/library/typing.html

13

+1
0
+1
2
+1
0
+1
0
+1
2

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *