devmode.md
1> **Источник:** https://python-all.ru/3.9/library/devmode.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Режим разработки Python89Добавлено в версии 3.7.1011Режим разработки Python добавляет дополнительные проверки во время выполнения, которые слишком ресурсоёмки, чтобы быть включёнными по умолчанию. Если код корректен, он не должен выводить больше сообщений, чем обычно; новые предупреждения появляются только при обнаружении проблемы.1213Его можно включить с помощью опции командной строки [`-X dev`](https://python-all.ru/3.9/using/cmdline.html#id5) или установив переменную окружения [`PYTHONDEVMODE`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONDEVMODE) в значение `1`.1415# Эффекты режима разработки Python1617Включение режима разработки Python аналогично следующей команде, но с дополнительными эффектами, описанными ниже:1819```python20PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler21```2223Эффекты режима разработки Python:2425- Добавляет `default` [фильтр предупреждений](https://python-all.ru/3.9/library/warnings.html#describing-warning-filters). Отображаются следующие предупреждения:2627 - [`DeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#DeprecationWarning)28 - [`ImportWarning`](https://python-all.ru/3.9/library/exceptions.html#ImportWarning)29 - [`PendingDeprecationWarning`](https://python-all.ru/3.9/library/exceptions.html#PendingDeprecationWarning)30 - [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning)3132 Обычно указанные выше предупреждения отфильтровываются стандартными [фильтрами предупреждений](https://python-all.ru/3.9/library/warnings.html#describing-warning-filters).3334 Поведение аналогично использованию опции командной строки [`-W default`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-w).3536 Используйте опцию командной строки [`-W error`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-w) или установите переменную окружения [`PYTHONWARNINGS`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONWARNINGS) в значение `error`, чтобы обрабатывать предупреждения как ошибки.37- Устанавливает отладочные перехватчики на распределители памяти для проверки:3839 - Опустошение буфера (buffer underflow)40 - Переполнение буфера41 - Нарушение API распределителя памяти42 - Небезопасное использование GIL4344 См. функцию [`PyMem_SetupDebugHooks()`](https://python-all.ru/3.9/c-api/memory.html#c.PyMem_SetupDebugHooks) на языке C.4546 Поведение аналогично установке переменной окружения [`PYTHONMALLOC`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONMALLOC) в значение `debug`.4748 Чтобы включить режим разработки Python без установки отладочных перехватчиков на распределители памяти, установите переменную окружения [`PYTHONMALLOC`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONMALLOC) в значение `default`.49- Вызовите [`faulthandler.enable()`](https://python-all.ru/3.9/library/faulthandler.html#faulthandler.enable) при запуске Python, чтобы установить обработчики для `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS` и `SIGILL` сигналов и вывести трассировку Python при аварийном завершении.5051 Поведение аналогично использованию опции командной строки [`-X faulthandler`](https://python-all.ru/3.9/using/cmdline.html#id5) или установке переменной окружения [`PYTHONFAULTHANDLER`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONFAULTHANDLER) в значение `1`.52- Включает [отладочный режим asyncio](https://python-all.ru/3.9/library/asyncio-dev.html#asyncio-debug-mode). Например, [`asyncio`](https://python-all.ru/3.9/library/asyncio.html#module-asyncio) проверяет корутины, которые не были ожиданы (awaited), и регистрирует их.5354 Поведение аналогично установке переменной окружения [`PYTHONASYNCIODEBUG`](https://python-all.ru/3.9/using/cmdline.html#envvar-PYTHONASYNCIODEBUG) в значение `1`.55- Проверяет аргументы *encoding* и *errors* для операций кодирования и декодирования строк. Примеры: [`open()`](https://python-all.ru/3.9/library/functions.html#open), [`str.encode()`](https://python-all.ru/3.9/library/stdtypes.html#str.encode) и [`bytes.decode()`](https://python-all.ru/3.9/library/stdtypes.html#bytes.decode).5657 По умолчанию для максимальной производительности аргумент *errors* проверяется только при первой ошибке кодирования/декодирования, а аргумент *encoding* иногда игнорируется для пустых строк.58- Деструктор [`io.IOBase`](https://python-all.ru/3.9/library/io.html#io.IOBase) регистрирует исключения `close()`.59- Устанавливает атрибут `dev_mode` объекта [`sys.flags`](https://python-all.ru/3.9/library/sys.html#sys.flags) в значение `True`.6061Режим разработки Python не включает модуль [`tracemalloc`](https://python-all.ru/3.9/library/tracemalloc.html#module-tracemalloc) по умолчанию, поскольку накладные расходы (на производительность и память) были бы слишком велики. Включение модуля [`tracemalloc`](https://python-all.ru/3.9/library/tracemalloc.html#module-tracemalloc) предоставляет дополнительную информацию о происхождении некоторых ошибок. Например, [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning) регистрирует трассировку, где был выделен ресурс, а ошибка переполнения буфера регистрирует трассировку, где был выделен блок памяти.6263Режим разработки Python не препятствует тому, чтобы опция командной строки [`-O`](https://python-all.ru/3.9/using/cmdline.html#cmdoption-o) удаляла операторы [`assert`](https://python-all.ru/3.9/reference/simple_stmts.html#assert) или устанавливала [`__debug__`](https://python-all.ru/3.9/library/constants.html#__debug__) в значение `False`.6465Изменено в версии 3.8: Деструктор [`io.IOBase`](https://python-all.ru/3.9/library/io.html#io.IOBase) теперь регистрирует исключения `close()`.6667Изменено в версии 3.9: Аргументы *encoding* и *errors* теперь проверяются для операций кодирования и декодирования строк.6869# Пример ResourceWarning7071Пример сценария, подсчитывающего количество строк текстового файла, указанного в командной строке:7273```python74import sys7576def main():77 fp = open(sys.argv[1])78 nlines = len(fp.readlines())79 print(nlines)80 # Файл закрывается неявно8182if __name__ == "__main__":83 main()84```8586Сценарий не закрывает файл явно. По умолчанию Python не выводит никаких предупреждений. Пример с файлом README.txt, который содержит 269 строк:8788```console89$ python3 script.py README.txt9026991```9293Включение режима разработки Python отображает предупреждение [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning):9495```console96$ python3 -X dev script.py README.txt9726998script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>99 main()100ResourceWarning: Enable tracemalloc to get the object allocation traceback101```102103Кроме того, включение [`tracemalloc`](https://python-all.ru/3.9/library/tracemalloc.html#module-tracemalloc) показывает строку, в которой файл был открыт:104105```console106$ python3 -X dev -X tracemalloc=5 script.py README.rst107269108script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>109 main()110Object allocated at (most recent call last):111 File "script.py", lineno 10112 main()113 File "script.py", lineno 4114 fp = open(sys.argv[1])115```116117Исправление – явно закрыть файл. Пример с использованием контекстного менеджера:118119```python120def main():121 # Закрывать файл явно при выходе из блока with122 with open(sys.argv[1]) as fp:123 nlines = len(fp.readlines())124 print(nlines)125```126127Явное незакрытие ресурса может оставить его открытым намного дольше, чем ожидалось; это может вызвать серьёзные проблемы при выходе из Python. Это плохо в CPython, но ещё хуже в PyPy. Явное закрытие ресурсов делает приложение более детерминированным и надёжным.128129# Пример ошибки «Bad file descriptor»130131Сценарий, выводящий свою первую строку:132133```python134import os135136def main():137 fp = open(__file__)138 firstline = fp.readline()139 print(firstline.rstrip())140 os.close(fp.fileno())141 # Файл закрывается неявно142143main()144```145146По умолчанию Python не выводит никаких предупреждений:147148```console149$ python3 script.py150import os151```152153Режим разработки Python показывает [`ResourceWarning`](https://python-all.ru/3.9/library/exceptions.html#ResourceWarning) и регистрирует ошибку «Bad file descriptor» при финализации объекта файла:154155```console156$ python3 script.py157import os158script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>159 main()160ResourceWarning: Enable tracemalloc to get the object allocation traceback161Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>162Traceback (most recent call last):163 File "script.py", line 10, in <module>164 main()165OSError: [Errno 9] Bad file descriptor166```167168`os.close(fp.fileno())` закрывает файловый дескриптор. Когда финализатор объекта файла пытается закрыть файловый дескриптор снова, это завершается ошибкой `Bad file descriptor`. Файловый дескриптор должен быть закрыт только один раз. В худшем случае повторное закрытие может привести к аварийному завершению (пример см. в [bpo-18748](https://python-all.ru/3.9/library/devmode.html)).169170Исправление – удалить строку `os.close(fp.fileno())` или открыть файл с `closefd=False`.171