Zen of Python
18.8K subscribers
1.44K photos
202 videos
38 files
3.64K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

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

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
security.txt в Django: контакт для сообщений об уязвимостях

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

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

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

#django #тестирование
❤3
Как отличить отсутствие аргумента от None в Python

Если None — допустимое значение настройки, оно не подходит для обозначения «аргумент не передали». Маркер MISSING = object() решает эту задачу, но после deepcopy или pickle может превратиться в другой объект: проверка через is перестанет работать.

В Python 3.15 появляется встроенный sentinel. Объявление MISSING = sentinel("MISSING") даёт читаемую сигнатуру, позволяет использовать сам маркер в аннотации типа и сохраняет его идентичность при копировании.

Для pickle маркер должен быть доступен по имени в модуле: имя внутри sentinel обязано совпадать с именем переменной. Создавайте его один раз. Два вызова sentinel("MISSING") возвращают разные объекты, даже если строка одинакова.

#python #типизация
Как выполнять CPU-задачи в отдельных интерпретаторах Python

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

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

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

#python #производительность
Почему цикл внутри теста скрывает часть ошибок

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

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

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

#python #тестирование