Документация Python неофициальный перевод

devmode.md

171 строк · 12.8 КБ · обычная страница · сырой текст · скачать

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