Открытый канал ID 69133189535033

Zen of Python

Всё о разработке на Python в одном месте.

Всё о вебе: @tproger_web
IT Юмор: @ithumor
Новости IT: @your_tech
Типичный программист: @tproger
Для новичков в IT: @prog_point
Инструменты для программистов: @prog_tools
Мобильная разработка: @mobi_dev

Правила общения: tprg.ru/rules

Сайт: tprg.ru/site

Разместить рекламу: t.me/tproger_sales_bot

Каналов в рубрике
1 729
Место этого канала
№ 305
Открыть рубрику →

Публикации за период

По реакциям

Поиск и вся лента — после бесплатной регистрации. Свои даты — по подписке; владелец канала видит их бесплатно. Сортировка по реакциям — по подписке. Зарегистрироваться

Загрузка…

Общая папка для работы Claude Code и Codex

Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:

Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову

В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.

#ии #инструменты
Просмотры: 54
Перейти в пост Открыть в MAX Сообщить о неточности
Почему тайм-аут не всегда заканчивается ровно по часам

asyncio.TaskGroup владеет созданными в нём задачами и ждёт их завершения. Если одна падает с обычным исключением, группа запрашивает отмену остальных, дожидается очистки и собирает ошибки в ExceptionGroup.

В разборе отмены и тайм-аутов важна граница: cancel() отправляет запрос, а задача должна получить CancelledError и выполнить finally. Если она подавляет отмену или долго очищает ресурсы, завершение затянется.

wait_for() ждёт окончания отмены, поэтому фактическое время может превысить заданный timeout. Контекст asyncio.timeout() отменяет текущую задачу и преобразует свою отмену в TimeoutError снаружи блока. Для связанных операций помещайте TaskGroup внутрь timeout, чтобы дочерняя работа имела явного владельца.

#python #asyncio
Просмотры: 60
Перейти в пост Открыть в MAX Сообщить о неточности
Чего не проверяет runtime_checkable Protocol

Protocol позволяет описать небольшой интерфейс: например, метод send(destination, message). Класс может удовлетворять ему без наследования — статический анализатор проверяет совместимость структуры и сигнатур.

Декоратор runtime_checkable добавляет возможность isinstance, но такая проверка не валидирует сигнатуры методов. Наличие атрибута send не доказывает, что он принимает нужные аргументы или выполняет обещанное действие.

Поэтому проверка плагина требует нескольких уровней: типизация помогает проверить код, тест контракта — поведение адаптера, схема — внешние данные. Аннотация quantity: int сама по себе не отвергает отрицательное число, а корректная схема заказа не доказывает, что товар есть на складе.

#python #типизация
Просмотры: 56
Перейти в пост Открыть в MAX Сообщить о неточности
Как добавить MCP-сервер в Django-проект

django-mcpz позволяет зарегистрировать Python-функцию как MCP-инструмент и подключить сервер в urls.py как обычное представление. Функция получает HttpRequest, поэтому может использовать request.user и ORM проекта.

В примере Адама Джонсона инструмент считает заказы с необязательным фильтром статуса. Параметры и результат описаны через msgspec.Struct: библиотека строит JSON Schema и проверяет аргументы до вызова функции. Реализация рассчитана на обычное синхронное WSGI-развёртывание.

Аутентификация задаётся явно. Для клиентских инструментов есть отзываемые bearer-токены, для OAuth-клиентов — отдельное приложение авторизации. Аннотация read_only описывает инструмент для клиента; реальные права доступа к данным всё равно должен проверять сервер.

#python #django
Просмотры: 50
Перейти в пост Открыть в MAX Сообщить о неточности
Почему цикл внутри теста скрывает часть ошибок

Тест перебирает десять входов и проверяет результат через assert. Если третий случай падает, оставшиеся семь до проверки не доходят. В отчёте появляется одна ошибка, а состояние остальных случаев неизвестно.

pytest.mark.parametrize превращает каждую пару «вход — ожидаемый результат» в отдельный тест. Без режима остановки на первой ошибке pytest проверит все случаи и покажет, какие именно сломались. Через ids им можно дать понятные имена.

Подготовку ресурсов удобно вынести в fixture с yield: код после yield выполнит очистку. Для ожидаемой ошибки используйте pytest.raises с конкретным типом и match, если важен текст сообщения. Иначе случайный ValueError из другой части функции может сделать тест зелёным.

#python #тестирование
Просмотры: 56
Перейти в пост Открыть в MAX Сообщить о неточности
Как выполнять CPU-задачи в отдельных интерпретаторах Python

В Python 3.14 InterpreterPoolExecutor запускает потоки с отдельными интерпретаторами. У каждого свой GIL, поэтому вычисления на Python могут одновременно занимать несколько ядер в одном процессе.

У этой модели есть цена: между интерпретаторами передаются сериализованные функции, аргументы и результаты. Импорты и глобальные переменные изолированы. Кеш на уровне модуля станет кешем каждого работника; большая таблица данных может занять память несколько раз.

Подход подходит для достаточно крупных вычислительных задач с простыми входами и выходами. На мелких операциях передачу данных легко сделать дороже вычислений. Перед переносом проверьте совместимость C-расширений и сравните время и память с ProcessPoolExecutor на реальной нагрузке.

#python #производительность
Просмотры: 51
Перейти в пост Открыть в MAX Сообщить о неточности
security.txt в Django: контакт для сообщений об уязвимостях

Исследователь нашёл уязвимость на сайте. Куда ему писать? Файл /.well-known/security.txt даёт публичный ответ: поле Contact указывает способ связи, а Expires — дату, после которой сведения считаются устаревшими.

Адам Джонсон разбирает реализацию для Django: отдачу файла через FileResponse, доступ без авторизации и тесты ответа. В примере проверяются тип содержимого, обязательные поля и разрешённые методы HTTP.

Для сопровождения пригодится отдельная проверка срока действия. Корректная дата в файле ещё не означает, что контакт актуален. Автор добавляет системную проверку Django: за 30 дней до истечения срока она начинает выдавать предупреждение, не прерывая команду. Это повод проверить контакты и обновить Expires.

#django #тестирование
Просмотры: 59
Перейти в пост Открыть в MAX Сообщить о неточности
Как открывать ссылки Django-сайта в приложениях Apple и Android

Для этого нужна двусторонняя связь: приложение объявляет домены, ссылки которых обрабатывает, а сайт подтверждает разрешённые приложения. Одного файла на сервере недостаточно.

Адам Джонсон показывает, как отдавать из Django файлы apple-app-site-association и assetlinks.json по адресам в /.well-known/. Нужны HTTPS, ответ 200 без редиректов и тип содержимого application/json. Apple-файл хранится с расширением .json, чтобы FileResponse определил тип, но URL остаётся без расширения.

В разборе есть тесты заголовков, корректности JSON и идентификаторов приложений, а также проверки после развёртывания через сервисы Apple и Google. Ошибки здесь незаметны: ссылка просто открывается в браузере.

#django #тестирование
Просмотры: 52
Перейти в пост Открыть в MAX Сообщить о неточности
Как собрать Rust-проект с Python-модулем и отдельной программой

В пошаговом примере калькулятора одна функция сложения доступна из Python и из отдельной Rust-программы. PyO3 позволяет вызывать Rust-код из Python, maturin собирает расширение, а через uv устанавливают maturin и запускают сборку.

После установки модуля импорт в Python может работать, а cargo run — падать: PyO3 ищет Python, но глобальной установки нет или она настроена нестандартно.

В примере это исправляют через .cargo/config.toml: переменная PYO3_PYTHON указывает на .venv/bin/python. Так для запуска Rust-программы используется Python из виртуального окружения. В руководстве есть конфигурация сборки для обоих вариантов и проверки вызова функции.

#python
Просмотры: 45
Перейти в пост Открыть в MAX Сообщить о неточности
Как упаковать Python-проект в библиотеку и CLI

Копирование модулей и правки sys.path можно заменить устанавливаемым пакетом. В руководстве на примере JSON-флаттенера разобраны структура src, файл pyproject.toml с Hatchling, зависимости и точка входа для команды терминала.

Проект разделяет функцию обработки JSON и интерфейс на Typer. Поэтому одну логику можно импортировать как библиотеку или запускать командой json-flatten из любого каталога. Структура src не позволяет Python случайно импортировать исходники вместо установленного пакета.

Editable-установка связывает окружение с исходным кодом: изменения становятся доступны без переустановки. Подход пригодится, когда внутренней утилите пора перестать быть набором файлов с относительными импортами.
Просмотры: 44
Перейти в пост Открыть в MAX Сообщить о неточности
Вся лента — после бесплатной регистрации
ВКонтакте Телеграм Одноклассники
Избранное в datool.ru

Следите за каналом в личном кабинете

Зарегистрируйтесь в datool.ru, чтобы добавить канал «Zen of Python» в избранное и отслеживать его показатели.

Зарегистрироваться
Для владельцев каналов

Подтвердите свой канал

Войдите или зарегистрируйтесь в datool.ru, затем добавьте нашего бота в канал по инструкции в личном кабинете. После проверки владения замок исчезнет и вам станет доступно управление каналом.

Войти или зарегистрироваться

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти