3.4.md
1> **Источник:** https://python-all.ru/3.8/whatsnew/3.4.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.489**Автор**1011R. David Murray \<[rdmurray@bitdance.com](https://python-all.ru/3.8/whatsnew/3.4.html)\> (Редактор)1213Эта статья описывает новые возможности в Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 г. Для получения полной информации см. [список изменений](https://python-all.ru/3.4/whatsnew/changelog.html).1415> **См. также**16>17> [**PEP 429**](https://python-all.ru/3.8/whatsnew/3.4.html) – График выпуска Python 3.41819## Краткий обзор – Основные моменты выпуска2021Новые синтаксические возможности:2223- В Python 3.4 не было добавлено новых синтаксических возможностей.2425Другие новые возможности:2627- [pip всегда должен быть доступен](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-453) ([**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html)).28- [Вновь созданные файловые дескрипторы не наследуются](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-446) ([**PEP 446**](https://python-all.ru/3.8/whatsnew/3.4.html)).29- параметр командной строки для [изолированного режима](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-isolated-mode) ([bpo-16499](https://python-all.ru/3.8/whatsnew/3.4.html)).30- [улучшения в обработке кодеков](https://python-all.ru/3.8/whatsnew/3.4.html#codec-handling-improvements) , которые не являются текстовыми кодировками (множество проблем).31- [Тип ModuleSpec](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-451) для системы импорта ([**PEP 451**](https://python-all.ru/3.8/whatsnew/3.4.html)). (Влияет на авторов импортёров.)32- Формат [`marshal`](https://python-all.ru/3.8/library/marshal.html#module-marshal) был сделан [более компактным и эффективным](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-marshal-3) ([bpo-16475](https://python-all.ru/3.8/whatsnew/3.4.html)).3334Новые модули библиотеки:3536- [`asyncio`](https://python-all.ru/3.8/library/asyncio.html#module-asyncio): [Новый временный API для асинхронного ввода-вывода](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-asyncio) ([**PEP 3156**](https://python-all.ru/3.8/whatsnew/3.4.html)).37- [`ensurepip`](https://python-all.ru/3.8/library/ensurepip.html#module-ensurepip): [Начальная загрузка установщика pip](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-ensurepip) ([**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html)).38- [`enum`](https://python-all.ru/3.8/library/enum.html#module-enum): [Поддержка перечисляемых типов](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-enum) ([**PEP 435**](https://python-all.ru/3.8/whatsnew/3.4.html)).39- [`pathlib`](https://python-all.ru/3.8/library/pathlib.html#module-pathlib): [Объектно-ориентированные пути файловой системы](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pathlib) ([**PEP 428**](https://python-all.ru/3.8/whatsnew/3.4.html)).40- [`selectors`](https://python-all.ru/3.8/library/selectors.html#module-selectors): [Высокоуровневая и эффективная мультиплексация ввода-вывода](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-selectors), построенная на примитивах модуля [`select`](https://python-all.ru/3.8/library/select.html#module-select) (часть [**PEP 3156**](https://python-all.ru/3.8/whatsnew/3.4.html)).41- [`statistics`](https://python-all.ru/3.8/library/statistics.html#module-statistics): Базовая [численно устойчивая библиотека статистики](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-statistics) ([**PEP 450**](https://python-all.ru/3.8/whatsnew/3.4.html)).42- [`tracemalloc`](https://python-all.ru/3.8/library/tracemalloc.html#module-tracemalloc): [Трассировка выделений памяти Python](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-tracemalloc) ([**PEP 454**](https://python-all.ru/3.8/whatsnew/3.4.html)).4344Значительно улучшенные библиотечные модули:4546- [Обобщённые функции с одиночной диспетчеризацией](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-singledispatch) в [`functools`](https://python-all.ru/3.8/library/functools.html#module-functools) ([**PEP 443**](https://python-all.ru/3.8/whatsnew/3.4.html)).47- Новый [`pickle`](https://python-all.ru/3.8/library/pickle.html#module-pickle) [протокол 4](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-protocol-4) ([**PEP 3154**](https://python-all.ru/3.8/whatsnew/3.4.html)).48- [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing) теперь имеет [опцию для избежания использования os.fork на Unix](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-multiprocessing-no-fork) ([bpo-8713](https://python-all.ru/3.8/whatsnew/3.4.html)).49- [`email`](https://python-all.ru/3.8/library/email.html#module-email) имеет новый подмодуль [`contentmanager`](https://python-all.ru/3.8/library/email.contentmanager.html#module-email.contentmanager) и новый подкласс [`Message`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message) (`EmailMessage`), которые [упрощают обработку MIME](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-email-contentmanager) ([bpo-18891](https://python-all.ru/3.8/whatsnew/3.4.html)).50- Модули [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect) и [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc) теперь могут корректно выполнять интроспекцию гораздо более широкого множества вызываемых объектов, что улучшает вывод системы [`help()`](https://python-all.ru/3.8/library/functions.html#help) Python.51- API модуля [`ipaddress`](https://python-all.ru/3.8/library/ipaddress.html#module-ipaddress) объявлен стабильным.5253Улучшения в области безопасности:5455- [Безопасный и взаимозаменяемый алгоритм хеширования](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-456) ([**PEP 456**](https://python-all.ru/3.8/whatsnew/3.4.html)).56- [Сделать вновь созданные файловые дескрипторы ненаследуемыми](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-446) ([**PEP 446**](https://python-all.ru/3.8/whatsnew/3.4.html)), чтобы избежать утечки файловых дескрипторов в дочерние процессы.57- Новая опция командной строки для [изолированного режима](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-isolated-mode), ([bpo-16499](https://python-all.ru/3.8/whatsnew/3.4.html)).58- [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing) теперь имеет [опцию, позволяющую избежать использования os.fork в Unix](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-multiprocessing-no-fork). Методы *spawn* и *forkserver* более безопасны, поскольку не разделяют данные с дочерними процессами.59- [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing) дочерние процессы в Windows больше не наследуют все наследуемые дескрипторы родительского процесса, а только необходимые.60- Новая функция [`hashlib.pbkdf2_hmac()`](https://python-all.ru/3.8/library/hashlib.html#hashlib.pbkdf2_hmac) предоставляет [функцию формирования ключа на основе пароля PKCS#5 версии 2](https://python-all.ru/3.8/whatsnew/3.4.html).61- [Поддержка TLSv1.1 и TLSv1.2](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-tls-11-12) для [`ssl`](https://python-all.ru/3.8/library/ssl.html#module-ssl).62- [Поддержка извлечения сертификатов из хранилища сертификатов системы Windows](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew34-win-cert-store) для [`ssl`](https://python-all.ru/3.8/library/ssl.html#module-ssl).63- [Поддержка SNI (Server Name Indication) на стороне сервера](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew34-sni) для [`ssl`](https://python-all.ru/3.8/library/ssl.html#module-ssl).64- Класс [`ssl.SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) получил [много улучшений](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew34-sslcontext).65- Все модули стандартной библиотеки, поддерживающие SSL, теперь поддерживают проверку сертификатов сервера, включая проверку имени узла ([`ssl.match_hostname()`](https://python-all.ru/3.8/library/ssl.html#ssl.match_hostname)) и списков отзыва сертификатов (CRL, см. [`ssl.SSLContext.load_verify_locations()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.load_verify_locations)).6667Улучшения реализации CPython:6869- [Безопасная финализация объектов](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-442) ([**PEP 442**](https://python-all.ru/3.8/whatsnew/3.4.html)).70- Используя [**PEP 442**](https://python-all.ru/3.8/whatsnew/3.4.html), в большинстве случаев [глобальные переменные модуля больше не устанавливаются в None во время финализации](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-442) ([bpo-18214](https://python-all.ru/3.8/whatsnew/3.4.html)).71- [Настраиваемые распределители памяти](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-445) ([**PEP 445**](https://python-all.ru/3.8/whatsnew/3.4.html)).72- [Argument Clinic](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-436) ([**PEP 436**](https://python-all.ru/3.8/whatsnew/3.4.html))7374Читайте далее полный список изменений, влияющих на пользователей, включая множество других небольших улучшений, оптимизаций CPython, устаревших возможностей и потенциальных проблем при переносе.7576## Новые возможности7778### PEP 453: Явная начальная загрузка PIP в установках Python7980#### Автоматическая установка pip по умолчанию8182Новый модуль [`ensurepip`](https://python-all.ru/3.8/library/ensurepip.html#module-ensurepip) (определённый в [**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html)) предоставляет стандартный кроссплатформенный механизм для начальной загрузки установщика pip в установки Python и виртуальные окружения. Версия `pip`, включённая в Python 3.4.0, – `pip` 1.5.4, и в будущих выпусках 3.4.x будет обновляться до последней версии `pip`, доступной на момент создания кандидата в релиз.8384По умолчанию команды `pipX` и `pipX.Y` будут установлены на всех платформах (где X.Y обозначает версию установки Python), вместе с пакетом Python `pip` и его зависимостями. В Windows и в виртуальных окружениях на всех платформах также будет установлена команда `pip` без указания версии. На других платформах команда `pip` без указания версии обычно ссылается на отдельно установленную версию Python 2.8586Утилита командной строки `pyvenv` и модуль [`venv`](https://python-all.ru/3.8/library/venv.html#module-venv) используют модуль [`ensurepip`](https://python-all.ru/3.8/library/ensurepip.html#module-ensurepip), чтобы сделать `pip` легкодоступным в виртуальных окружениях. При использовании утилиты командной строки `pip` устанавливается по умолчанию, а при использовании модуля [`venv`](https://python-all.ru/3.8/library/venv.html#module-venv) [API](https://python-all.ru/3.8/library/venv.html#venv-api) установка `pip` должна быть запрошена явно.8788Для [сборок CPython из исходного кода на системах POSIX](https://python-all.ru/3.8/using/unix.html#building-python-on-unix) команды `make install` и `make altinstall` по умолчанию выполняют начальную загрузку `pip`. Это поведение можно контролировать с помощью опций configure и переопределять с помощью опций Makefile.8990В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают `pip` вместе с самим CPython (пользователи могут отказаться от его установки в процессе установки). Пользователям Windows потребуется согласиться на автоматическое изменение `PATH`, чтобы `pip` был доступен из командной строки по умолчанию; в противном случае его можно запустить через Python launcher для Windows как `py -m pip`.9192Как [обсуждается в PEP](https://python-all.ru/3.8/whatsnew/3.4.html), разработчики дистрибутивов могут принять решение не устанавливать эти команды по умолчанию, при условии, что при их вызове они предоставляют четкие и простые инструкции по их установке на этой платформе (обычно с помощью системного менеджера пакетов).9394> **Примечание**95>96> Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3, только команды с указанием версии `pip3` и `pip3.4` загружаются по умолчанию при прямом вызове `ensurepip` – опция `--default-pip` необходима для дополнительного запроса команды `pip` без указания версии. `pyvenv` и установщик Windows гарантируют, что команда `pip` без квалификатора доступна в этих средах, а `pip` всегда можно вызвать через ключ `-m`, а не напрямую, чтобы избежать неоднозначности в системах с несколькими установками Python.9798#### Изменения в документации99100В рамках этого изменения разделы [Установка модулей Python](https://python-all.ru/3.8/installing/index.html#installing-index) и [Распространение модулей Python](https://python-all.ru/3.8/distributing/index.html#distributing-index) документации были полностью переработаны в короткие вводные руководства и FAQ. Большая часть документации по упаковке теперь перенесена в [Руководство пользователя по упаковке Python](https://python-all.ru/3.8/whatsnew/3.4.html), поддерживаемое Python Packaging Authority, и в документацию отдельных проектов.101102Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как [Installing Python Modules (Legacy version)](https://python-all.ru/3.8/install/index.html#install-index) и [Distributing Python Modules (Legacy version)](https://python-all.ru/3.8/distutils/index.html#distutils-index).103104> **См. также**105>106> **[**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html) – Явная автоматическая установка pip в дистрибутивах Python**107>108> PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.109110### PEP 446: Вновь созданные файловые дескрипторы являются ненаследуемыми111112[**PEP 446**](https://python-all.ru/3.8/whatsnew/3.4.html) делает вновь созданные файловые дескрипторы [ненаследуемыми](https://python-all.ru/3.8/library/os.html#fd-inheritance). В целом, это поведение, которое нужно приложению: при запуске нового процесса наличие открытых файлов также открытыми в новом процессе может привести к всевозможным труднонаходимым ошибкам и потенциально к проблемам безопасности.113114Однако бывают случаи, когда наследование желательно. Для поддержки этих случаев доступны следующие новые функции и методы:115116- [`os.get_inheritable()`](https://python-all.ru/3.8/library/os.html#os.get_inheritable), [`os.set_inheritable()`](https://python-all.ru/3.8/library/os.html#os.set_inheritable)117- [`os.get_handle_inheritable()`](https://python-all.ru/3.8/library/os.html#os.get_handle_inheritable), [`os.set_handle_inheritable()`](https://python-all.ru/3.8/library/os.html#os.set_handle_inheritable)118- [`socket.socket.get_inheritable()`](https://python-all.ru/3.8/library/socket.html#socket.socket.get_inheritable), [`socket.socket.set_inheritable()`](https://python-all.ru/3.8/library/socket.html#socket.socket.set_inheritable)119120> **См. также**121>122> **[**PEP 446**](https://python-all.ru/3.8/whatsnew/3.4.html) – Сделать вновь созданные файловые дескрипторы ненаследуемыми**123>124> PEP написан и реализован Victor Stinner.125126### Улучшения в работе с кодеками127128С момента своего появления модуль [`codecs`](https://python-all.ru/3.8/library/codecs.html#module-codecs) всегда задумывался как типонезависимая динамическая система кодирования и декодирования. Однако его тесная связь с текстовой моделью Python, особенно с типозависимыми вспомогательными методами встроенных типов [`str`](https://python-all.ru/3.8/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.8/library/stdtypes.html#bytearray), исторически затемняла этот факт.129130В качестве ключевого шага для прояснения ситуации вспомогательные функции [`codecs.encode()`](https://python-all.ru/3.8/library/codecs.html#codecs.encode) и [`codecs.decode()`](https://python-all.ru/3.8/library/codecs.html#codecs.decode) теперь должным образом задокументированы в Python 2.7, 3.3 и 3.4. Эти функции существуют в модуле [`codecs`](https://python-all.ru/3.8/library/codecs.html#module-codecs) (и покрыты регрессионными тестами) начиная с Python 2.4, но ранее их можно было обнаружить только через интроспекцию во время выполнения.131132В отличие от вспомогательных методов для [`str`](https://python-all.ru/3.8/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.8/library/stdtypes.html#bytearray), вспомогательные функции [`codecs`](https://python-all.ru/3.8/library/codecs.html#module-codecs) поддерживают произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются кодировками Unicode (в Python 3) или преобразованиями `basestring` \<-\> `basestring` (в Python 2).133134В Python 3.4 интерпретатор может распознавать известные нетекстовые кодировки, предоставляемые стандартной библиотекой, и при необходимости направлять пользователей к этим универсальным вспомогательным функциям:135136```python137>>> b"abcdef".decode("hex")138Traceback (most recent call last):139 File "<stdin>", line 1, in <module>140LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs141142>>> "hello".encode("rot13")143Traceback (most recent call last):144 File "<stdin>", line 1, in <module>145LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs146147>>> open("foo.txt", encoding="hex")148Traceback (most recent call last):149 File "<stdin>", line 1, in <module>150LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs151```152153В связи с этим изменением, когда это возможно без нарушения обратной совместимости, исключения, возникающие во время операций кодирования и декодирования, оборачиваются в цепочку исключений того же типа, которая упоминает имя кодека, ответственного за ошибку:154155```python156>>> import codecs157158>>> codecs.decode(b"abcdefgh", "hex")159Traceback (most recent call last):160 File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode161 return (binascii.a2b_hex(input), len(input))162binascii.Error: Non-hexadecimal digit found163164The above exception was the direct cause of the following exception:165166Traceback (most recent call last):167 File "<stdin>", line 1, in <module>168binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)169170>>> codecs.encode("hello", "bz2")171Traceback (most recent call last):172 File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode173 return (bz2.compress(input), len(input))174 File "/usr/lib/python3.4/bz2.py", line 498, in compress175 return comp.compress(data) + comp.flush()176TypeError: 'str' does not support the buffer interface177178The above exception was the direct cause of the following exception:179180Traceback (most recent call last):181 File "<stdin>", line 1, in <module>182TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)183```184185Наконец, как показывают примеры выше, эти улучшения позволили восстановить вспомогательные псевдонимы для неюникодных кодеков, которые сами были восстановлены в Python 3.2. Это означает, что кодирование двоичных данных в их шестнадцатеричное представление и обратно (например) теперь можно записать так:186187```python188>>> from codecs import encode, decode189>>> encode(b"hello", "hex")190b'68656c6c6f'191>>> decode(b"68656c6c6f", "hex")192b'hello'193```194195Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в [Двоичные преобразования](https://python-all.ru/3.8/library/codecs.html#binary-transforms) и [Текстовые преобразования](https://python-all.ru/3.8/library/codecs.html#text-transforms).196197(Автор: Nick Coghlan в [bpo-7475](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-17827](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-17828](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-19619](https://python-all.ru/3.8/whatsnew/3.4.html).)198199### PEP 451: Тип ModuleSpec для системы импорта200201[**PEP 451**](https://python-all.ru/3.8/whatsnew/3.4.html) предоставляет инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (то есть спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько API, связанных с импортом. Это изменение также является ступенькой к [нескольким будущим улучшениям импорта](https://python-all.ru/3.8/whatsnew/3.4.html).202203Изменения, видимые публично, полностью обратно совместимы. Более того, они должны быть незаметны для всех, кроме авторов импортеров. Ключевые методы finder и loader объявлены устаревшими, но продолжат работать. Новые импортеры должны использовать новые методы, описанные в PEP. Существующие импортеры следует обновить для реализации новых методов. См. раздел [Устаревшее](https://python-all.ru/3.8/whatsnew/3.4.html#deprecated-3-4) со списком методов, которые следует заменить, и их замен.204205### Прочие изменения языка206207Некоторые небольшие изменения, внесённые в ядро языка Python:208209- База данных Unicode обновлена до версии UCD 6.3.210- [`min()`](https://python-all.ru/3.8/library/functions.html#min) и [`max()`](https://python-all.ru/3.8/library/functions.html#max) теперь принимают аргумент *default*, передаваемый только по ключу, который можно использовать для указания значения, возвращаемого, если итерируемый объект, который они вычисляют, не содержит элементов. (Автор: Julian Berman в [bpo-18111](https://python-all.ru/3.8/whatsnew/3.4.html).)211- Объекты модулей теперь [`weakref`](https://python-all.ru/3.8/library/weakref.html#module-weakref)'уемы.212- Атрибуты модуля `__file__` (и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением `__main__.__file__`, когда скрипт был выполнен напрямую с использованием относительного пути. (Автор: Brett Cannon в [bpo-18416](https://python-all.ru/3.8/whatsnew/3.4.html).)213- Все кодеки UTF-\* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если только не используется обработчик ошибок `surrogatepass`, за исключением декодера UTF-16 (который принимает допустимые суррогатные пары) и кодера UTF-16 (который создает их при кодировании символов вне BMP). (Авторы: Victor Stinner, Kang-Hao (Kenny) Lu и Serhiy Storchaka в [bpo-12892](https://python-all.ru/3.8/whatsnew/3.4.html).)214- Новый [кодек](https://python-all.ru/3.8/library/codecs.html#standard-encodings) для немецкого EBCDIC `cp273`. (Авторы: Michael Bierenfeld и Andrew Kuchling в [bpo-1097797](https://python-all.ru/3.8/whatsnew/3.4.html).)215- Новый [кодек](https://python-all.ru/3.8/library/codecs.html#standard-encodings) украинского `cp1125`. (Автор: Serhiy Storchaka в [bpo-19668](https://python-all.ru/3.8/whatsnew/3.4.html).)216- [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes).join() и [`bytearray`](https://python-all.ru/3.8/library/stdtypes.html#bytearray).join() теперь принимают произвольные буферные объекты в качестве аргументов. (Автор: Antoine Pitrou в [bpo-15958](https://python-all.ru/3.8/whatsnew/3.4.html).)217- Конструктор [`int`](https://python-all.ru/3.8/library/functions.html#int) теперь принимает любой объект, имеющий метод `__index__`, для своего аргумента *base*. (Автор: Mark Dickinson в [bpo-16772](https://python-all.ru/3.8/whatsnew/3.4.html).)218- Объекты фреймов теперь имеют метод [`clear()`](https://python-all.ru/3.8/reference/datamodel.html#frame.clear), который очищает все ссылки на локальные переменные из фрейма. (Автор: Antoine Pitrou в [bpo-17934](https://python-all.ru/3.8/whatsnew/3.4.html).)219- [`memoryview`](https://python-all.ru/3.8/library/stdtypes.html#memoryview) теперь зарегистрирован как [`Sequence`](https://python-all.ru/3.8/library/collections.abc.html#module-collections.abc) и поддерживает встроенную функцию [`reversed()`](https://python-all.ru/3.8/library/functions.html#reversed). (Авторы: Nick Coghlan и Claudiu Popa в [bpo-18690](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-19078](https://python-all.ru/3.8/whatsnew/3.4.html).)220- Сигнатуры, сообщаемые [`help()`](https://python-all.ru/3.8/library/functions.html#help), были изменены и улучшены в ряде случаев в результате внедрения Argument Clinic и других изменений в модули [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect) и [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc).221- [`__length_hint__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__length_hint__) теперь является частью формальной спецификации языка (см. [**PEP 424**](https://python-all.ru/3.8/whatsnew/3.4.html)). (Автор: Armin Ronacher в [bpo-16148](https://python-all.ru/3.8/whatsnew/3.4.html).)222223## Новые модули224225### asyncio226227Новый модуль [`asyncio`](https://python-all.ru/3.8/library/asyncio.html#module-asyncio) (определённый в [**PEP 3156**](https://python-all.ru/3.8/whatsnew/3.4.html)) предоставляет стандартную подключаемую модель цикла событий для Python, обеспечивая надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и упрощая взаимодействие других реализаций цикла событий со стандартной библиотекой и друг с другом.228229Для Python 3.4 этот модуль считается [временным API](https://python-all.ru/3.8/glossary.html#term-provisional-api).230231> **См. также**232>233> **[**PEP 3156**](https://python-all.ru/3.8/whatsnew/3.4.html) – Асинхронный ввод-вывод: перезагрузка: модуль «asyncio»**234>235> PEP написан, реализацией руководил Гвидо ван Россум.236237### ensurepip238239Новый модуль [`ensurepip`](https://python-all.ru/3.8/library/ensurepip.html#module-ensurepip) – это основная инфраструктура для реализации [**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html). В обычной ситуации конечным пользователям не нужно взаимодействовать с этим модулем, но его можно использовать для ручной начальной загрузки `pip`, если автоматическая начальная загрузка в установку или виртуальное окружение была отклонена.240241[`ensurepip`](https://python-all.ru/3.8/library/ensurepip.html#module-ensurepip) включает в себя встроенную копию `pip`, актуальную на момент первого кандидата в релизы (release candidate) того выпуска CPython, с которым она поставляется (это относится как к корректирующим выпускам, так и к функциональным). `ensurepip` не обращается к интернету. Если в системе есть доступ в интернет, после выполнения `ensurepip` встроенный `pip` можно использовать для обновления `pip` до более свежей версии, чем встроенная. (Обратите внимание: такая обновлённая версия `pip` считается отдельно установленным пакетом и не будет удалена при деинсталляции Python.)242243Модуль называется *ensure*pip, потому что при вызове, когда `pip` уже установлен, он ничего не делает. Также у него есть опция `--upgrade`, которая заставляет его установить встроенную копию `pip`, если существующая установленная версия `pip` старше встроенной копии.244245### enum246247Новый модуль [`enum`](https://python-all.ru/3.8/library/enum.html#module-enum) (определённый в [**PEP 435**](https://python-all.ru/3.8/whatsnew/3.4.html)) предоставляет стандартную реализацию перечислений, позволяя другим модулям (таким как [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket)) давать более информативные сообщения об ошибках и лучше поддерживать отладку, заменяя непрозрачные целочисленные константы на обратно совместимые значения перечислений.248249> **См. также**250>251> **[**PEP 435**](https://python-all.ru/3.8/whatsnew/3.4.html) – Добавление типа Enum в стандартную библиотеку Python**252>253> PEP написан Барри Варшавой, Илай Бендерски и Итаном Фурманом, реализован Итаном Фурманом.254255### pathlib256257Новый модуль [`pathlib`](https://python-all.ru/3.8/library/pathlib.html#module-pathlib) предлагает классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на *чистые пути*, которые предоставляют исключительно вычислительные операции без ввода-вывода, и *конкретные пути*, которые наследуются от чистых путей, но также предоставляют операции ввода-вывода.258259Для Python 3.4 этот модуль считается [временным API](https://python-all.ru/3.8/glossary.html#term-provisional-api).260261> **См. также**262>263> **[**PEP 428**](https://python-all.ru/3.8/whatsnew/3.4.html) – Модуль pathlib – объектно-ориентированные пути файловой системы**264>265> PEP написан и реализован Antoine Pitrou.266267### selectors268269Новый модуль [`selectors`](https://python-all.ru/3.8/library/selectors.html#module-selectors) (созданный в рамках реализации [**PEP 3156**](https://python-all.ru/3.8/whatsnew/3.4.html)) позволяет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля [`select`](https://python-all.ru/3.8/library/select.html#module-select).270271### statistics272273Новый модуль [`statistics`](https://python-all.ru/3.8/library/statistics.html#module-statistics) (определённый в [**PEP 450**](https://python-all.ru/3.8/whatsnew/3.4.html)) предлагает некоторую основную статистическую функциональность прямо в стандартной библиотеке. Этот модуль поддерживает вычисление среднего, медианы, моды, дисперсии и стандартного отклонения ряда данных.274275> **См. также**276>277> **[**PEP 450**](https://python-all.ru/3.8/whatsnew/3.4.html) – Добавление модуля статистики в стандартную библиотеку**278>279> PEP написан и реализован Стивеном Д’Апрано280281### tracemalloc282283Новый модуль [`tracemalloc`](https://python-all.ru/3.8/library/tracemalloc.html#module-tracemalloc) (определённый в [**PEP 454**](https://python-all.ru/3.8/whatsnew/3.4.html)) – это инструмент отладки для отслеживания блоков памяти, выделенных Python. Он предоставляет следующую информацию:284285- Отслеживание места выделения объекта286- Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти287- Вычисление различий между двумя снимками для обнаружения утечек памяти288289> **См. также**290>291> **[**PEP 454**](https://python-all.ru/3.8/whatsnew/3.4.html) – Добавление нового модуля tracemalloc для отслеживания выделений памяти Python**292>293> Автор PEP и разработчик: Victor Stinner294295## Улучшенные модули296297### abc298299Новая функция [`abc.get_cache_token()`](https://python-all.ru/3.8/library/abc.html#abc.get_cache_token) может использоваться для определения момента, когда нужно аннулировать кэши, затронутые изменениями в графе объектов. (Вклад Лукаша Ланги в [bpo-16832](https://python-all.ru/3.8/whatsnew/3.4.html).)300301Новый класс [`ABC`](https://python-all.ru/3.8/library/abc.html#abc.ABC) имеет [`ABCMeta`](https://python-all.ru/3.8/library/abc.html#abc.ABCMeta) в качестве своего метакласса. Использование `ABC` в качестве базового класса даёт по сути тот же эффект, что и указание `metaclass=abc.ABCMeta`, но проще в наборе и легче читается. (Вклад Бруно Дюпюи в [bpo-16049](https://python-all.ru/3.8/whatsnew/3.4.html).)302303### aifc304305Метод [`getparams()`](https://python-all.ru/3.8/library/aifc.html#aifc.aifc.getparams) теперь возвращает namedtuple вместо обычного кортежа. (Вклад Клаудиу Попа в [bpo-17818](https://python-all.ru/3.8/whatsnew/3.4.html).)306307[`aifc.open()`](https://python-all.ru/3.8/library/aifc.html#aifc.open) теперь поддерживает протокол управления контекстом: при использовании в блоке [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) метод [`close()`](https://python-all.ru/3.8/library/aifc.html#aifc.aifc.close) возвращённого объекта будет вызван автоматически в конце блока. (Вклад Сергия Сторчаки в [bpo-16486](https://python-all.ru/3.8/whatsnew/3.4.html).)308309Методы [`writeframesraw()`](https://python-all.ru/3.8/library/aifc.html#aifc.aifc.writeframesraw) и [`writeframes()`](https://python-all.ru/3.8/library/aifc.html#aifc.aifc.writeframes) теперь принимают любой [объект, подобный bytes](https://python-all.ru/3.8/glossary.html#term-bytes-like-object). (Вклад Сергия Сторчаки в [bpo-8311](https://python-all.ru/3.8/whatsnew/3.4.html).)310311### argparse312313Класс [`FileType`](https://python-all.ru/3.8/library/argparse.html#argparse.FileType) теперь принимает аргументы *encoding* и *errors*, которые передаются в [`open()`](https://python-all.ru/3.8/library/functions.html#open). (Автор: Lucas Maystre в [bpo-11175](https://python-all.ru/3.8/whatsnew/3.4.html).)314315### audioop316317[`audioop`](https://python-all.ru/3.8/library/audioop.html#module-audioop) теперь поддерживает 24-битные семплы. (Автор: Serhiy Storchaka в [bpo-12866](https://python-all.ru/3.8/whatsnew/3.4.html).)318319Новая функция [`byteswap()`](https://python-all.ru/3.8/library/audioop.html#audioop.byteswap) преобразует big-endian семплы в little-endian и обратно. (Автор: Serhiy Storchaka в [bpo-19641](https://python-all.ru/3.8/whatsnew/3.4.html).)320321Все функции [`audioop`](https://python-all.ru/3.8/library/audioop.html#module-audioop) теперь принимают любой [bytes-like object](https://python-all.ru/3.8/glossary.html#term-bytes-like-object). Строки не принимаются: раньше они не работали, теперь сразу вызывают ошибку. (Автор: Serhiy Storchaka в [bpo-16685](https://python-all.ru/3.8/whatsnew/3.4.html).)322323### base64324325Функции кодирования и декодирования в [`base64`](https://python-all.ru/3.8/library/base64.html#module-base64) теперь принимают любой [bytes-like object](https://python-all.ru/3.8/glossary.html#term-bytes-like-object) в тех случаях, когда раньше требовался экземпляр [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes) или [`bytearray`](https://python-all.ru/3.8/library/stdtypes.html#bytearray). (Автор: Nick Coghlan в [bpo-17839](https://python-all.ru/3.8/whatsnew/3.4.html).)326327New functions [`a85encode()`](https://python-all.ru/3.8/library/base64.html#base64.a85encode), [`a85decode()`](https://python-all.ru/3.8/library/base64.html#base64.a85decode), [`b85encode()`](https://python-all.ru/3.8/library/base64.html#base64.b85encode), and [`b85decode()`](https://python-all.ru/3.8/library/base64.html#base64.b85decode) provide the ability to encode and decode binary data from and to `Ascii85` and the git/mercurial `Base85` formats, respectively. The `a85` functions have options that can be used to make them compatible with the variants of the `Ascii85` encoding, including the Adobe variant. (Contributed by Martin Morrison, the Mercurial project, Serhiy Storchaka, and Antoine Pitrou in [bpo-17618](https://python-all.ru/3.8/whatsnew/3.4.html).)328329### collections330331Метод [`ChainMap.new_child()`](https://python-all.ru/3.8/library/collections.html#collections.ChainMap.new_child) теперь принимает аргумент *m*, задающий дочернее отображение для добавления в цепочку. Это позволяет использовать существующее отображение и/или пользовательский тип отображения в качестве дочернего. (Автор: Vinay Sajip в [bpo-16613](https://python-all.ru/3.8/whatsnew/3.4.html).)332333### colorsys334335Количество цифр в коэффициентах для преобразований RGB – YIQ было увеличено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов должно быть менее 1% и может лучше соответствовать результатам, полученным в других местах. (Авторы: Brian Landers и Serhiy Storchaka в [bpo-14323](https://python-all.ru/3.8/whatsnew/3.4.html).)336337### contextlib338339Новый менеджер контекста [`contextlib.suppress`](https://python-all.ru/3.8/library/contextlib.html#contextlib.suppress) помогает прояснить намерение кода, который намеренно подавляет исключения из одного оператора. (Авторы: Raymond Hettinger в [bpo-15806](https://python-all.ru/3.8/whatsnew/3.4.html) и Zero Piraeus в [bpo-19266](https://python-all.ru/3.8/whatsnew/3.4.html).)340341Новый менеджер контекста [`contextlib.redirect_stdout()`](https://python-all.ru/3.8/library/contextlib.html#contextlib.redirect_stdout) упрощает для служебных скриптов работу с негибкими API, которые записывают свой вывод в [`sys.stdout`](https://python-all.ru/3.8/library/sys.html#sys.stdout) и не предоставляют возможностей для его перенаправления. Используя менеджер контекста, вывод [`sys.stdout`](https://python-all.ru/3.8/library/sys.html#sys.stdout) можно перенаправить на любой другой поток или, совместно с [`io.StringIO`](https://python-all.ru/3.8/library/io.html#io.StringIO), в строку. Последнее может быть особенно полезно, например, для захвата вывода функции, написанной для реализации интерфейса командной строки. Рекомендуется использовать только в служебных скриптах, поскольку это влияет на глобальное состояние [`sys.stdout`](https://python-all.ru/3.8/library/sys.html#sys.stdout). (Автор: Raymond Hettinger в [bpo-15805](https://python-all.ru/3.8/whatsnew/3.4.html).)342343Документация [`contextlib`](https://python-all.ru/3.8/library/contextlib.html#module-contextlib) также была обновлена и теперь включает [обсуждение](https://python-all.ru/3.8/library/contextlib.html#single-use-reusable-and-reentrant-cms) различий между одноразовыми, многократно используемыми и реентерабельными менеджерами контекста.344345### dbm346347Объекты [`dbm.open()`](https://python-all.ru/3.8/library/dbm.html#dbm.open) теперь поддерживают протокол управления контекстом. При использовании в операторе [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) метод `close` объекта базы данных будет вызываться автоматически в конце блока. (Авторы: Claudiu Popa и Nick Coghlan в [bpo-19282](https://python-all.ru/3.8/whatsnew/3.4.html).)348349### dis350351Функции [`show_code()`](https://python-all.ru/3.8/library/dis.html#dis.show_code), [`dis()`](https://python-all.ru/3.8/library/dis.html#dis.dis), [`distb()`](https://python-all.ru/3.8/library/dis.html#dis.distb) и [`disassemble()`](https://python-all.ru/3.8/library/dis.html#dis.disassemble) теперь принимают только ключевой аргумент *file*, который управляет тем, куда они записывают свой вывод.352353Модуль [`dis`](https://python-all.ru/3.8/library/dis.html#module-dis) теперь построен на основе класса [`Instruction`](https://python-all.ru/3.8/library/dis.html#dis.Instruction), который предоставляет объектно-ориентированный доступ к деталям каждой отдельной операции байт-кода.354355Новый метод [`get_instructions()`](https://python-all.ru/3.8/library/dis.html#dis.get_instructions) предоставляет итератор, который генерирует поток инструкций для данного фрагмента кода Python. Таким образом, теперь можно написать программу, которая анализирует и изменяет объект байт-кода способами, отличными от тех, что предоставляет сам модуль [`dis`](https://python-all.ru/3.8/library/dis.html#module-dis). Например:356357```python358>>> import dis359>>> for instr in dis.get_instructions(lambda x: x + 1):360... print(instr.opname)361LOAD_FAST362LOAD_CONST363BINARY_ADD364RETURN_VALUE365```366367Различные инструменты отображения в модуле [`dis`](https://python-all.ru/3.8/library/dis.html#module-dis) были переписаны для использования этих новых компонентов.368369Кроме того, новый ориентированный на приложения класс [`Bytecode`](https://python-all.ru/3.8/library/dis.html#dis.Bytecode) предоставляет объектно-ориентированный API для анализа байт-кода как в человекочитаемой форме, так и для итерации по инструкциям. Конструктор [`Bytecode`](https://python-all.ru/3.8/library/dis.html#dis.Bytecode) принимает те же аргументы, что и `get_instruction()` (плюс необязательный *current\_offset*), и полученный объект можно итерировать для получения объектов [`Instruction`](https://python-all.ru/3.8/library/dis.html#dis.Instruction). Но он также имеет метод [`dis`](https://python-all.ru/3.8/library/dis.html#dis.Bytecode.dis), эквивалентный вызову [`dis`](https://python-all.ru/3.8/library/dis.html#dis.dis) с аргументом конструктора, но возвращаемый как многострочная строка:370371```python372>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)373>>> for instr in bytecode:374... print('{} ({})'.format(instr.opname, instr.opcode))375LOAD_FAST (124)376LOAD_CONST (100)377BINARY_ADD (23)378RETURN_VALUE (83)379>>> bytecode.dis().splitlines() 380[' 1 0 LOAD_FAST 0 (x)',381 ' --> 3 LOAD_CONST 1 (1)',382 ' 6 BINARY_ADD',383 ' 7 RETURN_VALUE']384```385386[`Bytecode`](https://python-all.ru/3.8/library/dis.html#dis.Bytecode) также имеет метод класса [`from_traceback()`](https://python-all.ru/3.8/library/dis.html#dis.Bytecode.from_traceback), который позволяет манипулировать traceback (то есть `print(Bytecode.from_traceback(tb).dis())` эквивалентно `distb(tb)`).387388(Авторы: Nick Coghlan, Ryan Kelly и Thomas Kluyver в [bpo-11816](https://python-all.ru/3.8/whatsnew/3.4.html) и Claudiu Popa в [bpo-17916](https://python-all.ru/3.8/whatsnew/3.4.html).)389390Новая функция [`stack_effect()`](https://python-all.ru/3.8/library/dis.html#dis.stack_effect) вычисляет влияние на стек Python заданного опкода и аргумента – информацию, которая иначе недоступна. (Автор: Larry Hastings в [bpo-19722](https://python-all.ru/3.8/whatsnew/3.4.html).)391392### doctest393394Новый [флаг опции](https://python-all.ru/3.8/library/doctest.html#doctest-options), [`FAIL_FAST`](https://python-all.ru/3.8/library/doctest.html#doctest.FAIL_FAST), останавливает выполнение теста сразу после обнаружения первого сбоя. (Авторы: R. David Murray и Daniel Urban в [bpo-16522](https://python-all.ru/3.8/whatsnew/3.4.html).)395396Интерфейс командной строки [`doctest`](https://python-all.ru/3.8/library/doctest.html#module-doctest) теперь использует [`argparse`](https://python-all.ru/3.8/library/argparse.html#module-argparse), и имеет две новые опции: `-o` и `-f`. `-o` позволяет указывать [опции doctest](https://python-all.ru/3.8/library/doctest.html#doctest-options) в командной строке, а `-f` является сокращением для `-o FAIL_FAST` (по аналогии с подобной опцией, поддерживаемой CLI [`unittest`](https://python-all.ru/3.8/library/unittest.html#module-unittest)). (Автор: R. David Murray в [bpo-11390](https://python-all.ru/3.8/whatsnew/3.4.html).)397398[`doctest`](https://python-all.ru/3.8/library/doctest.html#module-doctest) теперь будет находить doctests в строках `__doc__` модулей расширения. (Автор: Zachary Ware в [bpo-3158](https://python-all.ru/3.8/whatsnew/3.4.html).)399400### email401402[`as_string()`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message.as_string) теперь принимает аргумент *policy* для переопределения политики по умолчанию сообщения при создании его строкового представления. Это означает, что `as_string` теперь можно использовать в большем числе случаев, вместо того чтобы создавать и использовать [`generator`](https://python-all.ru/3.8/library/email.generator.html#module-email.generator) для передачи параметров форматирования его методу `flatten`. (Автор: R. David Murray, [bpo-18600](https://python-all.ru/3.8/whatsnew/3.4.html).)403404Добавлен новый метод [`as_bytes()`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message.as_bytes) для создания байтового представления сообщения, аналогично тому, как `as_string` создаёт строковое представление. Он не принимает аргумент *maxheaderlen*, но принимает аргументы *unixfrom* и *policy*. Метод [`Message`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message) [`__bytes__()`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message.__bytes__) вызывает его, что означает, что `bytes(mymsg)` теперь будет давать интуитивно понятный результат: объект bytes, содержащий полностью отформатированное сообщение. (Автор: R. David Murray, [bpo-18600](https://python-all.ru/3.8/whatsnew/3.4.html).)405406Сообщение [`Message.set_param()`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message.set_param) теперь принимает именованный аргумент *replace*. При его указании соответствующий заголовок будет обновлён без изменения его положения в списке заголовков. Для обратной совместимости по умолчанию используется `False`. (Автор: R. David Murray, [bpo-18891](https://python-all.ru/3.8/whatsnew/3.4.html).)407408Добавлены два новых подкласса [`Message`](https://python-all.ru/3.8/library/email.compat32-message.html#email.message.Message) ([`EmailMessage`](https://python-all.ru/3.8/library/email.message.html#email.message.EmailMessage) и [`MIMEPart`](https://python-all.ru/3.8/library/email.message.html#email.message.MIMEPart)), а также новый подмодуль [`contentmanager`](https://python-all.ru/3.8/library/email.contentmanager.html#module-email.contentmanager) и новый атрибут [`policy`](https://python-all.ru/3.8/library/email.policy.html#module-email.policy) [`content_manager`](https://python-all.ru/3.8/library/email.policy.html#email.policy.EmailPolicy.content_manager). Вся документация находится в новом модуле, который добавляется как часть нового [временного API](https://python-all.ru/3.8/glossary.html#term-provisional-api) email. Эти классы предоставляют ряд новых методов, которые значительно упрощают извлечение содержимого из сообщений электронной почты и вставку в них. Подробнее см. документацию [`contentmanager`](https://python-all.ru/3.8/library/email.contentmanager.html#module-email.contentmanager) и [email: Примеры](https://python-all.ru/3.8/library/email.examples.html#email-examples). Эти дополнения API завершают основную часть работы, запланированной в рамках проекта email6. Данный временный API планируется сделать окончательным в Python 3.5 (возможно, с несколькими небольшими дополнениями в области обработки ошибок). (Автор: R. David Murray, [bpo-18891](https://python-all.ru/3.8/whatsnew/3.4.html).)409410### filecmp411412Новая функция [`clear_cache()`](https://python-all.ru/3.8/library/filecmp.html#filecmp.clear_cache) позволяет очищать кеш сравнения [`filecmp`](https://python-all.ru/3.8/library/filecmp.html#module-filecmp), который использует информацию [`os.stat()`](https://python-all.ru/3.8/library/os.html#os.stat) для определения того, изменился ли файл с момента последнего сравнения. Это может быть использовано, например, если файл мог быть изменён и проверен повторно за время меньшее, чем разрешение поля времени модификации файла конкретной файловой системы. (Автор: Mark Levitt, [bpo-18149](https://python-all.ru/3.8/whatsnew/3.4.html).)413414Новый атрибут модуля [`DEFAULT_IGNORES`](https://python-all.ru/3.8/library/filecmp.html#filecmp.DEFAULT_IGNORES) предоставляет список каталогов, используемых в качестве значения по умолчанию для параметра *ignore* функции [`dircmp()`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp). (Автор: Eli Bendersky, [bpo-15442](https://python-all.ru/3.8/whatsnew/3.4.html).)415416### functools417418Новый дескриптор [`partialmethod()`](https://python-all.ru/3.8/library/functools.html#functools.partialmethod) реализует частичное применение аргументов для дескрипторов, так же как [`partial()`](https://python-all.ru/3.8/library/functools.html#functools.partial) предоставляет для обычных вызываемых объектов. Новый дескриптор также упрощает заставление произвольных вызываемых объектов (включая экземпляры [`partial()`](https://python-all.ru/3.8/library/functools.html#functools.partial)) вести себя как обычные методы экземпляра при включении в определение класса. (Авторы: Alon Horev и Nick Coghlan, [bpo-4331](https://python-all.ru/3.8/whatsnew/3.4.html).)419420Новый декоратор [`singledispatch()`](https://python-all.ru/3.8/library/functools.html#functools.singledispatch) добавляет поддержку однодиспетчерских обобщённых функций в стандартную библиотеку Python. В то время как объектно-ориентированное программирование фокусируется на группировке нескольких операций над общим набором данных в класс, обобщённая функция фокусируется на группировке нескольких реализаций операции, что позволяет ей работать с *различными* видами данных.421422> **См. также**423>424> **[**PEP 443**](https://python-all.ru/3.8/whatsnew/3.4.html) – Однодиспетчерские обобщённые функции**425>426> PEP написан и реализован Лукашем Лангой.427428[`total_ordering()`](https://python-all.ru/3.8/library/functools.html#functools.total_ordering) теперь поддерживает возвращаемое значение [`NotImplemented`](https://python-all.ru/3.8/library/constants.html#NotImplemented) из базовой функции сравнения. (Автор: Katie Miller, [bpo-10042](https://python-all.ru/3.8/whatsnew/3.4.html).)429430Чисто-питоновская версия функции [`partial()`](https://python-all.ru/3.8/library/functools.html#functools.partial) теперь находится в стандартной библиотеке; в CPython она переопределена C-ускоренной версией, но она доступна для других реализаций. (Автор: Brian Thorne, [bpo-12428](https://python-all.ru/3.8/whatsnew/3.4.html).)431432### gc433434Новая функция [`get_stats()`](https://python-all.ru/3.8/library/gc.html#gc.get_stats) возвращает список из трёх словарей по поколениям, содержащих статистику сборок мусора с момента запуска интерпретатора. (Автор: Antoine Pitrou, [bpo-16351](https://python-all.ru/3.8/whatsnew/3.4.html).)435436### glob437438Новая функция [`escape()`](https://python-all.ru/3.8/library/glob.html#glob.escape) позволяет экранировать специальные символы в имени файла, чтобы они не участвовали в раскрытии шаблона, а соответствовали буквально. (Автор: Serhiy Storchaka, [bpo-8402](https://python-all.ru/3.8/whatsnew/3.4.html).)439440### hashlib441442Новая функция [`hashlib.pbkdf2_hmac()`](https://python-all.ru/3.8/library/hashlib.html#hashlib.pbkdf2_hmac) предоставляет [функцию формирования ключа на основе пароля PKCS#5 версии 2](https://python-all.ru/3.8/whatsnew/3.4.html). (Автор: Christian Heimes, [bpo-18582](https://python-all.ru/3.8/whatsnew/3.4.html).)443444Атрибут [`name`](https://python-all.ru/3.8/library/hashlib.html#hashlib.hash.name) объектов хеша [`hashlib`](https://python-all.ru/3.8/library/hashlib.html#module-hashlib) теперь является официально поддерживаемым интерфейсом. Он всегда существовал в CPython's [`hashlib`](https://python-all.ru/3.8/library/hashlib.html#module-hashlib) (хотя не возвращал имена в нижнем регистре для всех поддерживаемых хешей), но не был публичным интерфейсом, поэтому некоторые другие реализации Python ранее его не поддерживали. (Автор: Jason R. Coombs, [bpo-18532](https://python-all.ru/3.8/whatsnew/3.4.html).)445446### hmac447448[`hmac`](https://python-all.ru/3.8/library/hmac.html#module-hmac) теперь принимает `bytearray`, а также `bytes` для аргумента *key* функции [`new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new), а параметр *msg* как для функции [`new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new), так и для метода [`update()`](https://python-all.ru/3.8/library/hmac.html#hmac.HMAC.update) теперь принимает любой тип, поддерживаемый модулем [`hashlib`](https://python-all.ru/3.8/library/hashlib.html#module-hashlib). (Автор: Jonas Borgström, [bpo-18240](https://python-all.ru/3.8/whatsnew/3.4.html).)449450Аргумент *digestmod* функции [`hmac.new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new) теперь может быть любым именем дайджеста хеша, распознаваемым [`hashlib`](https://python-all.ru/3.8/library/hashlib.html#module-hashlib). Кроме того, текущее поведение, при котором значение *digestmod* по умолчанию равно `MD5`, является устаревшим: в будущей версии Python значения по умолчанию не будет. (Автор: Christian Heimes, [bpo-17276](https://python-all.ru/3.8/whatsnew/3.4.html).)451452С добавлением атрибутов [`block_size`](https://python-all.ru/3.8/library/hmac.html#hmac.HMAC.block_size) и [`name`](https://python-all.ru/3.8/library/hmac.html#hmac.HMAC.name) (и формальной документации атрибута [`digest_size`](https://python-all.ru/3.8/library/hmac.html#hmac.HMAC.digest_size)) модуль [`hmac`](https://python-all.ru/3.8/library/hmac.html#module-hmac) теперь полностью соответствует API [**PEP 247**](https://python-all.ru/3.8/whatsnew/3.4.html). (Автор: Christian Heimes, [bpo-18775](https://python-all.ru/3.8/whatsnew/3.4.html).)453454### html455456Новая функция [`unescape()`](https://python-all.ru/3.8/library/html.html#html.unescape) преобразует символьные ссылки HTML5 в соответствующие символы Unicode. (Автор: Ezio Melotti, [bpo-2927](https://python-all.ru/3.8/whatsnew/3.4.html).)457458[`HTMLParser`](https://python-all.ru/3.8/library/html.parser.html#html.parser.HTMLParser) принимает новый именованный аргумент *convert\_charrefs*, который при значении `True` автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно `False`, но оно изменится на `True` в будущей версии Python, поэтому рекомендуется явно установить его и обновить свой код для использования этой новой возможности. (Автор: Ezio Melotti, [bpo-13633](https://python-all.ru/3.8/whatsnew/3.4.html).)459460Аргумент *strict* функции [`HTMLParser`](https://python-all.ru/3.8/library/html.parser.html#html.parser.HTMLParser) теперь устарел. (Автор: Ezio Melotti, [bpo-15114](https://python-all.ru/3.8/whatsnew/3.4.html).)461462### http463464[`send_error()`](https://python-all.ru/3.8/library/http.server.html#http.server.BaseHTTPRequestHandler.send_error) теперь принимает необязательный дополнительный параметр *explain*, который можно использовать для предоставления расширенного описания ошибки, переопределяя жёстко заданное значение по умолчанию, если таковое имеется. Это расширенное описание ошибки будет отформатировано с использованием атрибута `error_message_format` и отправлено в качестве тела ответа об ошибке. (Предложено Karl Cow в [bpo-12921](https://python-all.ru/3.8/whatsnew/3.4.html).)465466В [`http.server`](https://python-all.ru/3.8/library/http.server.html#module-http.server) [интерфейсе командной строки](https://python-all.ru/3.8/library/http.server.html#http-server-cli) теперь есть опция `-b/--bind`, которая заставляет сервер прослушивать определённый адрес. (Автор: Malte Swart в [bpo-17764](https://python-all.ru/3.8/whatsnew/3.4.html).)467468### idlelib и IDLE469470Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, он получает улучшения с каждым релизом. См. `Lib/idlelib/NEWS.txt` для сводного списка изменений, начиная с 3.3.0, а также изменений, внесённых в будущих выпусках 3.4.x. Этот файл также доступен из диалога IDLE Справка ‣ About IDLE.471472### importlib473474Абстрактный класс [`InspectLoader`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader) определяет новый метод, [`source_to_code()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader.source_to_code), который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна `compile(data, path, 'exec', dont_inherit=True)`. (Авторы: Eric Snow и Brett Cannon в [bpo-15627](https://python-all.ru/3.8/whatsnew/3.4.html).)475476[`InspectLoader`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader) также теперь имеет реализацию по умолчанию для метода [`get_code()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader.get_code). Однако обычно желательно переопределить реализацию по умолчанию по соображениям производительности. (Автор: Brett Cannon в [bpo-18072](https://python-all.ru/3.8/whatsnew/3.4.html).)477478Функция [`reload()`](https://python-all.ru/3.8/library/importlib.html#importlib.reload) была перемещена из [`imp`](https://python-all.ru/3.8/library/imp.html#module-imp) в [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) в рамках устаревания модуля [`imp`](https://python-all.ru/3.8/library/imp.html#module-imp). (Автор: Berker Peksag в [bpo-18193](https://python-all.ru/3.8/whatsnew/3.4.html).)479480[`importlib.util`](https://python-all.ru/3.8/library/importlib.html#module-importlib.util) теперь имеет атрибут [`MAGIC_NUMBER`](https://python-all.ru/3.8/library/importlib.html#importlib.util.MAGIC_NUMBER), предоставляющий доступ к номеру версии байт-кода. Это заменяет функцию [`get_magic()`](https://python-all.ru/3.8/library/imp.html#imp.get_magic) в устаревшем модуле [`imp`](https://python-all.ru/3.8/library/imp.html#module-imp). (Автор: Brett Cannon в [bpo-18192](https://python-all.ru/3.8/whatsnew/3.4.html).)481482Новые функции [`importlib.util`](https://python-all.ru/3.8/library/importlib.html#module-importlib.util) [`cache_from_source()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.cache_from_source) и [`source_from_cache()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.source_from_cache) заменяют одноимённые функции в устаревшем модуле [`imp`](https://python-all.ru/3.8/library/imp.html#module-imp). (Автор: Brett Cannon в [bpo-18194](https://python-all.ru/3.8/whatsnew/3.4.html).)483484Загрузчик [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) `NamespaceLoader` теперь соответствует абстрактному классу [`InspectLoader`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader), что означает, что `runpy` и `python -m` теперь можно использовать с пространственно-именованными пакетами. (Автор: Brett Cannon в [bpo-18058](https://python-all.ru/3.8/whatsnew/3.4.html).)485486[`importlib.util`](https://python-all.ru/3.8/library/importlib.html#module-importlib.util) имеет новую функцию [`decode_source()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.decode_source), которая декодирует исходный код из байтов с использованием универсальной обработки перевода строки. Это полезно для реализации методов [`InspectLoader.get_source()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader.get_source).487488[`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.ExtensionFileLoader) теперь имеет метод [`get_filename()`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.ExtensionFileLoader.get_filename). Он был случайно пропущен в первоначальной реализации. (Автор: Eric Snow в [bpo-19152](https://python-all.ru/3.8/whatsnew/3.4.html).)489490### inspect491492Модуль [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect) теперь предлагает базовый [интерфейс командной строки](https://python-all.ru/3.8/library/inspect.html#inspect-module-cli) для быстрого отображения исходного кода и другой информации о модулях, классах и функциях. (Авторы: Claudiu Popa и Nick Coghlan в [bpo-18626](https://python-all.ru/3.8/whatsnew/3.4.html).)493494[`unwrap()`](https://python-all.ru/3.8/library/inspect.html#inspect.unwrap) упрощает распутывание цепочек функций-обёрток, созданных с помощью [`functools.wraps()`](https://python-all.ru/3.8/library/functools.html#functools.wraps) (и любого другого API, который устанавливает атрибут `__wrapped__` на функцию-обёртку). (Авторы: Daniel Urban, Aaron Iles и Nick Coghlan в [bpo-13266](https://python-all.ru/3.8/whatsnew/3.4.html).)495496В рамках реализации нового модуля [`enum`](https://python-all.ru/3.8/library/enum.html#module-enum), модуль [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect) теперь имеет существенно лучшую поддержку пользовательских методов `__dir__` и динамических атрибутов классов, предоставляемых через метаклассы. (Автор: Ethan Furman в [bpo-18929](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-19030](https://python-all.ru/3.8/whatsnew/3.4.html).)497498[`getfullargspec()`](https://python-all.ru/3.8/library/inspect.html#inspect.getfullargspec) и [`getargspec()`](https://python-all.ru/3.8/library/inspect.html#inspect.getargspec) теперь используют API [`signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature). Это позволяет им поддерживать гораздо более широкий спектр вызываемых объектов, в том числе с атрибутами `__signature__`, с метаданными, предоставленными argument clinic, объектами [`functools.partial()`](https://python-all.ru/3.8/library/functools.html#functools.partial) и многим другим. Обратите внимание, что, в отличие от [`signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature), эти функции по-прежнему игнорируют атрибуты `__wrapped__` и сообщают уже связанный первый аргумент для связанных методов, поэтому по-прежнему необходимо обновить ваш код, чтобы использовать [`signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature) напрямую, если эти функции желательны. (Автор: Yury Selivanov в [bpo-17481](https://python-all.ru/3.8/whatsnew/3.4.html).)499500[`signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature) теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с Cython. (Авторы: Stefan Behnel и Yury Selivanov в [bpo-17159](https://python-all.ru/3.8/whatsnew/3.4.html).)501502### ipaddress503504[`ipaddress`](https://python-all.ru/3.8/library/ipaddress.html#module-ipaddress) был добавлен в стандартную библиотеку в Python 3.3 как [временный API](https://python-all.ru/3.8/glossary.html#term-provisional-api). С выходом Python 3.4 этот статус был снят: [`ipaddress`](https://python-all.ru/3.8/library/ipaddress.html#module-ipaddress) теперь считается стабильным API, подпадающим под обычные требования стандартной библиотеки по поддержанию обратной совместимости.505506Новое свойство [`is_global`](https://python-all.ru/3.8/library/ipaddress.html#ipaddress.IPv4Address.is_global) – `True`, если адрес является глобально маршрутизируемым. (Автор: Peter Moody в [bpo-17400](https://python-all.ru/3.8/whatsnew/3.4.html).)507508### logging509510Класс [`TimedRotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler) имеет новый параметр *atTime*, который можно использовать для указания времени суток, когда должен произойти переворот. (Автор: Ronald Oussoren в [bpo-9556](https://python-all.ru/3.8/whatsnew/3.4.html).)511512[`SocketHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler) и [`DatagramHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.DatagramHandler) теперь поддерживают доменные сокеты Unix (устанавливая параметр *port* в `None`). (Автор: Vinay Sajip в коммите ce46195b56a9.)513514[`fileConfig()`](https://python-all.ru/3.8/library/logging.config.html#logging.config.fileConfig) теперь принимает экземпляр подкласса [`configparser.RawConfigParser`](https://python-all.ru/3.8/library/configparser.html#configparser.RawConfigParser) для параметра *fname*. Это упрощает использование файла конфигурации, когда конфигурация логирования является лишь частью общей конфигурации приложения, или когда приложение изменяет конфигурацию перед передачей её в [`fileConfig()`](https://python-all.ru/3.8/library/logging.config.html#logging.config.fileConfig). (Автор: Vinay Sajip в [bpo-16110](https://python-all.ru/3.8/whatsnew/3.4.html).)515516Данные конфигурации логирования, полученные из сокета через функцию [`logging.config.listen()`](https://python-all.ru/3.8/library/logging.config.html#logging.config.listen), теперь могут быть проверены до обработки путём передачи функции проверки в качестве аргумента нового именованного аргумента *verify*. (Автор: Vinay Sajip в [bpo-15452](https://python-all.ru/3.8/whatsnew/3.4.html).)517518### marshal519520Версия по умолчанию для [`marshal`](https://python-all.ru/3.8/library/marshal.html#module-marshal) была повышена до 3. Код, реализующий новую версию, восстанавливает поведение Python2, записывая только одну копию интернированных строк и сохраняя интернирование при десериализации, и расширяет эту способность «одна копия» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер файлов `.pyc`, так и объём памяти, занимаемый модулем при загрузке из файла `.pyc` (или `.pyo`). (Автор: Kristján Valur Jónsson в [bpo-16475](https://python-all.ru/3.8/whatsnew/3.4.html), с дополнительными ускорениями от Antoine Pitrou в [bpo-19219](https://python-all.ru/3.8/whatsnew/3.4.html).)521522### mmap523524Объекты mmap теперь можно [`weakref`](https://python-all.ru/3.8/library/weakref.html#module-weakref)'овать. (Автор: Valerie Lambert, [bpo-4885](https://python-all.ru/3.8/whatsnew/3.4.html).)525526### multiprocessing527528В Unix два новых [метода запуска](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing-start-methods), `spawn` и `forkserver`, были добавлены для запуска процессов с помощью [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing). Они делают смешивание процессов с потоками более надёжным, а метод `spawn` соответствует семантике, которую multiprocessing всегда использовал в Windows. Новая функция [`get_all_start_methods()`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.get_all_start_methods) сообщает все методы запуска, доступные на платформе, [`get_start_method()`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.get_start_method) сообщает текущий метод запуска, а [`set_start_method()`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.set_start_method) устанавливает метод запуска. (Автор: Richard Oudkerk в [bpo-8713](https://python-all.ru/3.8/whatsnew/3.4.html).)529530У [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing) теперь появилось понятие `context`, определяющее, как создаются дочерние процессы. Новая функция [`get_context()`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.get_context) возвращает контекст, использующий указанный метод запуска. Он имеет тот же API, что и сам модуль [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing), поэтому его можно использовать для создания [`Pool`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.pool.Pool) и других объектов, работающих в этом контексте. Это позволяет фреймворку и приложению (или разным частям одного приложения) использовать multiprocessing, не мешая друг другу. (Автор: Richard Oudkerk, [bpo-18999](https://python-all.ru/3.8/whatsnew/3.4.html).)531532За исключением старого метода запуска *fork*, дочерние процессы больше не наследуют от родителей ненужные дескрипторы/файловые дескрипторы (часть [bpo-8713](https://python-all.ru/3.8/whatsnew/3.4.html)).533534[`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing) теперь полагается на [`runpy`](https://python-all.ru/3.8/library/runpy.html#module-runpy) (реализующий флаг `-m`) для корректной инициализации `__main__` в дочерних процессах при использовании методов запуска `spawn` или `forkserver`. Это устраняет некоторые пограничные случаи, когда сочетание multiprocessing, флага командной строки `-m` и явных относительных импортов могло приводить к трудноуловимым ошибкам в дочерних процессах. (Автор: Nick Coghlan, [bpo-19946](https://python-all.ru/3.8/whatsnew/3.4.html).)535536### operator537538Новая функция [`length_hint()`](https://python-all.ru/3.8/library/operator.html#operator.length_hint) реализует спецификацию использования специального метода [`__length_hint__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__length_hint__) в рамках формальной спецификации этой языковой возможности [**PEP 424**](https://python-all.ru/3.8/whatsnew/3.4.html). (Автор: Armin Ronacher, [bpo-16148](https://python-all.ru/3.8/whatsnew/3.4.html).)539540Теперь доступна чисто-питоновская версия модуля [`operator`](https://python-all.ru/3.8/library/operator.html#module-operator) для ознакомления и использования в альтернативных реализациях Python. (Автор: Zachary Ware, [bpo-16694](https://python-all.ru/3.8/whatsnew/3.4.html).)541542### os543544Появились новые функции для получения и установки [наследуемого флага](https://python-all.ru/3.8/library/os.html#fd-inheritance) файлового дескриптора ([`os.get_inheritable()`](https://python-all.ru/3.8/library/os.html#os.get_inheritable), [`os.set_inheritable()`](https://python-all.ru/3.8/library/os.html#os.set_inheritable)) или дескриптора Windows ([`os.get_handle_inheritable()`](https://python-all.ru/3.8/library/os.html#os.get_handle_inheritable), [`os.set_handle_inheritable()`](https://python-all.ru/3.8/library/os.html#os.set_handle_inheritable)).545546Новая функция [`cpu_count()`](https://python-all.ru/3.8/library/os.html#os.cpu_count) сообщает количество доступных процессоров на платформе, где выполняется Python (или `None`, если количество не удаётся определить). Функция [`multiprocessing.cpu_count()`](https://python-all.ru/3.8/library/multiprocessing.html#multiprocessing.cpu_count) теперь реализована через эту функцию. (Авторы: Trent Nelson, Yogesh Chaudhari, Victor Stinner и Charles-François Natali, [bpo-17914](https://python-all.ru/3.8/whatsnew/3.4.html).)547548[`os.path.samestat()`](https://python-all.ru/3.8/library/os.path.html#os.path.samestat) теперь доступен на платформе Windows (а реализация [`os.path.samefile()`](https://python-all.ru/3.8/library/os.path.html#os.path.samefile) теперь общая для Unix и Windows). (Автор: Brian Curtin, [bpo-11939](https://python-all.ru/3.8/whatsnew/3.4.html).)549550[`os.path.ismount()`](https://python-all.ru/3.8/library/os.path.html#os.path.ismount) теперь распознаёт тома, смонтированные ниже корня диска в Windows. (Автор: Tim Golden, [bpo-9035](https://python-all.ru/3.8/whatsnew/3.4.html).)551552[`os.open()`](https://python-all.ru/3.8/library/os.html#os.open) поддерживает два новых флага на платформах, которые их предоставляют: [`O_PATH`](https://python-all.ru/3.8/library/os.html#os.O_PATH) (неоткрытый файловый дескриптор) и [`O_TMPFILE`](https://python-all.ru/3.8/library/os.html#os.O_TMPFILE) (безымянный временный файл; на момент выхода 3.4.0 доступен только в Linux с ядром версии 3.11 или новее, имеющим заголовки uapi). (Авторы: Christian Heimes, [bpo-18673](https://python-all.ru/3.8/whatsnew/3.4.html), и Benjamin Peterson, соответственно.)553554### pdb555556[`pdb`](https://python-all.ru/3.8/library/pdb.html#module-pdb) была улучшена для более удобной работы с генераторами, [`yield`](https://python-all.ru/3.8/reference/simple_stmts.html#yield) и `yield from`. Это особенно полезно при отладке программ на основе [`asyncio`](https://python-all.ru/3.8/library/asyncio.html#module-asyncio). (Авторы: Andrew Svetlov и Xavier de Gaye, [bpo-16596](https://python-all.ru/3.8/whatsnew/3.4.html).)557558Команда `print` была удалена из [`pdb`](https://python-all.ru/3.8/library/pdb.html#module-pdb), что восстановило доступ к функции Python [`print()`](https://python-all.ru/3.8/library/functions.html#print) из командной строки pdb. В Python2 в `pdb` не было команды `print`; вместо этого ввод `print` выполнял оператор `print`. В Python3 `print` ошибочно стала псевдонимом команды [`p`](https://python-all.ru/3.8/library/pdb.html#pdbcommand-p). Однако `p` выводит `repr` своего аргумента, а не `str`, как это делала команда `print` в Python2. Более того, команда `pdb print` в Python3 затеняла функцию `print`, делая её недоступной в приглашении `pdb`. (Автор: Connor Osborn, [bpo-18764](https://python-all.ru/3.8/whatsnew/3.4.html).)559560### pickle561562[`pickle`](https://python-all.ru/3.8/library/pickle.html#module-pickle) теперь поддерживает (но по умолчанию не использует) новый протокол pickle – протокол 4. Этот новый протокол решает ряд проблем, существовавших в предыдущих протоколах, таких как сериализация вложенных классов, очень больших строк и контейнеров, а также классов, у которых метод [`__new__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__new__) принимает только именованные аргументы. Он также даёт некоторые улучшения производительности.563564> **См. также**565>566> **[**PEP 3154**](https://python-all.ru/3.8/whatsnew/3.4.html) – протокол pickle 4**567>568> PEP написан Антуаном Питрой (Antoine Pitrou), реализован Александром Валсалотти (Alexandre Vassalotti).569570### plistlib571572[`plistlib`](https://python-all.ru/3.8/library/plistlib.html#module-plistlib) теперь имеет API, похожее на стандартный шаблон протоколов сериализации в stdlib, с новыми функциями [`load()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.load), [`dump()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.dump), [`loads()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.loads) и [`dumps()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.dumps). (Старый API теперь устарел.) В дополнение к уже поддерживаемому формату XML plist ([`FMT_XML`](https://python-all.ru/3.8/library/plistlib.html#plistlib.FMT_XML)) теперь поддерживается также бинарный формат plist ([`FMT_BINARY`](https://python-all.ru/3.8/library/plistlib.html#plistlib.FMT_BINARY)). (Авторы: Ronald Oussoren и другие, [bpo-14455](https://python-all.ru/3.8/whatsnew/3.4.html).)573574### poplib575576В [`poplib`](https://python-all.ru/3.8/library/poplib.html#module-poplib) добавлено два новых метода: [`capa()`](https://python-all.ru/3.8/library/poplib.html#poplib.POP3.capa), возвращающий список возможностей, объявленных POP-сервером, и [`stls()`](https://python-all.ru/3.8/library/poplib.html#poplib.POP3.stls), переключающий сеанс POP3 в открытом тексте на зашифрованный сеанс POP3, если POP-сервер это поддерживает. (Автор: Lorenzo Catucci, [bpo-4473](https://python-all.ru/3.8/whatsnew/3.4.html).)577578### pprint579580У класса [`PrettyPrinter`](https://python-all.ru/3.8/library/pprint.html#pprint.PrettyPrinter) модуля [`pprint`](https://python-all.ru/3.8/library/pprint.html#module-pprint) и его функций [`pformat()`](https://python-all.ru/3.8/library/pprint.html#pprint.pformat) и [`pprint()`](https://python-all.ru/3.8/library/pprint.html#pprint.pprint) появилась новая опция *compact*, управляющая форматированием вывода. В настоящее время установка *compact* в `True` означает, что последовательности будут выводиться с максимально возможным количеством элементов, умещающихся в *width* на каждой (с отступом) строке. (Автор: Serhiy Storchaka, [bpo-19132](https://python-all.ru/3.8/whatsnew/3.4.html).)581582Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строки в Python. (Автор: Antoine Pitrou, [bpo-17150](https://python-all.ru/3.8/whatsnew/3.4.html).)583584### pty585586[`pty.spawn()`](https://python-all.ru/3.8/library/pty.html#pty.spawn) теперь возвращает значение статуса от [`os.waitpid()`](https://python-all.ru/3.8/library/os.html#os.waitpid) для дочернего процесса вместо `None`. (Автор: Gregory P. Smith.)587588### pydoc589590Модуль [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc) теперь напрямую основан на API интроспекции [`inspect.signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature), что позволяет ему предоставлять информацию о сигнатурах для более широкого круга вызываемых объектов. Это изменение также означает, что атрибуты `__wrapped__` теперь учитываются при отображении справки. (Автор: Larry Hastings, [bpo-19674](https://python-all.ru/3.8/whatsnew/3.4.html).)591592Модуль [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc) больше не отображает параметр `self` для уже связанных методов. Вместо этого он стремится всегда показывать точную текущую сигнатуру переданного вызываемого объекта. (Автор: Larry Hastings, [bpo-20710](https://python-all.ru/3.8/whatsnew/3.4.html).)593594Помимо изменений, внесённых непосредственно в [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc), обработка пользовательских методов `__dir__` и различных видов поведения дескрипторов также была существенно улучшена благодаря базовым изменениям в модуле [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect).595596Поскольку встроенная функция [`help()`](https://python-all.ru/3.8/library/functions.html#help) основана на [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc), описанные выше изменения также влияют на поведение [`help()`](https://python-all.ru/3.8/library/functions.html#help).597598### re599600Новая функция [`fullmatch()`](https://python-all.ru/3.8/library/re.html#re.fullmatch) и метод `regex.fullmatch()` закрепляют шаблон на обоих концах строки для поиска соответствия. Это позволяет явно указать цель сопоставления, что предотвращает класс тонких ошибок, когда символы `$` теряются при изменениях кода или добавлении альтернатив в существующее регулярное выражение. (Автор: Matthew Barnett в [bpo-16203](https://python-all.ru/3.8/whatsnew/3.4.html).)601602repr [объектов регулярных выражений](https://python-all.ru/3.8/library/re.html#re-objects) теперь включает шаблон и флаги; repr [объектов совпадений](https://python-all.ru/3.8/library/re.html#match-objects) теперь включает начальную и конечную позиции, а также сопоставленную часть строки. (Авторы: Hugo Lopes Tavares и Serhiy Storchaka в [bpo-13592](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-17087](https://python-all.ru/3.8/whatsnew/3.4.html).)603604### resource605606Новая функция [`prlimit()`](https://python-all.ru/3.8/library/resource.html#resource.prlimit), доступная на платформах Linux с версией ядра 2.6.36 или новее и glibc 2.13 или новее, позволяет запрашивать или устанавливать ограничения ресурсов для процессов, отличных от вызывающего. (Автор: Christian Heimes в [bpo-16595](https://python-all.ru/3.8/whatsnew/3.4.html).)607608В Linux с версией ядра 2.6.36 или новее также появились некоторые новые константы, специфичные для Linux: [`RLIMIT_MSGQUEUE`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_MSGQUEUE), [`RLIMIT_NICE`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_NICE), [`RLIMIT_RTPRIO`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_RTPRIO), [`RLIMIT_RTTIME`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_RTTIME) и [`RLIMIT_SIGPENDING`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_SIGPENDING). (Автор: Christian Heimes в [bpo-19324](https://python-all.ru/3.8/whatsnew/3.4.html).)609610В FreeBSD версии 9 и более новых появились некоторые новые константы, специфичные для FreeBSD: [`RLIMIT_SBSIZE`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_SBSIZE), [`RLIMIT_SWAP`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_SWAP) и [`RLIMIT_NPTS`](https://python-all.ru/3.8/library/resource.html#resource.RLIMIT_NPTS). (Автор: Claudiu Popa в [bpo-19343](https://python-all.ru/3.8/whatsnew/3.4.html).)611612### select613614Объекты [`epoll`](https://python-all.ru/3.8/library/select.html#select.epoll) теперь поддерживают протокол управления контекстом. При использовании в инструкции [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) метод [`close()`](https://python-all.ru/3.8/library/select.html#select.epoll.close) будет вызываться автоматически в конце блока. (Автор: Serhiy Storchaka в [bpo-16488](https://python-all.ru/3.8/whatsnew/3.4.html).)615616Объекты [`devpoll`](https://python-all.ru/3.8/library/select.html#select.devpoll) теперь имеют методы [`fileno()`](https://python-all.ru/3.8/library/select.html#select.devpoll.fileno) и [`close()`](https://python-all.ru/3.8/library/select.html#select.devpoll.close), а также новый атрибут [`closed`](https://python-all.ru/3.8/library/select.html#select.devpoll.closed). (Автор: Victor Stinner в [bpo-18794](https://python-all.ru/3.8/whatsnew/3.4.html).)617618### shelve619620Экземпляры [`Shelf`](https://python-all.ru/3.8/library/shelve.html#shelve.Shelf) теперь можно использовать в инструкциях [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with); они будут автоматически закрыты в конце блока `with`. (Автор: Filip Gruszczyński в [bpo-13896](https://python-all.ru/3.8/whatsnew/3.4.html).)621622### shutil623624[`copyfile()`](https://python-all.ru/3.8/library/shutil.html#shutil.copyfile) теперь вызывает конкретный подкласс [`Error`](https://python-all.ru/3.8/library/shutil.html#shutil.Error), [`SameFileError`](https://python-all.ru/3.8/library/shutil.html#shutil.SameFileError), когда исходный и целевой файлы совпадают, что позволяет приложению предпринять соответствующие действия при этой конкретной ошибке. (Авторы: Atsuo Ishimoto и Hynek Schlawack в [bpo-1492704](https://python-all.ru/3.8/whatsnew/3.4.html).)625626### smtpd627628Классы [`SMTPServer`](https://python-all.ru/3.8/library/smtpd.html#smtpd.SMTPServer) и [`SMTPChannel`](https://python-all.ru/3.8/library/smtpd.html#smtpd.SMTPChannel) теперь принимают именованный аргумент *map*, который, если указан, передаётся в [`asynchat.async_chat`](https://python-all.ru/3.8/library/asynchat.html#asynchat.async_chat) в качестве его аргумента *map*. Это позволяет приложению не затрагивать глобальную карту сокетов. (Автор: Vinay Sajip в [bpo-11959](https://python-all.ru/3.8/whatsnew/3.4.html).)629630### smtplib631632[`SMTPException`](https://python-all.ru/3.8/library/smtplib.html#smtplib.SMTPException) теперь является подклассом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), что позволяет перехватывать как ошибки на уровне сокетов, так и ошибки на уровне протокола SMTP в одном операторе try/except в коде, которому важно лишь, произошла ошибка или нет. (Автор: Ned Jackson Lovely в [bpo-2118](https://python-all.ru/3.8/whatsnew/3.4.html).)633634### socket635636Модуль socket теперь поддерживает протокол [`CAN_BCM`](https://python-all.ru/3.8/library/socket.html#socket.CAN_BCM) на платформах, которые его поддерживают. (Автор: Brian Thorne в [bpo-15359](https://python-all.ru/3.8/whatsnew/3.4.html).)637638Объекты сокетов получили новые методы для получения или установки их [наследуемого флага](https://python-all.ru/3.8/library/os.html#fd-inheritance), [`get_inheritable()`](https://python-all.ru/3.8/library/socket.html#socket.socket.get_inheritable) и [`set_inheritable()`](https://python-all.ru/3.8/library/socket.html#socket.socket.set_inheritable).639640Константы `socket.AF_*` и `socket.SOCK_*` теперь являются значениями перечисления с использованием нового модуля [`enum`](https://python-all.ru/3.8/library/enum.html#module-enum). Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел».641642Константа [`AF_LINK`](https://python-all.ru/3.8/library/socket.html#socket.AF_LINK) теперь доступна на BSD и OSX.643644[`inet_pton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_pton) и [`inet_ntop()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntop) теперь поддерживаются в Windows. (Автор: Atsuo Ishimoto в [bpo-7171](https://python-all.ru/3.8/whatsnew/3.4.html).)645646### sqlite3647648Новый логический параметр *uri* функции [`connect()`](https://python-all.ru/3.8/library/sqlite3.html#sqlite3.connect) можно использовать для указания того, что параметр *database* является `uri` (см. [документацию SQLite URI](https://python-all.ru/3.8/whatsnew/3.4.html)). (Автор: poq в [bpo-13773](https://python-all.ru/3.8/whatsnew/3.4.html).)649650### ssl651652Добавлены [`PROTOCOL_TLSv1_1`](https://python-all.ru/3.8/library/ssl.html#ssl.PROTOCOL_TLSv1_1) и [`PROTOCOL_TLSv1_2`](https://python-all.ru/3.8/library/ssl.html#ssl.PROTOCOL_TLSv1_2) (поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна только если Python собран с OpenSSL 1.0.1 или новее. (Авторы: Michele Orrù и Antoine Pitrou в [bpo-16692](https://python-all.ru/3.8/whatsnew/3.4.html).)653654Новая функция [`create_default_context()`](https://python-all.ru/3.8/library/ssl.html#ssl.create_default_context) предоставляет стандартный способ получения [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext), настройки которого предназначены для достижения разумного баланса между совместимостью и безопасностью. Эти настройки более строгие, чем значения по умолчанию, предоставляемые конструктором [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext), и могут быть изменены в будущем без предварительного устаревания, если изменится современная практика безопасности. Новая рекомендуемая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании [`create_default_context()`](https://python-all.ru/3.8/library/ssl.html#ssl.create_default_context) для получения объекта [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext), его модификации при необходимости и последующей передаче в качестве аргумента *context* соответствующего API stdlib. (Автор: Christian Heimes в [bpo-19689](https://python-all.ru/3.8/whatsnew/3.4.html).)655656Метод [`load_verify_locations()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.load_verify_locations) класса [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) принимает новый необязательный аргумент *cadata*, который можно использовать для передачи сертификатов в кодировке PEM или DER напрямую в виде строк или байтов соответственно. (Автор: Christian Heimes в [bpo-18138](https://python-all.ru/3.8/whatsnew/3.4.html).)657658Новая функция [`get_default_verify_paths()`](https://python-all.ru/3.8/library/ssl.html#ssl.get_default_verify_paths) возвращает именованный кортеж с путями и переменными окружения, которые метод [`set_default_verify_paths()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.set_default_verify_paths) использует для установки стандартных `cafile` и `capath` в OpenSSL. Это может помочь при отладке проблем с проверкой по умолчанию. (Автор: Christian Heimes в [bpo-18143](https://python-all.ru/3.8/whatsnew/3.4.html).)659660У [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) появился новый метод [`cert_store_stats()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.cert_store_stats), который возвращает количество загруженных `X.509` сертификатов, `X.509 CA` сертификатов и списков отзыва сертификатов (`crl`), а также метод [`get_ca_certs()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.get_ca_certs), возвращающий список загруженных `CA` сертификатов. (Автор: Christian Heimes в [bpo-18147](https://python-all.ru/3.8/whatsnew/3.4.html).)661662Если доступен OpenSSL 0.9.8 или новее, у [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) появился новый атрибут [`verify_flags`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.verify_flags), который можно использовать для управления процессом проверки сертификатов, установив его в комбинацию новых констант [`VERIFY_DEFAULT`](https://python-all.ru/3.8/library/ssl.html#ssl.VERIFY_DEFAULT), [`VERIFY_CRL_CHECK_LEAF`](https://python-all.ru/3.8/library/ssl.html#ssl.VERIFY_CRL_CHECK_LEAF), [`VERIFY_CRL_CHECK_CHAIN`](https://python-all.ru/3.8/library/ssl.html#ssl.VERIFY_CRL_CHECK_CHAIN) или [`VERIFY_X509_STRICT`](https://python-all.ru/3.8/library/ssl.html#ssl.VERIFY_X509_STRICT). По умолчанию OpenSSL не выполняет проверку CRL. (Автор: Christien Heimes в [bpo-8813](https://python-all.ru/3.8/whatsnew/3.4.html).)663664Новый метод [`SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) [`load_default_certs()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.load_default_certs) загружает набор сертификатов удостоверяющих центров (CA) по умолчанию из стандартных расположений, которые различаются в зависимости от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (`purpose=`[`SERVER_AUTH`](https://python-all.ru/3.8/library/ssl.html#ssl.Purpose.SERVER_AUTH)) для проверки сервера клиентом, так и сертификатов для проверки клиентских сертификатов сервером (`purpose=`[`CLIENT_AUTH`](https://python-all.ru/3.8/library/ssl.html#ssl.Purpose.CLIENT_AUTH)). (Автор: Christian Heimes в [bpo-19292](https://python-all.ru/3.8/whatsnew/3.4.html).)665666Две новые функции, доступные только в Windows, [`enum_certificates()`](https://python-all.ru/3.8/library/ssl.html#ssl.enum_certificates) и [`enum_crls()`](https://python-all.ru/3.8/library/ssl.html#ssl.enum_crls), предоставляют возможность извлекать сертификаты, информацию о сертификатах и списки отзыва (CRL) из хранилища сертификатов Windows. (Автор: Christian Heimes в [bpo-17134](https://python-all.ru/3.8/whatsnew/3.4.html).)667668Поддержка SNI (Server Name Indication) на стороне сервера с помощью нового метода [`ssl.SSLContext.set_servername_callback()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext.set_servername_callback). (Автор: Daniel Black в [bpo-8109](https://python-all.ru/3.8/whatsnew/3.4.html).)669670Словарь, возвращаемый [`SSLSocket.getpeercert()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLSocket.getpeercert), содержит дополнительные элементы расширения `X509v3`: `crlDistributionPoints`, `calIssuers` и `OCSP` URI. (Автор: Christian Heimes в [bpo-18379](https://python-all.ru/3.8/whatsnew/3.4.html).)671672### stat673674Модуль [`stat`](https://python-all.ru/3.8/library/stat.html#module-stat) теперь основан на C-реализации в `_stat`. Реализация на C необходима, поскольку большинство значений не стандартизированы и зависят от платформы. (Автор: Christian Heimes в [bpo-11016](https://python-all.ru/3.8/whatsnew/3.4.html).)675676Модуль поддерживает новые флаги [`ST_MODE`](https://python-all.ru/3.8/library/stat.html#stat.ST_MODE), [`S_IFDOOR`](https://python-all.ru/3.8/library/stat.html#stat.S_IFDOOR), [`S_IFPORT`](https://python-all.ru/3.8/library/stat.html#stat.S_IFPORT) и [`S_IFWHT`](https://python-all.ru/3.8/library/stat.html#stat.S_IFWHT). (Автор: Christian Hiemes в [bpo-11016](https://python-all.ru/3.8/whatsnew/3.4.html).)677678### struct679680Новая функция [`iter_unpack`](https://python-all.ru/3.8/library/struct.html#struct.iter_unpack) и новый метод [`struct.Struct.iter_unpack()`](https://python-all.ru/3.8/library/struct.html#struct.Struct.iter_unpack) для скомпилированных форматов обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного формата данных. (Автор: Antoine Pitrou в [bpo-17804](https://python-all.ru/3.8/whatsnew/3.4.html).)681682### подпроцесс683684[`check_output()`](https://python-all.ru/3.8/library/subprocess.html#subprocess.check_output) теперь принимает аргумент *input*, который можно использовать для предоставления содержимого `stdin` для запускаемой команды. (Автор: Zack Weinberg в [bpo-16624](https://python-all.ru/3.8/whatsnew/3.4.html).)685686`getstatus()` и [`getstatusoutput()`](https://python-all.ru/3.8/library/subprocess.html#subprocess.getstatusoutput) теперь работают в Windows. Это изменение было случайно внесено в версии 3.3.4. (Автор: Tim Golden в [bpo-10197](https://python-all.ru/3.8/whatsnew/3.4.html).)687688### sunau689690Метод `getparams()` теперь возвращает именованный кортеж (namedtuple) вместо обычного кортежа. (Автор: Claudiu Popa в [bpo-18901](https://python-all.ru/3.8/whatsnew/3.4.html).)691692[`sunau.open()`](https://python-all.ru/3.8/library/sunau.html#sunau.open) теперь поддерживает протокол контекстного менеджера: при использовании в блоке [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) метод `close` возвращаемого объекта будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka в [bpo-18878](https://python-all.ru/3.8/whatsnew/3.4.html).)693694[`AU_write.setsampwidth()`](https://python-all.ru/3.8/library/sunau.html#sunau.AU_write.setsampwidth) теперь поддерживает 24-битные сэмплы, что добавляет поддержку записи 24-битных сэмплов с помощью этого модуля. (Автор: Serhiy Storchaka в [bpo-19261](https://python-all.ru/3.8/whatsnew/3.4.html).)695696Методы [`writeframesraw()`](https://python-all.ru/3.8/library/sunau.html#sunau.AU_write.writeframesraw) и [`writeframes()`](https://python-all.ru/3.8/library/sunau.html#sunau.AU_write.writeframes) теперь принимают любой [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object). (Автор: Serhiy Storchaka в [bpo-8311](https://python-all.ru/3.8/whatsnew/3.4.html).)697698### sys699700Новая функция [`sys.getallocatedblocks()`](https://python-all.ru/3.8/library/sys.html#sys.getallocatedblocks) возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию `--with-pymalloc` это выделения, сделанные через API [`PyObject_Malloc()`](https://python-all.ru/3.8/c-api/memory.html#c.PyObject_Malloc).) Это может быть полезно для отслеживания утечек памяти, особенно при автоматизации с помощью тестового набора. (Автор: Antoine Pitrou в [bpo-13390](https://python-all.ru/3.8/whatsnew/3.4.html).)701702Когда интерпретатор Python запускается в [интерактивном режиме](https://python-all.ru/3.8/tutorial/interpreter.html#tut-interactive), он проверяет наличие атрибута [`__interactivehook__`](https://python-all.ru/3.8/library/sys.html#sys.__interactivehook__) в модуле [`sys`](https://python-all.ru/3.8/library/sys.html#module-sys). Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка производится после чтения файла [`PYTHONSTARTUP`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONSTARTUP), поэтому его можно установить там. Модуль [`site`](https://python-all.ru/3.8/library/site.html#module-site) [устанавливает его](https://python-all.ru/3.8/library/site.html#rlcompleter-config) в функцию, которая включает автодополнение по табуляции и сохранение истории (в `~/.python-history`), если платформа поддерживает [`readline`](https://python-all.ru/3.8/library/readline.html#module-readline). Если такое (новое) поведение нежелательно, его можно переопределить в [`PYTHONSTARTUP`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONSTARTUP), `sitecustomize` или `usercustomize`, удалив этот атрибут из [`sys`](https://python-all.ru/3.8/library/sys.html#module-sys) (или установив его в другой вызываемый объект). (Авторы: Éric Araujo и Antoine Pitrou в [bpo-5845](https://python-all.ru/3.8/whatsnew/3.4.html).)703704### tarfile705706Модуль [`tarfile`](https://python-all.ru/3.8/library/tarfile.html#module-tarfile) теперь поддерживает простой [интерфейс командной строки](https://python-all.ru/3.8/library/tarfile.html#tarfile-commandline) при вызове как скрипт напрямую или через `-m`. Это можно использовать для создания и извлечения tar-архивов. (Автор: Berker Peksag в [bpo-13477](https://python-all.ru/3.8/whatsnew/3.4.html).)707708### textwrap709710Класс [`TextWrapper`](https://python-all.ru/3.8/library/textwrap.html#textwrap.TextWrapper) имеет два новых атрибута/аргумента конструктора: [`max_lines`](https://python-all.ru/3.8/library/textwrap.html#textwrap.TextWrapper.max_lines), который ограничивает количество строк в выводе, и [`placeholder`](https://python-all.ru/3.8/library/textwrap.html#textwrap.TextWrapper.placeholder), строка, которая появится в конце вывода, если он был обрезан из-за *max\_lines*. На основе этих возможностей новая удобная функция [`shorten()`](https://python-all.ru/3.8/library/textwrap.html#textwrap.shorten) сжимает все пробелы во входных данных в одиночные пробелы и создает одну строку заданной *width*, заканчивающуюся *placeholder* (по умолчанию `[...]`). (Авторы: Antoine Pitrou и Serhiy Storchaka в [bpo-18585](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-18725](https://python-all.ru/3.8/whatsnew/3.4.html).)711712### threading713714Объект [`Thread`](https://python-all.ru/3.8/library/threading.html#threading.Thread), представляющий главный поток, можно получить с помощью новой функции [`main_thread()`](https://python-all.ru/3.8/library/threading.html#threading.main_thread). В нормальных условиях это будет поток, с которого был запущен интерпретатор Python. (Автор: Andrew Svetlov в [bpo-18882](https://python-all.ru/3.8/whatsnew/3.4.html).)715716### traceback717718Новая функция [`traceback.clear_frames()`](https://python-all.ru/3.8/library/traceback.html#traceback.clear_frames) принимает объект traceback и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая потребление памяти. (Автор: Andrew Kuchling в [bpo-1565525](https://python-all.ru/3.8/whatsnew/3.4.html).)719720### types721722Новый дескриптор [`DynamicClassAttribute()`](https://python-all.ru/3.8/library/types.html#types.DynamicClassAttribute) предоставляет способ определить атрибут, который ведет себя нормально при доступе через экземпляр объекта, но перенаправляется на *класс* `__getattr__` при доступе через класс. Это позволяет иметь активные свойства на классе и виртуальные атрибуты на классе с тем же именем (см. `Enum` для примера). (Автор: Ethan Furman в [bpo-19030](https://python-all.ru/3.8/whatsnew/3.4.html).)723724### urllib725726[`urllib.request`](https://python-all.ru/3.8/library/urllib.request.html#module-urllib.request) теперь поддерживает `data:` URL-адреса через класс [`DataHandler`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.DataHandler). (Автор: Mathias Panzenböck в [bpo-16423](https://python-all.ru/3.8/whatsnew/3.4.html).)727728HTTP-метод, который будет использоваться классом [`Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request), теперь можно указать, задав атрибут класса [`method`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request.method) в подклассе. (Автор: Jason R Coombs в [bpo-18978](https://python-all.ru/3.8/whatsnew/3.4.html).)729730[`Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request) теперь можно переиспользовать: если изменить атрибуты [`full_url`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request.full_url) или [`data`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request.data), все соответствующие внутренние свойства обновятся. Это означает, например, что теперь можно использовать один и тот же объект [`Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request) в нескольких вызовах [`OpenerDirector.open()`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.OpenerDirector.open) с разными аргументами *data* или изменить `url` объекта [`Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request) вместо повторного вычисления с нуля. Также появился новый метод [`remove_header()`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request.remove_header), который можно использовать для удаления заголовков из [`Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request). (Авторы: Алексей Качаев в [bpo-16464](https://python-all.ru/3.8/whatsnew/3.4.html), Daniel Wozniak в [bpo-17485](https://python-all.ru/3.8/whatsnew/3.4.html), Damien Brecht и Senthil Kumaran в [bpo-17272](https://python-all.ru/3.8/whatsnew/3.4.html)).731732Объекты [`HTTPError`](https://python-all.ru/3.8/library/urllib.error.html#urllib.error.HTTPError) теперь имеют атрибут [`headers`](https://python-all.ru/3.8/library/urllib.error.html#urllib.error.HTTPError.headers), который предоставляет доступ к заголовкам HTTP-ответа, связанным с ошибкой. (Автор: Berker Peksag в [bpo-15701](https://python-all.ru/3.8/whatsnew/3.4.html).)733734### unittest735736У класса [`TestCase`](https://python-all.ru/3.8/library/unittest.html#unittest.TestCase) появился новый метод [`subTest()`](https://python-all.ru/3.8/library/unittest.html#unittest.TestCase.subTest), который создаёт менеджер контекста, блок [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) которого становится «подтестом». Этот менеджер контекста позволяет тестовому методу динамически генерировать подтесты, например, вызывая менеджер контекста `subTest` внутри цикла. Таким образом, один тестовый метод может породить неограниченное количество отдельно идентифицируемых и отдельно подсчитываемых тестов, все из которых будут выполняться, даже если один или несколько из них завершатся неудачей. Например:737738```python739class NumbersTest(unittest.TestCase):740 def test_even(self):741 for i in range(6):742 with self.subTest(i=i):743 self.assertEqual(i % 2, 0)744```745746приведёт к шести подтестам, каждый из которых идентифицируется в подробном выводе unittest с пометкой, состоящей из имени переменной `i` и конкретного значения для этой переменной (`i=0`, `i=1` и т.д.). Полную версию этого примера см. в [Различие итераций тестов с помощью подтестов](https://python-all.ru/3.8/library/unittest.html#subtests). (Автор: Antoine Pitrou в [bpo-16997](https://python-all.ru/3.8/whatsnew/3.4.html).)747748[`unittest.main()`](https://python-all.ru/3.8/library/unittest.html#unittest.main) теперь принимает итерируемый объект с именами тестов для *defaultTest*, тогда как раньше он принимал только одно имя теста в виде строки. (Автор: Jyrki Pulliainen в [bpo-15132](https://python-all.ru/3.8/whatsnew/3.4.html).)749750Если [`SkipTest`](https://python-all.ru/3.8/library/unittest.html#unittest.SkipTest) возбуждается во время обнаружения тестов (то есть на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как ошибка. (Автор: Zach Ware в [bpo-16935](https://python-all.ru/3.8/whatsnew/3.4.html).)751752[`discover()`](https://python-all.ru/3.8/library/unittest.html#unittest.TestLoader.discover) теперь сортирует обнаруженные файлы для обеспечения согласованного порядка тестов. (Авторы: Martin Melin и Jeff Ramnani в [bpo-16709](https://python-all.ru/3.8/whatsnew/3.4.html).)753754[`TestSuite`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite) теперь удаляет ссылки на тесты сразу после выполнения теста, если тест успешен. В интерпретаторах Python, которые поддерживают сборку мусора, это позволяет собирать тесты, если ничто другое не удерживает ссылку на тест. Это поведение можно переопределить, создав подкласс [`TestSuite`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite), который определяет пользовательский метод `_removeTestAtIndex`. (Авторы: Tom Wardill, Matt McClure и Andrew Svetlov в [bpo-11798](https://python-all.ru/3.8/whatsnew/3.4.html).)755756Новый контекстный менеджер для тестовых утверждений, [`assertLogs()`](https://python-all.ru/3.8/library/unittest.html#unittest.TestCase.assertLogs), гарантирует, что заданный блок кода выдаёт сообщение журнала с использованием модуля [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging). По умолчанию сообщение может поступать от любого регистратора и иметь приоритет `INFO` или выше, но можно указать как имя регистратора, так и альтернативный минимальный уровень журналирования. Объект, возвращаемый контекстным менеджером, можно запросить для получения [`LogRecord`](https://python-all.ru/3.8/library/logging.html#logging.LogRecord)s и/или отформатированных сообщений, которые были записаны. (Автор: Antoine Pitrou в [bpo-18937](https://python-all.ru/3.8/whatsnew/3.4.html).)757758Обнаружение тестов теперь работает с пакетами пространств имён (Автор: Claudiu Popa в [bpo-17457](https://python-all.ru/3.8/whatsnew/3.4.html).)759760Объекты [`unittest.mock`](https://python-all.ru/3.8/library/unittest.mock.html#module-unittest.mock) теперь анализируют сигнатуры своих спецификаций при сопоставлении вызовов, что означает, что аргумент теперь может быть сопоставлен как по позиции, так и по имени, а не только по позиции. (Автор: Antoine Pitrou в [bpo-17015](https://python-all.ru/3.8/whatsnew/3.4.html).)761762Объекты `mock_open()` теперь имеют методы `readline` и `readlines`. (Автор: Toshio Kuratomi в [bpo-17467](https://python-all.ru/3.8/whatsnew/3.4.html).)763764### venv765766[`venv`](https://python-all.ru/3.8/library/venv.html#module-venv) теперь включает скрипты активации для оболочек `csh` и `fish`. (Автор: Andrew Svetlov в [bpo-15417](https://python-all.ru/3.8/whatsnew/3.4.html).)767768[`EnvBuilder`](https://python-all.ru/3.8/library/venv.html#venv.EnvBuilder) и удобная функция [`create()`](https://python-all.ru/3.8/library/venv.html#venv.create) принимают новый именованный аргумент *with\_pip*, который по умолчанию равен `False`, управляющий тем, обеспечивает ли [`EnvBuilder`](https://python-all.ru/3.8/library/venv.html#venv.EnvBuilder) установку `pip` в виртуальном окружении. (Автор: Nick Coghlan в [bpo-19552](https://python-all.ru/3.8/whatsnew/3.4.html) в рамках реализации [**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html).)769770### wave771772Метод `getparams()` теперь возвращает namedtuple, а не обычный кортеж. (Автор: Claudiu Popa в [bpo-17487](https://python-all.ru/3.8/whatsnew/3.4.html).)773774[`wave.open()`](https://python-all.ru/3.8/library/wave.html#wave.open) теперь поддерживает протокол управления контекстом. (Автор: Claudiu Popa в [bpo-17616](https://python-all.ru/3.8/whatsnew/3.4.html).)775776[`wave`](https://python-all.ru/3.8/library/wave.html#module-wave) теперь может [записывать вывод в файлы без возможности позиционирования](https://python-all.ru/3.8/library/wave.html#wave-write-objects). (Авторы: David Jones, Guilherme Polo и Serhiy Storchaka в [bpo-5202](https://python-all.ru/3.8/whatsnew/3.4.html).)777778Методы [`writeframesraw()`](https://python-all.ru/3.8/library/wave.html#wave.Wave_write.writeframesraw) и [`writeframes()`](https://python-all.ru/3.8/library/wave.html#wave.Wave_write.writeframes) теперь принимают любой [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object). (Автор: Serhiy Storchaka в [bpo-8311](https://python-all.ru/3.8/whatsnew/3.4.html).)779780### weakref781782Новый класс [`WeakMethod`](https://python-all.ru/3.8/library/weakref.html#weakref.WeakMethod) имитирует слабые ссылки на привязанные методы. (Автор: Antoine Pitrou в [bpo-14631](https://python-all.ru/3.8/whatsnew/3.4.html).)783784Новый класс [`finalize`](https://python-all.ru/3.8/library/weakref.html#weakref.finalize) позволяет зарегистрировать колбэк, который будет вызван при сборке мусора объекта, без необходимости тщательно управлять жизненным циклом самой слабой ссылки. (Автор: Richard Oudkerk в [bpo-15528](https://python-all.ru/3.8/whatsnew/3.4.html).)785786Колбэк, если он есть, связанный с [`ref`](https://python-all.ru/3.8/library/weakref.html#weakref.ref), теперь доступен через атрибут [`__callback__`](https://python-all.ru/3.8/library/weakref.html#weakref.ref.__callback__). (Автор: Mark Dickinson в [bpo-17643](https://python-all.ru/3.8/whatsnew/3.4.html).)787788### xml.etree789790Новый анализатор, [`XMLPullParser`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser), позволяет неблокирующим приложениям разбирать XML-документы. Пример можно увидеть в [Pull API для неблокирующего разбора](https://python-all.ru/3.8/library/xml.etree.elementtree.html#elementtree-pull-parsing). (Автор: Antoine Pitrou в [bpo-17741](https://python-all.ru/3.8/whatsnew/3.4.html).)791792Функции [`xml.etree.ElementTree`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) [`tostring()`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostring) и [`tostringlist()`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.tostringlist), а также метод [`ElementTree`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) [`write()`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write), теперь имеют *short\_empty\_elements* [параметр, доступный только по ключевому слову](https://python-all.ru/3.8/glossary.html#keyword-only-parameter), обеспечивающий контроль над тем, записываются ли элементы без содержимого в сокращённой (`<tag />`) или развёрнутой (`<tag></tag>`) форме. (Авторы: Ariel Poliak и Serhiy Storchaka в [bpo-14377](https://python-all.ru/3.8/whatsnew/3.4.html).)793794### zipfile795796У метода [`writepy()`](https://python-all.ru/3.8/library/zipfile.html#zipfile.PyZipFile.writepy) класса [`PyZipFile`](https://python-all.ru/3.8/library/zipfile.html#zipfile.PyZipFile) появилась новая опция *filterfunc*, которая позволяет управлять тем, какие каталоги и файлы добавляются в архив. Например, с её помощью можно исключить тестовые файлы из архива. (Автор – Christian Tismer в [bpo-19274](https://python-all.ru/3.8/whatsnew/3.4.html).)797798Параметр *allowZip64* для [`ZipFile`](https://python-all.ru/3.8/library/zipfile.html#zipfile.ZipFile) и `PyZipfile` теперь по умолчанию `True`. (Автор – William Mallard в [bpo-17201](https://python-all.ru/3.8/whatsnew/3.4.html).)799800## Изменения в реализации CPython801802### PEP 445: Настройка распределителей памяти CPython803804[**PEP 445**](https://python-all.ru/3.8/whatsnew/3.4.html) добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.805806> **См. также**807>808> **[**PEP 445**](https://python-all.ru/3.8/whatsnew/3.4.html) – Добавление новых API для настройки распределителей памяти Python**809>810> PEP написан и реализован Victor Stinner.811812### PEP 442: Безопасная финализация объектов813814[**PEP 442**](https://python-all.ru/3.8/whatsnew/3.4.html) устраняет текущие ограничения и особенности финализации объектов в CPython. Благодаря ему объекты с методами [`__del__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__del__), а также генераторы с предложениями [`finally`](https://python-all.ru/3.8/reference/compound_stmts.html#finally) могут быть финализированы, когда они являются частью цикла ссылок.815816В рамках этого изменения глобальные переменные модуля больше не принудительно устанавливаются в [`None`](https://python-all.ru/3.8/library/constants.html#None) при завершении работы интерпретатора в большинстве случаев, вместо этого полагаясь на нормальную работу циклического сборщика мусора. Это позволяет избежать целого класса ошибок времени завершения работы интерпретатора, обычно связанных с методами `__del__`, которые преследовали Python с момента появления циклического GC.817818> **См. также**819>820> **[**PEP 442**](https://python-all.ru/3.8/whatsnew/3.4.html) – Безопасная финализация объектов**821>822> PEP написан и реализован Antoine Pitrou.823824### PEP 456: Безопасный и взаимозаменяемый хэш-алгоритм825826[**PEP 456**](https://python-all.ru/3.8/whatsnew/3.4.html) продолжает предыдущую работу по исправлению безопасности хэш-алгоритма Python для устранения определенных DOS-атак, которым могут подвергаться публичные API, основанные на поиске в словаре. (См. [bpo-14621](https://python-all.ru/3.8/whatsnew/3.4.html) о начале текущего цикла улучшений.) PEP унифицирует хэш-код CPython, чтобы упростить для разработчиков дистрибутивов замену хэш-алгоритма, и переключает реализацию Python по умолчанию на SipHash на платформах, имеющих 64-битный тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV незначительны.827828PEP добавляет дополнительные поля в именованный кортеж [`sys.hash_info`](https://python-all.ru/3.8/library/sys.html#sys.hash_info) для описания хэш-алгоритма, используемого текущим исполняемым файлом. В остальном PEP не изменяет никакие существующие API CPython.829830### PEP 436: Argument Clinic831832«Argument Clinic» ([**PEP 436**](https://python-all.ru/3.8/whatsnew/3.4.html)) теперь является частью процесса сборки CPython и может использоваться для упрощения определения и поддержания точных сигнатур для встроенных функций и модулей расширения стандартной библиотеки, реализованных на C.833834Некоторые модули расширения стандартной библиотеки были преобразованы для использования Argument Clinic в Python 3.4, и [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc) и [`inspect`](https://python-all.ru/3.8/library/inspect.html#module-inspect) были соответствующим образом обновлены.835836Ожидается, что метаданные сигнатур для программного самоанализа будут добавлены к дополнительным вызываемым объектам, реализованным на C, в рамках поддерживающих выпусков Python 3.4.837838> **Примечание**839>840> PEP Argument Clinic не полностью соответствует текущему состоянию реализации. В данном случае это было признано приемлемым менеджером выпуска и основной командой разработчиков, поскольку Argument Clinic не будет предоставлен как публичный API для стороннего использования в Python 3.4.841842> **См. также**843>844> **[**PEP 436**](https://python-all.ru/3.8/whatsnew/3.4.html) – DSL Argument Clinic**845>846> PEP написан и реализован Larry Hastings.847848### Прочие изменения сборки и C API849850- Новая функция [`PyType_GetSlot()`](https://python-all.ru/3.8/c-api/type.html#c.PyType_GetSlot) добавлена в стабильный ABI, позволяя извлекать указатели на функции из именованных слотов типов при использовании ограниченного API. (Автор – Martin von Löwis в [bpo-17162](https://python-all.ru/3.8/whatsnew/3.4.html).)851- Новый [`Py_SetStandardStreamEncoding()`](https://python-all.ru/3.8/c-api/init.html#c.Py_SetStandardStreamEncoding) API предварительной инициализации позволяет приложениям, встраивающим интерпретатор CPython, надежно принудительно устанавливать конкретную кодировку и обработчик ошибок для стандартных потоков. (Авторы – Bastien Montagne и Nick Coghlan в [bpo-16129](https://python-all.ru/3.8/whatsnew/3.4.html).)852- Большинство C API Python, которые не изменяют строковые аргументы, теперь правильно помечены как принимающие `const char *`, а не `char *`. (Автор – Serhiy Storchaka в [bpo-1772673](https://python-all.ru/3.8/whatsnew/3.4.html).)853- Новую оболочку версию `python-config` можно использовать, даже если интерпретатор Python недоступен (например, в сценариях кросс-компиляции).854- [`PyUnicode_FromFormat()`](https://python-all.ru/3.8/c-api/unicode.html#c.PyUnicode_FromFormat) теперь поддерживает спецификации ширины и точности для `%s`, `%A`, `%U`, `%V`, `%S` и `%R`. (Авторы – Ysj Ray и Victor Stinner в [bpo-7330](https://python-all.ru/3.8/whatsnew/3.4.html).)855- Новая функция [`PyStructSequence_InitType2()`](https://python-all.ru/3.8/c-api/tuple.html#c.PyStructSequence_InitType2) дополняет существующую функцию [`PyStructSequence_InitType()`](https://python-all.ru/3.8/c-api/tuple.html#c.PyStructSequence_InitType). Разница в том, что она возвращает `0` при успехе и `-1` при неудаче.856- Исходный код CPython теперь можно компилировать с использованием функций проверки корректности адресов последних версий GCC и clang: ложные срабатывания в распределителе малых объектов были устранены. (Автор – Dhiru Kholia в [bpo-18596](https://python-all.ru/3.8/whatsnew/3.4.html).)857- Сборка для Windows теперь использует [Address Space Layout Randomization](https://python-all.ru/3.8/whatsnew/3.4.html) и [Data Execution Prevention](https://python-all.ru/3.8/whatsnew/3.4.html). (Автор – Christian Heimes в [bpo-16632](https://python-all.ru/3.8/whatsnew/3.4.html).)858- Новая функция [`PyObject_LengthHint()`](https://python-all.ru/3.8/c-api/object.html#c.PyObject_LengthHint) является эквивалентом C API для [`operator.length_hint()`](https://python-all.ru/3.8/library/operator.html#operator.length_hint). (Автор – Armin Ronacher в [bpo-16148](https://python-all.ru/3.8/whatsnew/3.4.html).)859860### Другие улучшения861862- Команда [python](https://python-all.ru/3.8/using/cmdline.html#using-on-cmdline) получила новую [опцию](https://python-all.ru/3.8/using/cmdline.html#using-on-misc-options), `-I`, которая запускает её в «изолированном режиме». Это означает, что [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path) не содержит ни каталог скрипта, ни `site-packages` каталог пользователя, а все переменные окружения `PYTHON*` игнорируются (это подразумевает как `-s`, так и `-E`). Другие ограничения могут быть добавлены в будущем, с целью изолировать выполнение скрипта от пользовательского окружения. Это подходит, например, когда Python используется для запуска системного скрипта. На большинстве систем POSIX эту опцию можно и нужно использовать в `#!` строке системных скриптов. (Предложено Кристианом Хаймсом в [bpo-16499](https://python-all.ru/3.8/whatsnew/3.4.html).)863- Автодополнение по табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих [`readline`](https://python-all.ru/3.8/library/readline.html#module-readline). История также включена по умолчанию и записывается (и читается) из файла `~/.python-history`. (Авторы: Antoine Pitrou и Éric Araujo, [bpo-5845](https://python-all.ru/3.8/whatsnew/3.4.html).)864- Запуск интерпретатора Python с `--version` теперь выводит версию в стандартный вывод вместо стандартного вывода ошибок ([bpo-18338](https://python-all.ru/3.8/whatsnew/3.4.html)). Аналогичные изменения были внесены в [`argparse`](https://python-all.ru/3.8/library/argparse.html#module-argparse) ([bpo-18920](https://python-all.ru/3.8/whatsnew/3.4.html)) и другие модули, которые имеют возможности вызова в стиле скриптов ([bpo-18922](https://python-all.ru/3.8/whatsnew/3.4.html)).865- Установщик CPython для Windows теперь добавляет `.py` в переменную `PATHEXT` при регистрации расширений, что позволяет пользователям запускать скрипт Python из командной строки Windows, просто введя его имя без расширения `.py`. (Автор: Paul Moore, [bpo-18569](https://python-all.ru/3.8/whatsnew/3.4.html).)866- Новая цель `make` [coverage-report](https://python-all.ru/3.8/whatsnew/3.4.html) соберёт python, запустит тестовый набор и сгенерирует HTML-отчёт о покрытии для кода на C с помощью `gcov` и [lcov](https://python-all.ru/3.8/whatsnew/3.4.html).867- Опция `-R` для [набора регрессионных тестов python](https://python-all.ru/3.8/library/test.html#regrtest) теперь также проверяет утечки выделения памяти с помощью [`sys.getallocatedblocks()`](https://python-all.ru/3.8/library/sys.html#sys.getallocatedblocks). (Автор: Antoine Pitrou, [bpo-13390](https://python-all.ru/3.8/whatsnew/3.4.html).)868- `python -m` теперь работает с пространственно-именованными пакетами.869- Модуль [`stat`](https://python-all.ru/3.8/library/stat.html#module-stat) теперь реализован на C, что означает, что он получает значения своих констант из C-заголовочных файлов, а не имеет эти значения жёстко прописанными в модуле Python, как было раньше.870- Загрузка нескольких модулей Python из одного OS-модуля (`.so`, `.dll`) теперь работает корректно (ранее она молча возвращала первый модуль Python в файле). (Автор: Václav Šmilauer, [bpo-16421](https://python-all.ru/3.8/whatsnew/3.4.html).)871- Добавлен новый байт-код, [`LOAD_CLASSDEREF`](https://python-all.ru/3.8/library/dis.html#opcode-LOAD_CLASSDEREF), для исправления ошибки в загрузке свободных переменных в телах классов, которая могла быть вызвана определёнными использованиями [\_\_prepare\_\_](https://python-all.ru/3.8/reference/datamodel.html#prepare). (Автор: Benjamin Peterson, [bpo-17853](https://python-all.ru/3.8/whatsnew/3.4.html).)872- Ряд сбоев, связанных с MemoryError, были выявлены и исправлены Виктором Стиннером с помощью его инструмента `pyfailmalloc`, основанного на [**PEP 445**](https://python-all.ru/3.8/whatsnew/3.4.html) ([bpo-18408](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-18520](https://python-all.ru/3.8/whatsnew/3.4.html)).873- Команда `pyvenv` теперь принимает опцию `--copies` для использования копий вместо символьных ссылок даже в системах, где символьные ссылки используются по умолчанию. (Автор: Vinay Sajip, [bpo-18807](https://python-all.ru/3.8/whatsnew/3.4.html).)874- Команда `pyvenv` также принимает опцию `--without-pip` для подавления автоматической начальной загрузки pip в виртуальное окружение. (Автор: Nick Coghlan, [bpo-19552](https://python-all.ru/3.8/whatsnew/3.4.html) в рамках реализации [**PEP 453**](https://python-all.ru/3.8/whatsnew/3.4.html).)875- Имя кодировки теперь необязательно в значении переменной окружения [`PYTHONIOENCODING`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONIOENCODING). Это позволяет задать только обработчик ошибок, не меняя кодировку по умолчанию. (Автор: Serhiy Storchaka, [bpo-18818](https://python-all.ru/3.8/whatsnew/3.4.html).)876- Функции `open` модулей [`bz2`](https://python-all.ru/3.8/library/bz2.html#module-bz2), [`lzma`](https://python-all.ru/3.8/library/lzma.html#module-lzma) и [`gzip`](https://python-all.ru/3.8/library/gzip.html#module-gzip) теперь поддерживают режим `x` (исключительное создание). (Авторы: Tim Heaney и Vajrasky Kok, [bpo-19201](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-19222](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-19223](https://python-all.ru/3.8/whatsnew/3.4.html).)877878### Значительные оптимизации879880- Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Автор: Serhiy Storchaka, [bpo-14625](https://python-all.ru/3.8/whatsnew/3.4.html).)881- Стоимость коллизий хэшей для множеств теперь снижена. Каждый проброс хэш-таблицы теперь проверяет серию последовательных соседних пар ключ/хэш, прежде чем продолжить случайные пробросы по хэш-таблице. Это использует локальность кэша для уменьшения затрат на разрешение коллизий. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных зондирований по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR\_PROBES любым значением. Установите LINEAR\_PROBES=0, чтобы полностью отключить линейное зондирование. (Автор: Raymond Hettinger, [bpo-18771](https://python-all.ru/3.8/whatsnew/3.4.html).)882- Интерпретатор запускается примерно на 30% быстрее. К ускорению привели несколько мер. Интерпретатор загружает меньше модулей при запуске, например, модули [`re`](https://python-all.ru/3.8/library/re.html#module-re), [`collections`](https://python-all.ru/3.8/library/collections.html#module-collections) и [`locale`](https://python-all.ru/3.8/library/locale.html#module-locale) и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Авторы: Antoine Pitrou, Christian Heimes и Victor Stinner, [bpo-19219](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-19218](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-19209](https://python-all.ru/3.8/whatsnew/3.4.html), [bpo-19205](https://python-all.ru/3.8/whatsnew/3.4.html) и [bpo-9548](https://python-all.ru/3.8/whatsnew/3.4.html).)883- [`bz2.BZ2File`](https://python-all.ru/3.8/library/bz2.html#bz2.BZ2File) теперь не уступает или превосходит версию Python2 по скорости в большинстве случаев. [`lzma.LZMAFile`](https://python-all.ru/3.8/library/lzma.html#lzma.LZMAFile) также была оптимизирована. (Авторы: Serhiy Storchaka и Nadeem Vawda, [bpo-16034](https://python-all.ru/3.8/whatsnew/3.4.html).)884- [`random.getrandbits()`](https://python-all.ru/3.8/library/random.html#random.getrandbits) работает на 20–40% быстрее для малых целых чисел (наиболее распространённый случай использования). (Автор: Serhiy Storchaka, [bpo-16674](https://python-all.ru/3.8/whatsnew/3.4.html).)885- Благодаря использованию нового формата хранения строк, сериализация с помощью pickle теперь значительно быстрее. (Авторы: Victor Stinner и Antoine Pitrou, [bpo-15596](https://python-all.ru/3.8/whatsnew/3.4.html).)886- Решена проблема производительности в `io.FileIO.readall()`. Это особенно затрагивает Windows и значительно ускоряет передачу больших объёмов данных через [`subprocess`](https://python-all.ru/3.8/library/subprocess.html#module-subprocess). (Автор: Richard Oudkerk, [bpo-15758](https://python-all.ru/3.8/whatsnew/3.4.html).)887- [`html.escape()`](https://python-all.ru/3.8/library/html.html#html.escape) теперь работает в 10 раз быстрее. (Автор: Matt Bryant, [bpo-18020](https://python-all.ru/3.8/whatsnew/3.4.html).)888- В Windows теперь используется нативный `VirtualAlloc` вместо CRT `malloc` в `obmalloc`. Искусственные тесты показывают экономию памяти около 3%.889- [`os.urandom()`](https://python-all.ru/3.8/library/os.html#os.urandom) теперь использует лениво открываемый постоянный файловый дескриптор, чтобы избежать использования множества файловых дескрипторов при параллельном запуске из нескольких потоков. (Предложено Антуаном Питру в [bpo-18756](https://python-all.ru/3.8/whatsnew/3.4.html).)890891## Устарело892893В этом разделе описаны различные API и другие возможности, которые были объявлены устаревшими в Python 3.4 и будут удалены в Python 3.5 или более поздних версиях. В большинстве (но не во всех) случаев использование устаревших API будет приводить к [`DeprecationWarning`](https://python-all.ru/3.8/library/exceptions.html#DeprecationWarning) при запуске интерпретатора с включёнными предупреждениями об устаревании (например, при использовании `-Wd`).894895### Устаревшее в Python API896897- Как упоминалось в [PEP 451: A ModuleSpec Type for the Import System](https://python-all.ru/3.8/whatsnew/3.4.html#whatsnew-pep-451), ряд методов и функций [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib) объявлены устаревшими: [`importlib.find_loader()`](https://python-all.ru/3.8/library/importlib.html#importlib.find_loader) заменён на [`importlib.util.find_spec()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.find_spec); [`importlib.machinery.PathFinder.find_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.PathFinder.find_module) заменён на [`importlib.machinery.PathFinder.find_spec()`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.PathFinder.find_spec); [`importlib.abc.MetaPathFinder.find_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.MetaPathFinder.find_module) заменён на [`importlib.abc.MetaPathFinder.find_spec()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.MetaPathFinder.find_spec); [`importlib.abc.PathEntryFinder.find_loader()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.PathEntryFinder.find_loader) и [`find_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.PathEntryFinder.find_module) заменены на [`importlib.abc.PathEntryFinder.find_spec()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.PathEntryFinder.find_spec); все методы `xxxLoader` ABC `load_module` ([`importlib.abc.Loader.load_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.Loader.load_module), [`importlib.abc.InspectLoader.load_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader.load_module), [`importlib.abc.FileLoader.load_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.FileLoader.load_module), [`importlib.abc.SourceLoader.load_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.SourceLoader.load_module)) больше не следует реализовывать, вместо этого загрузчики должны реализовать метод `exec_module` ([`importlib.abc.Loader.exec_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.Loader.exec_module), [`importlib.abc.InspectLoader.exec_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.InspectLoader.exec_module) [`importlib.abc.SourceLoader.exec_module()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.SourceLoader.exec_module)) и позволить системе импорта позаботиться об остальном; и [`importlib.abc.Loader.module_repr()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.Loader.module_repr), [`importlib.util.module_for_loader()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.module_for_loader), [`importlib.util.set_loader()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.set_loader), и [`importlib.util.set_package()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.set_package) больше не нужны, поскольку их функции теперь обрабатываются автоматически системой импорта.898- Модуль [`imp`](https://python-all.ru/3.8/library/imp.html#module-imp) находится в ожидании устаревания. Чтобы сохранить совместимость с кодовыми базами Python 2/3, удаление модуля в настоящее время не запланировано.899- Модуль [`formatter`](https://python-all.ru/3.8/library/formatter.html#module-formatter) находится на стадии устаревания и запланирован к удалению в Python 3.6.900- Использование `MD5` в качестве значения по умолчанию для *digestmod* функции [`hmac.new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new) объявлено устаревшим. Начиная с Python 3.6 потребуется явно указывать имя или конструктор дайджеста в качестве аргумента *digestmod*.901- Внутренний класс `Netrc` в модуле [`ftplib`](https://python-all.ru/3.8/library/ftplib.html#module-ftplib) уже давно помечен как устаревший в своей строке документации. Теперь при его использовании генерируется [`DeprecationWarning`](https://python-all.ru/3.8/library/exceptions.html#DeprecationWarning), а в Python 3.5 он будет полностью удалён.902- Незадокументированный аргумент *endtime* функции [`subprocess.Popen.wait()`](https://python-all.ru/3.8/library/subprocess.html#subprocess.Popen.wait) не должен был быть открыт и, вероятно, не используется; он объявлен устаревшим и, скорее всего, будет удалён в Python 3.5.903- Аргумент *strict* функции [`HTMLParser`](https://python-all.ru/3.8/library/html.parser.html#html.parser.HTMLParser) объявлен устаревшим.904- Функции [`plistlib`](https://python-all.ru/3.8/library/plistlib.html#module-plistlib), [`readPlist()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.readPlist), [`writePlist()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.writePlist), [`readPlistFromBytes()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.readPlistFromBytes) и [`writePlistToBytes()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.writePlistToBytes) объявлены устаревшими в пользу соответствующих новых функций [`load()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.load), [`dump()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.dump), [`loads()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.loads) и [`dumps()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.dumps). Функция [`Data()`](https://python-all.ru/3.8/library/plistlib.html#plistlib.Data) объявлена устаревшей в пользу использования конструктора [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes).905- Ключ `SO` в [`sysconfig`](https://python-all.ru/3.8/library/sysconfig.html#module-sysconfig) объявлен устаревшим; вместо него следует использовать `EXT_SUFFIX`.906- Режим `U`, принимаемый различными функциями `open`, объявлен устаревшим. В Python 3 он не выполняет ничего полезного и должен быть заменён на соответствующие вызовы [`io.TextIOWrapper`](https://python-all.ru/3.8/library/io.html#io.TextIOWrapper) (при необходимости) и его аргумент *newline*.907- Аргумент *parser* функции [`xml.etree.ElementTree.iterparse()`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) объявлен устаревшим, равно как и аргумент *html* функции [`XMLParser()`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Для подготовки к удалению последнего все аргументы `XMLParser` следует передавать по ключу.908909### Устаревшие возможности910911- Запуск [IDLE](https://python-all.ru/3.8/library/idle.html#idle) с флагом `-n` (без подпроцесса) устарел. Однако функция не будет удалена до тех пор, пока не будет решена проблема [bpo-18823](https://python-all.ru/3.8/whatsnew/3.4.html).912- Добавление модулем site каталога «site-python» в sys.path (если он существует) объявлено устаревшим ([bpo-19375](https://python-all.ru/3.8/whatsnew/3.4.html)).913914## Удалено915916### Операционные системы, поддержка которых прекращена917918Поддержка следующих операционных систем удалена из исходного кода и средств сборки:919920- OS/2 ([bpo-16135](https://python-all.ru/3.8/whatsnew/3.4.html)).921- Windows 2000 (изменение e52df05b496a).922- Системы Windows, в которых `COMSPEC` указывает на `command.com` ([bpo-14470](https://python-all.ru/3.8/whatsnew/3.4.html)).923- VMS ([bpo-16136](https://python-all.ru/3.8/whatsnew/3.4.html)).924925### Удаление API и функций926927Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:928929- Не поддерживаемые каталоги `Misc/TextMate` и `Misc/vim` были удалены (см. [devguide](https://python-all.ru/3.8/whatsnew/3.4.html) с предложениями по замене).930- Макрос `SO` makefile удалён (он был заменён макросами `SHLIB_SUFFIX` и `EXT_SUFFIX`) ([bpo-16754](https://python-all.ru/3.8/whatsnew/3.4.html)).931- Поле `PyThreadState.tick_counter` было удалено; его значение было бессмысленным начиная с Python 3.2, когда была введена «новая GIL» ([bpo-19199](https://python-all.ru/3.8/whatsnew/3.4.html)).932- Функции `PyLoader` и `PyPycLoader` удалены из [`importlib`](https://python-all.ru/3.8/library/importlib.html#module-importlib). (Автор: Taras Lyapun, [bpo-15641](https://python-all.ru/3.8/whatsnew/3.4.html).)933- Аргумент *strict* функций [`HTTPConnection`](https://python-all.ru/3.8/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.8/library/http.client.html#http.client.HTTPSConnection) был удалён. «Простые ответы» (Simple Responses) в стиле HTTP 0.9 больше не поддерживаются.934- Устаревшие методы-геттеры и сеттеры [`urllib.request.Request`](https://python-all.ru/3.8/library/urllib.request.html#urllib.request.Request): `add_data`, `has_data`, `get_data`, `get_type`, `get_host`, `get_selector`, `set_proxy`, `get_origin_req_host` и `is_unverifiable` были удалены (вместо них следует напрямую обращаться к атрибутам).935- Поддержка загрузки устаревшего `TYPE_INT64` удалена из [`marshal`](https://python-all.ru/3.8/library/marshal.html#module-marshal). (Автор: Dan Riti, [bpo-15480](https://python-all.ru/3.8/whatsnew/3.4.html).)936- [`inspect.Signature`](https://python-all.ru/3.8/library/inspect.html#inspect.Signature): параметры только по позиции теперь должны иметь допустимое имя.937- [`object.__format__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__format__) больше не принимает непустые строки формата; вместо этого теперь генерируется [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError). Использование непустой строки было объявлено устаревшим начиная с Python 3.2. Это изменение призвано предотвратить ситуацию, когда ранее работавший (но некорректный) код начинал выдавать ошибку, если объект получал метод \_\_format\_\_. Это означает, что теперь может возникнуть [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError), если используется код формата `'s'` с объектами, у которых нет метода \_\_format\_\_, обрабатывающего его. Подробнее см. [bpo-7994](https://python-all.ru/3.8/whatsnew/3.4.html).938- Функции `difflib.SequenceMatcher.isbjunk()` и `difflib.SequenceMatcher.isbpopular()` были объявлены устаревшими в версии 3.2 и теперь удалены. Используйте `x in sm.bjunk` и `x in sm.bpopular`, где *sm* – объект [`SequenceMatcher`](https://python-all.ru/3.8/library/difflib.html#difflib.SequenceMatcher) ([bpo-13248](https://python-all.ru/3.8/whatsnew/3.4.html)).939940### Очистка кода941942- Неиспользуемый и задокументированный внутренний класс `Scanner` удалён из модуля [`pydoc`](https://python-all.ru/3.8/library/pydoc.html#module-pydoc).943- Приватный и фактически неиспользуемый модуль `_gestalt` удалён вместе с приватными функциями [`platform`](https://python-all.ru/3.8/library/platform.html#module-platform) `_mac_ver_lookup`, `_mac_ver_gstalt` и `_bcd2str`, которые могли быть вызваны только на сильно повреждённых системах OSX (см. [bpo-18393](https://python-all.ru/3.8/whatsnew/3.4.html)).944- Труднокодированные копии некоторых констант [`stat`](https://python-all.ru/3.8/library/stat.html#module-stat), которые были включены в пространство имён модуля [`tarfile`](https://python-all.ru/3.8/library/tarfile.html#module-tarfile), удалены.945946## Перенос на Python 3.4947948В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.949950### Изменения в поведении команды ‘python’951952- В оболочке posix установка переменной окружения `PATH` в пустое значение эквивалентна её отсутствию. Однако установка [`PYTHONPATH`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONPATH) в пустое значение *не* была эквивалентна её отсутствию: установка [`PYTHONPATH`](https://python-all.ru/3.8/using/cmdline.html#envvar-PYTHONPATH) в пустое значение была эквивалентна установке `.`, что приводило к путанице при аналогии с тем, как работает `PATH`. Теперь поведение соответствует соглашению posix для `PATH`.953- Вывод \[X refs, Y blocks\] отладочной (`--with-pydebug`) сборки интерпретатора CPython теперь по умолчанию отключён. Его можно снова включить с помощью опции `-X showrefcount`. (Вклад Ezio Melotti в [bpo-17323](https://python-all.ru/3.8/whatsnew/3.4.html).)954- Команда python и большинство скриптов stdlib (а также [`argparse`](https://python-all.ru/3.8/library/argparse.html#module-argparse)) теперь выводят информацию `--version` в `stdout` вместо `stderr` (список задач см. в [Other Improvements](https://python-all.ru/3.8/whatsnew/3.4.html#other-improvements-3-4) выше).955956### Изменения в Python API957958- Абстрактные базовые классы (ABC), определённые в [`importlib.abc`](https://python-all.ru/3.8/library/importlib.html#module-importlib.abc), теперь либо возбуждают соответствующее исключение, либо возвращают значение по умолчанию вместо слепого возбуждения [`NotImplementedError`](https://python-all.ru/3.8/library/exceptions.html#NotImplementedError). Это затронет только код, вызывающий [`super()`](https://python-all.ru/3.8/library/functions.html#super) и проходящий вплоть до ABC. Для совместимости перехватывайте как [`NotImplementedError`](https://python-all.ru/3.8/library/exceptions.html#NotImplementedError), так и соответствующее исключение по необходимости.959- Тип модуля теперь по умолчанию инициализирует атрибуты [`__package__`](https://python-all.ru/3.8/reference/import.html#__package__) и [`__loader__`](https://python-all.ru/3.8/reference/import.html#__loader__) значением `None`. Чтобы определить, были ли эти атрибуты установлены способом, обратно совместимым, используйте, например, `getattr(module, '__loader__', None) is not None`. ([bpo-17115](https://python-all.ru/3.8/whatsnew/3.4.html).)960- Теперь [`importlib.util.module_for_loader()`](https://python-all.ru/3.8/library/importlib.html#importlib.util.module_for_loader) безусловно устанавливает `__loader__` и `__package__` для правильной поддержки перезагрузки. Если это нежелательно, вам нужно будет установить эти атрибуты вручную. Вы можете использовать `importlib.util.module_to_load()` для управления модулями.961- Теперь при перезагрузке импорт безусловно сбрасывает соответствующие атрибуты (например, `__name__`, `__loader__`, `__package__`, `__file__`, `__cached__`). Обратите внимание, что это восстанавливает поведение, существовавшее до версии 3.3, то есть модуль заново находится при перезагрузке ([bpo-19413](https://python-all.ru/3.8/whatsnew/3.4.html)).962- Замороженные пакеты больше не устанавливают `__path__` в список, содержащий имя пакета; теперь они устанавливают его в пустой список. Предыдущее поведение могло привести к неправильной работе системы импорта при импорте подмодулей, если также существовал каталог с тем же именем, что и замороженный пакет. Правильный способ определить, является ли модуль пакетом – использовать `hasattr(module, '__path__')` ([bpo-18065](https://python-all.ru/3.8/whatsnew/3.4.html)).963- Замороженные модули больше не определяют атрибут `__file__`. Семантически некорректно устанавливать этот атрибут для замороженных модулей, так как они загружаются не из какого-либо явного расположения. Если вам нужно знать, что модуль происходит из замороженного кода, вы можете проверить, установлен ли `__spec__.location` модуля в `'frozen'`, проверить, является ли загрузчик подклассом [`importlib.machinery.FrozenImporter`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.FrozenImporter), или если необходима совместимость с Python 2, вы можете использовать `imp.is_frozen()`.964- Теперь [`py_compile.compile()`](https://python-all.ru/3.8/library/py_compile.html#py_compile.compile) возбуждает [`FileExistsError`](https://python-all.ru/3.8/library/exceptions.html#FileExistsError), если путь к файлу, в который он будет записывать, является символьной ссылкой или необычным файлом. Это служит предупреждением о том, что импорт перезапишет эти файлы обычным файлом независимо от того, каким типом пути они были изначально.965- [`importlib.abc.SourceLoader.get_source()`](https://python-all.ru/3.8/library/importlib.html#importlib.abc.SourceLoader.get_source) больше не возбуждает [`ImportError`](https://python-all.ru/3.8/library/exceptions.html#ImportError), когда загружаемый исходный код вызывает [`SyntaxError`](https://python-all.ru/3.8/library/exceptions.html#SyntaxError) или [`UnicodeDecodeError`](https://python-all.ru/3.8/library/exceptions.html#UnicodeDecodeError). Поскольку [`ImportError`](https://python-all.ru/3.8/library/exceptions.html#ImportError) предназначен для возбуждения только тогда, когда исходный код не может быть найден, хотя должен, было сочтено, что это чрезмерное расширение/перегрузка этого значения, когда исходный код найден, но неправильно структурирован. Если вы ранее перехватывали ImportError и хотите продолжать игнорировать синтаксические проблемы или проблемы декодирования, теперь перехватывайте все три исключения.966- [`functools.update_wrapper()`](https://python-all.ru/3.8/library/functools.html#functools.update_wrapper) и [`functools.wraps()`](https://python-all.ru/3.8/library/functools.html#functools.wraps) теперь правильно устанавливают атрибут `__wrapped__` в оборачиваемую функцию, даже если у этой функции также был установлен её атрибут `__wrapped__`. Это означает, что атрибуты `__wrapped__` теперь правильно связывают стек декорированных функций, вместо того чтобы каждый атрибут `__wrapped__` в цепочке ссылался на самую внутреннюю функцию. Библиотеки интроспекции, предполагавшие, что предыдущее поведение было намеренным, могут использовать [`inspect.unwrap()`](https://python-all.ru/3.8/library/inspect.html#inspect.unwrap) для доступа к первой функции в цепочке, у которой нет атрибута `__wrapped__`.967- [`inspect.getfullargspec()`](https://python-all.ru/3.8/library/inspect.html#inspect.getfullargspec) был перереализован на основе [`inspect.signature()`](https://python-all.ru/3.8/library/inspect.html#inspect.signature) и теперь обрабатывает гораздо более широкий спектр вызываемых объектов, чем раньше. Ожидается, что в течение серии Python 3.4 дополнительные встроенные вызываемые объекты и вызываемые объекты модулей расширений получат метаданные сигнатуры. Код, предполагающий, что [`inspect.getfullargspec()`](https://python-all.ru/3.8/library/inspect.html#inspect.getfullargspec) будет терпеть неудачу для не-Python вызываемых объектов, возможно, потребуется соответствующим образом скорректировать.968- [`importlib.machinery.PathFinder`](https://python-all.ru/3.8/library/importlib.html#importlib.machinery.PathFinder) теперь передаёт текущую рабочую директорию объектам в [`sys.path_hooks`](https://python-all.ru/3.8/library/sys.html#sys.path_hooks) для пустой строки. Это приводит к тому, что [`sys.path_importer_cache`](https://python-all.ru/3.8/library/sys.html#sys.path_importer_cache) никогда не содержит `''`, поэтому итерация по [`sys.path_importer_cache`](https://python-all.ru/3.8/library/sys.html#sys.path_importer_cache) на основе [`sys.path`](https://python-all.ru/3.8/library/sys.html#sys.path) не найдёт все ключи. `__file__` модуля при импорте из текущей рабочей директории теперь также будет иметь абсолютный путь, в том числе при использовании `-m` с интерпретатором (за исключением `__main__.__file__`, когда скрипт был выполнен напрямую с относительным путём). (Вклад Brett Cannon в [bpo-18416](https://python-all.ru/3.8/whatsnew/3.4.html)). указан в командной строке) ([bpo-18416](https://python-all.ru/3.8/whatsnew/3.4.html)).969- Удаление аргумента *strict* у [`HTTPConnection`](https://python-all.ru/3.8/library/http.client.html#http.client.HTTPConnection) и [`HTTPSConnection`](https://python-all.ru/3.8/library/http.client.html#http.client.HTTPSConnection) изменяет значение остальных аргументов, если вы указываете их позиционно, а не по ключевым словам. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы через ключевые слова.970- Строки между операторами `from __future__ import ...` теперь *всегда* возбуждают [`SyntaxError`](https://python-all.ru/3.8/library/exceptions.html#SyntaxError). Ранее, если не было начальной docstring, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже соответствовали. ([bpo-17434](https://python-all.ru/3.8/whatsnew/3.4.html)).971- [`ssl.SSLSocket.getpeercert()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLSocket.getpeercert) и [`ssl.SSLSocket.do_handshake()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLSocket.do_handshake) теперь возбуждают [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) с `ENOTCONN`, когда `SSLSocket` не подключён, вместо предыдущего поведения с возбуждением [`AttributeError`](https://python-all.ru/3.8/library/exceptions.html#AttributeError). Кроме того, [`getpeercert()`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLSocket.getpeercert) возбудит [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError), если рукопожатие ещё не выполнено.972- [`base64.b32decode()`](https://python-all.ru/3.8/library/base64.html#base64.b32decode) теперь возбуждает [`binascii.Error`](https://python-all.ru/3.8/library/binascii.html#binascii.Error), когда входная строка содержит символы, не входящие в b32-алфавит, вместо [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError). Это конкретное [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError) было пропущено при конвертации других [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError). (Вклад Serhiy Storchaka в [bpo-18011](https://python-all.ru/3.8/whatsnew/3.4.html).) Примечание: это изменение было также непреднамеренно применено в Python 3.3.3.973- Теперь атрибут `file` автоматически закрывается, когда создающий его экземпляр `cgi.FieldStorage` собирается сборщиком мусора. Если вы извлекали файловый объект отдельно от экземпляра `cgi.FieldStorage` и не поддерживали экземпляр живым, вам следует либо хранить весь экземпляр `cgi.FieldStorage`, либо прочитать содержимое файла до того, как экземпляр `cgi.FieldStorage` будет уничтожен сборщиком мусора.974- Вызов `read` или `write` на закрытом SSL-сокете теперь возбуждает информативное [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError) вместо предыдущего более загадочного [`AttributeError`](https://python-all.ru/3.8/library/exceptions.html#AttributeError) ([bpo-9177](https://python-all.ru/3.8/whatsnew/3.4.html)).975- [`slice.indices()`](https://python-all.ru/3.8/reference/datamodel.html#slice.indices) больше не выдаёт [`OverflowError`](https://python-all.ru/3.8/library/exceptions.html#OverflowError) для огромных значений. В результате этого исправления [`slice.indices()`](https://python-all.ru/3.8/reference/datamodel.html#slice.indices) теперь возбуждает [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError), если ему передана отрицательная длина; ранее он возвращал бессмысленные значения ([bpo-14794](https://python-all.ru/3.8/whatsnew/3.4.html)).976- Конструктор [`complex`](https://python-all.ru/3.8/library/functions.html#complex), в отличие от функций [`cmath`](https://python-all.ru/3.8/library/cmath.html#module-cmath), некорректно принимал значения [`float`](https://python-all.ru/3.8/library/functions.html#float), если специальный метод `__complex__` объекта возвращал такое значение. Теперь это возбуждает [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError). ([bpo-16290](https://python-all.ru/3.8/whatsnew/3.4.html).)977- Конструктор [`int`](https://python-all.ru/3.8/library/functions.html#int) в версиях 3.2 и 3.3 ошибочно принимал значения [`float`](https://python-all.ru/3.8/library/functions.html#float) для параметра *base*. Маловероятно, что кто-то так делал, но если да, то теперь будет возбуждено [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError) ([bpo-16772](https://python-all.ru/3.8/whatsnew/3.4.html)).978- Значения по умолчанию для аргументов, передаваемых только по ключевым словам, теперь вычисляются *после* значений по умолчанию для обычных keyword-аргументов, а не до. Надеемся, никто не написал код, зависящий от предыдущего ошибочного поведения ([bpo-16967](https://python-all.ru/3.8/whatsnew/3.4.html)).979- Устаревшие состояния потоков теперь очищаются после [`fork()`](https://python-all.ru/3.8/library/os.html#os.fork). Это может привести к освобождению некоторых системных ресурсов, которые ранее некорректно поддерживались вечно живыми (например, соединения с базой данных, хранящиеся в локальном хранилище потоков). ([bpo-17094](https://python-all.ru/3.8/whatsnew/3.4.html).)980- Имена параметров в `__annotations__` словарях теперь корректно искажаются, аналогично `__kwdefaults__`. (Предложено Юрием Селивановым в [bpo-20625](https://python-all.ru/3.8/whatsnew/3.4.html).)981- [`hashlib.hash.name`](https://python-all.ru/3.8/library/hashlib.html#hashlib.hash.name) теперь всегда возвращает идентификатор в нижнем регистре. Ранее некоторые встроенные хеши имели имена в верхнем регистре, но теперь, когда это формальный публичный интерфейс, именование приведено к единому виду ([bpo-18532](https://python-all.ru/3.8/whatsnew/3.4.html)).982- Поскольку [`unittest.TestSuite`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite) теперь удаляет ссылки на тесты после их запуска, тестовые обвязки, которые повторно используют [`TestSuite`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite) для перезапуска набора тестов, могут завершиться ошибкой. Тестовые наборы не следует использовать повторно таким образом, так как это означает сохранение состояния между запусками тестов, нарушая изоляцию тестов, которую [`unittest`](https://python-all.ru/3.8/library/unittest.html#module-unittest) предназначена обеспечивать. Однако, если отсутствие изоляции считается приемлемым, старое поведение можно восстановить, создав подкласс [`TestSuite`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite), который определяет метод `_removeTestAtIndex`, ничего не делающий (см. [`TestSuite.__iter__()`](https://python-all.ru/3.8/library/unittest.html#unittest.TestSuite.__iter__)) ([bpo-11798](https://python-all.ru/3.8/whatsnew/3.4.html)).983- [`unittest`](https://python-all.ru/3.8/library/unittest.html#module-unittest) теперь использует [`argparse`](https://python-all.ru/3.8/library/argparse.html#module-argparse) для разбора командной строки. Некоторые некорректные формы команд, которые ранее работали, больше не допускаются; теоретически это не должно вызывать проблем с обратной совместимостью, поскольку запрещённые формы команд не имели смысла и вряд ли используются.984- Функции [`re.split()`](https://python-all.ru/3.8/library/re.html#re.split), [`re.findall()`](https://python-all.ru/3.8/library/re.html#re.findall) и [`re.sub()`](https://python-all.ru/3.8/library/re.html#re.sub), а также методы `group()` и `groups()` объектов `match` теперь всегда возвращают объект *bytes*, если строка, которую нужно сопоставить, является [байтоподобным объектом](https://python-all.ru/3.8/glossary.html#term-bytes-like-object). Ранее тип возвращаемого значения соответствовал типу входных данных, поэтому если ваш код зависел от того, что возвращаемое значение было, скажем, `bytearray`, вам потребуется изменить код.985- Функции [`audioop`](https://python-all.ru/3.8/library/audioop.html#module-audioop) теперь немедленно вызывают ошибку при передаче строкового входного значения, вместо того чтобы случайным образом завершаться с ошибкой позже ([bpo-16685](https://python-all.ru/3.8/whatsnew/3.4.html)).986- Новый аргумент *convert\_charrefs* для [`HTMLParser`](https://python-all.ru/3.8/library/html.parser.html#html.parser.HTMLParser) в настоящее время по умолчанию равен `False` для обратной совместимости, но в конечном итоге будет изменён на значение по умолчанию `True`. Рекомендуется добавить этот ключевой аргумент с соответствующим значением ко всем вызовам [`HTMLParser`](https://python-all.ru/3.8/library/html.parser.html#html.parser.HTMLParser) в вашем коде ([bpo-13633](https://python-all.ru/3.8/whatsnew/3.4.html)).987- Поскольку аргумент *digestmod* функции [`hmac.new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new) в будущем не будет иметь значения по умолчанию, все вызовы [`hmac.new()`](https://python-all.ru/3.8/library/hmac.html#hmac.new) следует изменить, чтобы явно указывать *digestmod* ([bpo-17276](https://python-all.ru/3.8/whatsnew/3.4.html)).988- Вызов [`sysconfig.get_config_var()`](https://python-all.ru/3.8/library/sysconfig.html#sysconfig.get_config_var) с ключом `SO` или поиск `SO` в результатах вызова [`sysconfig.get_config_vars()`](https://python-all.ru/3.8/library/sysconfig.html#sysconfig.get_config_vars) является устаревшим. Этот ключ следует заменить на `EXT_SUFFIX` или `SHLIB_SUFFIX` в зависимости от контекста ([bpo-19555](https://python-all.ru/3.8/whatsnew/3.4.html)).989- Любые вызовы функций `open`, которые указывают `U`, следует изменить. `U` неэффективен в Python3 и в конечном итоге вызовет ошибку при использовании. В зависимости от функции, эквивалент её старого поведения в Python2 можно получить, используя аргумент *newline* или, при необходимости, обернув поток в [`TextIOWrapper`](https://python-all.ru/3.8/library/io.html#io.TextIOWrapper) для использования его аргумента *newline* ([bpo-15204](https://python-all.ru/3.8/whatsnew/3.4.html)).990- Если вы используете `pyvenv` в скрипте и хотите, чтобы pip *не* был установлен, необходимо добавить `--without-pip` в вызов команды.991- Поведение по умолчанию [`json.dump()`](https://python-all.ru/3.8/library/json.html#json.dump) и [`json.dumps()`](https://python-all.ru/3.8/library/json.html#json.dumps) при указании отступа изменилось: больше не добавляются завершающие пробелы после запятых-разделителей элементов в конце строк. Это имеет значение только в том случае, если у вас есть тесты, которые выполняют чувствительные к пробелам сравнения такого вывода ([bpo-16333](https://python-all.ru/3.8/whatsnew/3.4.html)).992- [`doctest`](https://python-all.ru/3.8/library/doctest.html#module-doctest) теперь ищет доктесты в строках `__doc__` модулей расширений, поэтому если ваше обнаружение тестов доктестов включает модули расширений, которые содержат конструкции, похожие на доктесты, вы можете увидеть сбои тестов, которых раньше не замечали при запуске тестов ([bpo-3158](https://python-all.ru/3.8/whatsnew/3.4.html)).993- Модуль [`collections.abc`](https://python-all.ru/3.8/library/collections.abc.html#module-collections.abc) был немного реорганизован в рамках улучшений запуска Python. В результате этого импорт [`collections`](https://python-all.ru/3.8/library/collections.html#module-collections) больше не приводит к автоматическому импорту [`collections.abc`](https://python-all.ru/3.8/library/collections.abc.html#module-collections.abc). Если ваша программа зависела от (недокументированного) неявного импорта, вам нужно добавить явный `import collections.abc` ([bpo-20784](https://python-all.ru/3.8/whatsnew/3.4.html)).994995### Изменения в C API996997- [`PyEval_EvalFrameEx()`](https://python-all.ru/3.8/c-api/veryhigh.html#c.PyEval_EvalFrameEx), [`PyObject_Repr()`](https://python-all.ru/3.8/c-api/object.html#c.PyObject_Repr) и [`PyObject_Str()`](https://python-all.ru/3.8/c-api/object.html#c.PyObject_Str), а также некоторые другие внутренние C API, теперь включают отладочное утверждение, которое гарантирует, что они не используются в ситуациях, когда могут молча отбросить активное в данный момент исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже было сохранено локально с помощью [`PyErr_Fetch()`](https://python-all.ru/3.8/c-api/exceptions.html#c.PyErr_Fetch) или намеренно заменяется другим исключением), потребуется явный вызов [`PyErr_Clear()`](https://python-all.ru/3.8/c-api/exceptions.html#c.PyErr_Clear), чтобы не запускать утверждение при вызове этих операций (прямо или косвенно) и запуске на версии Python, скомпилированной с включёнными утверждениями.998- [`PyErr_SetImportError()`](https://python-all.ru/3.8/c-api/exceptions.html#c.PyErr_SetImportError) теперь устанавливает [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError), когда его аргумент **msg** не задан. Ранее возвращался только `NULL` без установленного исключения.999- Результат колбэка [`PyOS_ReadlineFunctionPointer`](https://python-all.ru/3.8/c-api/veryhigh.html#c.PyOS_ReadlineFunctionPointer) теперь должен быть строкой, выделенной с помощью [`PyMem_RawMalloc()`](https://python-all.ru/3.8/c-api/memory.html#c.PyMem_RawMalloc) или [`PyMem_RawRealloc()`](https://python-all.ru/3.8/c-api/memory.html#c.PyMem_RawRealloc), или `NULL` в случае ошибки, а не строкой, выделенной с помощью [`PyMem_Malloc()`](https://python-all.ru/3.8/c-api/memory.html#c.PyMem_Malloc) или [`PyMem_Realloc()`](https://python-all.ru/3.8/c-api/memory.html#c.PyMem_Realloc) ([bpo-16742](https://python-all.ru/3.8/whatsnew/3.4.html))1000- [`PyThread_set_key_value()`](https://python-all.ru/3.8/c-api/init.html#c.PyThread_set_key_value) теперь всегда устанавливает значение. В Python 3.3 функция ничего не делала, если ключ уже существовал (если текущее значение является указателем, не равным `NULL`).1001- Поле `f_tstate` (состояние потока) структуры [`PyFrameObject`](https://python-all.ru/3.8/c-api/veryhigh.html#c.PyFrameObject) было удалено для исправления ошибки: см. [bpo-14432](https://python-all.ru/3.8/whatsnew/3.4.html) для обоснования.10021003## Изменено в версии 3.4.310041005### PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотеки10061007[`http.client`](https://python-all.ru/3.8/library/http.client.html#module-http.client) и модули, которые его используют, такие как [`urllib.request`](https://python-all.ru/3.8/library/urllib.request.html#module-urllib.request) и [`xmlrpc.client`](https://python-all.ru/3.8/library/xmlrpc.client.html#module-xmlrpc.client), теперь проверяют, что сервер предъявляет сертификат, подписанный удостоверяющим центром из хранилища доверия платформы, и что имя хоста совпадает с запрашиваемым именем хоста по умолчанию, что значительно повышает безопасность для многих приложений.10081009Для приложений, которым требуется старое поведение, можно передать альтернативный контекст:10101011```python1012import urllib.request1013import ssl10141015# Это отключает все проверки1016context = ssl._create_unverified_context()10171018# Это позволяет использовать конкретный сертификат для хоста, которому не нужно1019# находиться в хранилище доверенных сертификатов1020context = ssl.create_default_context(cafile="/path/to/file.crt")10211022urllib.request.urlopen("https://invalid-cert", context=context)1023```1024