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

devmode.md

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

1> **Источник:** https://python-all.ru/3.13/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.13/using/cmdline.html#cmdoption-X) или установив переменную окружения [`PYTHONDEVMODE`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONDEVMODE) в значение `1`.1415См. также [отладочную сборку Python](https://python-all.ru/3.13/using/configure.html#debug-build).1617## Эффекты режима разработки Python1819Включение режима разработки Python аналогично следующей команде, но с дополнительными эффектами, описанными ниже:2021```python22PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python -W default -X faulthandler23```2425Эффекты режима разработки Python:2627- Добавляет `default` [фильтр предупреждений](https://python-all.ru/3.13/library/warnings.html#describing-warning-filters). Отображаются следующие предупреждения:2829  - [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning)30  - [`ImportWarning`](https://python-all.ru/3.13/library/exceptions.html#ImportWarning)31  - [`PendingDeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#PendingDeprecationWarning)32  - [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning)3334  Обычно указанные выше предупреждения отфильтровываются стандартными [фильтрами предупреждений](https://python-all.ru/3.13/library/warnings.html#describing-warning-filters).3536  Поведение аналогично использованию опции командной строки [`-W default`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-W).3738  Используйте опцию командной строки [`-W error`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-W) или установите переменную окружения [`PYTHONWARNINGS`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONWARNINGS) в значение `error`, чтобы обрабатывать предупреждения как ошибки.39- Устанавливает отладочные перехватчики на распределители памяти для проверки:4041  - Опустошение буфера (buffer underflow)42  - Переполнение буфера43  - Нарушение API распределителя памяти44  - Небезопасное использование GIL4546  См. функцию [`PyMem_SetupDebugHooks()`](https://python-all.ru/3.13/c-api/memory.html#c.PyMem_SetupDebugHooks) на языке C.4748  Поведение аналогично установке переменной окружения [`PYTHONMALLOC`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONMALLOC) в значение `debug`.4950  Чтобы включить режим разработки Python без установки отладочных перехватчиков на распределители памяти, установите переменную окружения [`PYTHONMALLOC`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONMALLOC) в значение `default`.51- Вызов [`faulthandler.enable()`](https://python-all.ru/3.13/library/faulthandler.html#faulthandler.enable) при запуске Python устанавливает обработчики для сигналов [`SIGSEGV`](https://python-all.ru/3.13/library/signal.html#signal.SIGSEGV), [`SIGFPE`](https://python-all.ru/3.13/library/signal.html#signal.SIGFPE), [`SIGABRT`](https://python-all.ru/3.13/library/signal.html#signal.SIGABRT), [`SIGBUS`](https://python-all.ru/3.13/library/signal.html#signal.SIGBUS) и [`SIGILL`](https://python-all.ru/3.13/library/signal.html#signal.SIGILL), чтобы выводить трассировку Python при сбое.5253  Поведение аналогично использованию опции командной строки [`-X faulthandler`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-X) или установке переменной окружения [`PYTHONFAULTHANDLER`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONFAULTHANDLER) в значение `1`.54- Включает [отладочный режим asyncio](https://python-all.ru/3.13/library/asyncio-dev.html#asyncio-debug-mode). Например, [`asyncio`](https://python-all.ru/3.13/library/asyncio.html#module-asyncio) проверяет корутины, которые не были ожиданы (awaited), и регистрирует их.5556  Поведение аналогично установке переменной окружения [`PYTHONASYNCIODEBUG`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONASYNCIODEBUG) в значение `1`.57- Проверяет аргументы *encoding* и *errors* для операций кодирования и декодирования строк. Примеры: [`open()`](https://python-all.ru/3.13/library/functions.html#open), [`str.encode()`](https://python-all.ru/3.13/library/stdtypes.html#str.encode) и [`bytes.decode()`](https://python-all.ru/3.13/library/stdtypes.html#bytes.decode).5859  По умолчанию для максимальной производительности аргумент *errors* проверяется только при первой ошибке кодирования/декодирования, а аргумент *encoding* иногда игнорируется для пустых строк.60- Деструктор [`io.IOBase`](https://python-all.ru/3.13/library/io.html#io.IOBase) регистрирует исключения `close()`.61- Устанавливает атрибут [`dev_mode`](https://python-all.ru/3.13/library/sys.html#sys.flags.dev_mode) объекта [`sys.flags`](https://python-all.ru/3.13/library/sys.html#sys.flags) в значение `True`.6263Режим разработки Python не включает модуль [`tracemalloc`](https://python-all.ru/3.13/library/tracemalloc.html#module-tracemalloc) по умолчанию, поскольку накладные расходы (на производительность и память) были бы слишком велики. Включение модуля `tracemalloc` предоставляет дополнительную информацию о происхождении некоторых ошибок. Например, [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning) регистрирует трассировку, где был выделен ресурс, а ошибка переполнения буфера регистрирует трассировку, где был выделен блок памяти.6465Режим разработки Python не препятствует тому, чтобы опция командной строки [`-O`](https://python-all.ru/3.13/using/cmdline.html#cmdoption-O) удаляла операторы [`assert`](https://python-all.ru/3.13/reference/simple_stmts.html#assert) или устанавливала [`__debug__`](https://python-all.ru/3.13/library/constants.html#debug__) в значение `False`.6667Режим разработки Python может быть включён только при запуске Python. Его значение можно прочитать из [`sys.flags.dev_mode`](https://python-all.ru/3.13/library/sys.html#sys.flags).6869Изменено в версии 3.8: Деструктор [`io.IOBase`](https://python-all.ru/3.13/library/io.html#io.IOBase) теперь регистрирует исключения `close()`.7071Изменено в версии 3.9: Аргументы *encoding* и *errors* теперь проверяются для операций кодирования и декодирования строк.7273## Пример ResourceWarning7475Пример сценария, подсчитывающего количество строк текстового файла, указанного в командной строке:7677```python78import sys7980def main():81    fp = open(sys.argv[1])82    nlines = len(fp.readlines())83    print(nlines)84    # Файл закрывается неявно8586if __name__ == "__main__":87    main()88```8990Сценарий не закрывает файл явно. По умолчанию Python не выводит никаких предупреждений. Пример с файлом README.txt, который содержит 269 строк:9192```console93$ python script.py README.txt9426995```9697Включение режима разработки Python отображает предупреждение [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning):9899```console100$ python -X dev script.py README.txt101269102script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>103  main()104ResourceWarning: Enable tracemalloc to get the object allocation traceback105```106107Кроме того, включение [`tracemalloc`](https://python-all.ru/3.13/library/tracemalloc.html#module-tracemalloc) показывает строку, в которой файл был открыт:108109```console110$ python -X dev -X tracemalloc=5 script.py README.rst111269112script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>113  main()114Object allocated at (most recent call last):115  File "script.py", lineno 10116    main()117  File "script.py", lineno 4118    fp = open(sys.argv[1])119```120121Исправление – явно закрыть файл. Пример с использованием контекстного менеджера:122123```python124def main():125    # Закрывать файл явно при выходе из блока with126    with open(sys.argv[1]) as fp:127        nlines = len(fp.readlines())128    print(nlines)129```130131Явное незакрытие ресурса может оставить его открытым намного дольше, чем ожидалось; это может вызвать серьёзные проблемы при выходе из Python. Это плохо в CPython, но ещё хуже в PyPy. Явное закрытие ресурсов делает приложение более детерминированным и надёжным.132133## Пример ошибки «Bad file descriptor»134135Сценарий, выводящий свою первую строку:136137```python138import os139140def main():141    fp = open(__file__)142    firstline = fp.readline()143    print(firstline.rstrip())144    os.close(fp.fileno())145    # Файл закрывается неявно146147main()148```149150По умолчанию Python не выводит никаких предупреждений:151152```console153$ python script.py154import os155```156157Режим разработки Python показывает [`ResourceWarning`](https://python-all.ru/3.13/library/exceptions.html#ResourceWarning) и регистрирует ошибку «Bad file descriptor» при финализации объекта файла:158159```console160$ python -X dev script.py161import os162script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>163  main()164ResourceWarning: Enable tracemalloc to get the object allocation traceback165Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>166Traceback (most recent call last):167  File "script.py", line 10, in <module>168    main()169OSError: [Errno 9] Bad file descriptor170```171172`os.close(fp.fileno())` закрывает файловый дескриптор. Когда финализатор объекта файла пытается закрыть файловый дескриптор снова, это завершается ошибкой `Bad file descriptor`. Файловый дескриптор должен быть закрыт только один раз. В худшем случае повторное закрытие может привести к аварийному завершению (пример см. в [bpo-18748](https://python-all.ru/3.13/library/devmode.html)).173174Исправление – удалить строку `os.close(fp.fileno())` или открыть файл с `closefd=False`.175