3.6.md
1> **Источник:** https://python-all.ru/3/whatsnew/3.6.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.689**Редакторы:**1011Elvis Pranskevichus \<[elvis@magic.io](https://python-all.ru/3/whatsnew/3.6.html)\>, Yury Selivanov \<[yury@magic.io](https://python-all.ru/3/whatsnew/3.6.html)\>1213В этой статье объясняются новые возможности Python 3.6 по сравнению с 3.5. Python 3.6 выпущен 23 декабря 2016 г. Полный список изменений см. в [журнале изменений](https://python-all.ru/3.6/whatsnew/changelog.html).1415> **См. также**16>17> [**PEP 494**](https://python-all.ru/3/whatsnew/3.6.html) – График выпуска Python 3.61819## Итоги – основные изменения2021Новые синтаксические возможности:2223- [PEP 498](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep498), форматированные строковые литералы.24- [PEP 515](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep515), символы подчёркивания в числовых литералах.25- [PEP 526](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep526), синтаксис аннотаций переменных.26- [PEP 525](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep525), асинхронные генераторы.27- [PEP 530](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep530): асинхронные включения.2829Новые модули библиотеки:3031- [`secrets`](https://python-all.ru/3/library/secrets.html#module-secrets): [PEP 506 – Добавление модуля Secrets в стандартную библиотеку](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep506).3233Улучшения реализации CPython:3435- Тип [dict](https://python-all.ru/3/library/stdtypes.html#typesmapping) был переработан для использования [более компактного представления](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-compactdict), основанного на [предложении Рэймонда Хеттингера](https://python-all.ru/3/whatsnew/3.6.html) и аналогичного [реализации dict в PyPy](https://python-all.ru/3/whatsnew/3.6.html). Это привело к тому, что словари потребляют на 20–25% меньше памяти по сравнению с Python 3.5.36- Настройка создания классов упрощена с помощью [нового протокола](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep487).37- Порядок определения атрибутов класса [теперь сохраняется](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep520).38- Порядок элементов в `**kwargs` теперь [соответствует порядку](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep468), в котором именованные аргументы были переданы функции.39- Добавлена поддержка [зондирования DTrace и SystemTap](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-tracing).40- Новая [переменная окружения PYTHONMALLOC](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pythonmalloc) теперь может использоваться для отладки распределения памяти интерпретатора и ошибок доступа.4142Значительные улучшения в стандартной библиотеке:4344- Модуль [`asyncio`](https://python-all.ru/3/library/asyncio.html#module-asyncio) получил новые возможности, значительные улучшения удобства использования и производительности, а также изрядное количество исправлений ошибок. Начиная с Python 3.6 модуль `asyncio` больше не является экспериментальным и его API считается стабильным.45- Новый [протокол путей файловой системы](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep519) был реализован для поддержки [путеподобных объектов](https://python-all.ru/3/glossary.html#term-path-like-object). Все функции стандартной библиотеки, работающие с путями, были обновлены для работы с новым протоколом.46- Модуль [`datetime`](https://python-all.ru/3/library/datetime.html#module-datetime) получил поддержку [устранения неоднозначности местного времени](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep495).47- Модуль [`typing`](https://python-all.ru/3/library/typing.html#module-typing) получил ряд [улучшений](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-typing).48- Модуль [`tracemalloc`](https://python-all.ru/3/library/tracemalloc.html#module-tracemalloc) был значительно переработан и теперь используется для обеспечения лучшего вывода для [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning), а также для обеспечения лучшей диагностики ошибок выделения памяти. Смотрите [раздел PYTHONMALLOC](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pythonmalloc) для получения дополнительной информации.4950Улучшения в области безопасности:5152- Новый модуль [`secrets`](https://python-all.ru/3/library/secrets.html#module-secrets) был добавлен для упрощения генерации криптографически стойких псевдослучайных чисел, подходящих для управления секретами, такими как аутентификация учётных записей, токены и т.п.53- В Linux [`os.urandom()`](https://python-all.ru/3/library/os.html#os.urandom) теперь ожидает инициализации пула энтропии системного urandom для повышения безопасности. Смотрите [**PEP 524**](https://python-all.ru/3/whatsnew/3.6.html) для обоснования.54- Модули [`hashlib`](https://python-all.ru/3/library/hashlib.html#module-hashlib) и [`ssl`](https://python-all.ru/3/library/ssl.html#module-ssl) теперь поддерживают OpenSSL 1.1.0.55- Настройки по умолчанию и набор функций модуля [`ssl`](https://python-all.ru/3/library/ssl.html#module-ssl) были улучшены.56- Модуль [`hashlib`](https://python-all.ru/3/library/hashlib.html#module-hashlib) получил поддержку алгоритмов хеширования BLAKE2, SHA-3 и SHAKE и функции выработки ключа [`scrypt()`](https://python-all.ru/3/library/hashlib.html#hashlib.scrypt).5758Улучшения для Windows:5960- [PEP 528](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep528) и [PEP 529](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep529) – кодировка файловой системы и консоли Windows изменена на UTF-8.61- Загрузчик `py.exe` при интерактивном использовании больше не предпочитает Python 2 вместо Python 3, если пользователь не указывает версию (через аргументы командной строки или конфигурационный файл). Обработка строк shebang остаётся без изменений – в этом случае “python” относится к Python 2.62- `python.exe` и `pythonw.exe` были помечены как поддерживающие длинные пути, что означает, что ограничение в 260 символов на путь может больше не применяться. Смотрите [снятие ограничения MAX\_PATH](https://python-all.ru/3/using/windows.html#max-path) для получения подробной информации.63- Файл `._pth` можно добавить, чтобы принудительно включить изолированный режим и полностью задать все пути поиска, избегая поиска в реестре и окружении. Смотрите [документацию](https://python-all.ru/3/using/windows.html#windows-finding-modules) для получения дополнительной информации.64- Файл `python36.zip` теперь служит ориентиром для определения [`PYTHONHOME`](https://python-all.ru/3/using/cmdline.html#envvar-PYTHONHOME). Смотрите [документацию](https://python-all.ru/3/using/windows.html#windows-finding-modules) для получения дополнительной информации.6566## Новые возможности6768### PEP 498: Форматированные строковые литералы6970[**PEP 498**](https://python-all.ru/3/whatsnew/3.6.html) вводит новый вид строковых литералов: *f-строки*, или [форматированные строковые литералы](https://python-all.ru/3/reference/lexical_analysis.html#f-strings).7172Форматированные строковые литералы имеют префикс `'f'` и аналогичны строкам формата, принимаемым [`str.format()`](https://python-all.ru/3/library/stdtypes.html#str.format). Они содержат поля замены, заключённые в фигурные скобки. Поля замены – это выражения, которые вычисляются во время выполнения, а затем форматируются с использованием протокола [`format()`](https://python-all.ru/3/library/functions.html#format):7374```python75>>> name = "Fred"76>>> f"He said his name is {name}."77'He said his name is Fred.'78>>> width = 1079>>> precision = 480>>> value = decimal.Decimal("12.34567")81>>> f"result: {value:{width}.{precision}}" # вложенные поля82'result: 12.35'83```8485> **См. также**86>87> **[**PEP 498**](https://python-all.ru/3/whatsnew/3.6.html) – Интерполяция строковых литералов.**88>89> PEP написан и реализован Eric V. Smith.90>91> [Документация по возможностям](https://python-all.ru/3/reference/lexical_analysis.html#f-strings).9293### PEP 526: Синтаксис аннотаций переменных9495[**PEP 484**](https://python-all.ru/3/whatsnew/3.6.html) ввёл стандарт для аннотаций типов параметров функций, также известных как подсказки типов. Этот PEP добавляет в Python синтаксис для аннотации типов переменных, включая переменные классов и экземпляров:9697```python98primes: List[int] = []99100captain: str # Примечание: нет начального значения!101102class Starship:103 stats: Dict[str, int] = {}104```105106Как и в случае аннотаций функций, интерпретатор Python не придаёт никакого особого значения аннотациям переменных и просто хранит их в атрибуте `__annotations__` класса или модуля.107108В отличие от объявлений переменных в статически типизированных языках, цель синтаксиса аннотаций – предоставить простой способ задания структурированных метаданных типов для сторонних инструментов и библиотек через абстрактное синтаксическое дерево и атрибут `__annotations__`.109110> **См. также**111>112> **[**PEP 526**](https://python-all.ru/3/whatsnew/3.6.html) – Синтаксис аннотаций переменных.**113>114> PEP написан Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach, и Guido van Rossum. Реализован Ivan Levkivskyi.115>116> Инструменты, которые используют или будут использовать новый синтаксис: [mypy](https://python-all.ru/3/whatsnew/3.6.html), [pytype](https://python-all.ru/3/whatsnew/3.6.html), PyCharm и др.117118### PEP 515: Подчёркивания в числовых литералах119120[**PEP 515**](https://python-all.ru/3/whatsnew/3.6.html) добавляет возможность использовать подчёркивания в числовых литералах для улучшения читаемости. Например:121122```python123>>> 1_000_000_000_000_0001241000000000000000125>>> 0x_FF_FF_FF_FF1264294967295127```128129Одиночные подчёркивания допускаются между цифрами и после указателя основания. Ведущие, завершающие или несколько подряд идущих подчёркиваний не допускаются.130131Язык [строкового форматирования](https://python-all.ru/3/library/string.html#formatspec) теперь также поддерживает опцию `'_'` для обозначения использования подчёркивания в качестве разделителя тысяч для типов представления с плавающей запятой и для целочисленного типа представления `'d'`. Для целочисленных типов представления `'b'`, `'o'`, `'x'` и `'X'` подчёркивания будут вставляться каждые 4 цифры:132133```python134>>> '{:_}'.format(1000000)135'1_000_000'136>>> '{:_x}'.format(0xFFFFFFFF)137'ffff_ffff'138```139140> **См. также**141>142> **[**PEP 515**](https://python-all.ru/3/whatsnew/3.6.html) – Подчёркивания в числовых литералах**143>144> PEP написан Георгом Брандлем и Сергием Сторчакой.145146### PEP 525: Асинхронные генераторы147148[**PEP 492**](https://python-all.ru/3/whatsnew/3.6.html) ввёл поддержку нативных корутин и синтаксиса `async` / `await` в Python 3.5. Заметным ограничением реализации Python 3.5 было то, что нельзя было использовать `await` и `yield` в одном теле функции. В Python 3.6 это ограничение было снято, что позволило определять *асинхронные генераторы*:149150```python151async def ticker(delay, to):152 """Генерирует числа от 0 до *to* каждые *delay* секунд."""153 for i in range(to):154 yield i155 await asyncio.sleep(delay)156```157158Новый синтаксис позволяет писать более быстрый и лаконичный код.159160> **См. также**161>162> **[**PEP 525**](https://python-all.ru/3/whatsnew/3.6.html) – Асинхронные генераторы**163>164> PEP написан и реализован Юрием Селивановым.165166### PEP 530: Асинхронные включения167168[**PEP 530**](https://python-all.ru/3/whatsnew/3.6.html) добавляет поддержку использования `async for` в списочных, множественных, словарных включениях и генераторных выражениях:169170```python171result = [i async for i in aiter() if i % 2]172```173174Кроме того, выражения `await` поддерживаются во всех видах включений:175176```python177result = [await fun() for fun in funcs if await condition()]178```179180> **См. также**181>182> **[**PEP 530**](https://python-all.ru/3/whatsnew/3.6.html) – Асинхронные включения**183>184> PEP написан и реализован Юрием Селивановым.185186### PEP 487: Упрощённая настройка создания классов187188Теперь можно настраивать создание подклассов без использования метакласса. Новый метод класса `__init_subclass__` будет вызываться на базовом классе при создании каждого нового подкласса:189190```python191class PluginBase:192 subclasses = []193194 def __init_subclass__(cls, **kwargs):195 super().__init_subclass__(**kwargs)196 cls.subclasses.append(cls)197198class Plugin1(PluginBase):199 pass200201class Plugin2(PluginBase):202 pass203```204205Чтобы вызовы [`super()`](https://python-all.ru/3/library/functions.html#super) без аргументов корректно работали в реализациях [`__init_subclass__()`](https://python-all.ru/3/reference/datamodel.html#object.__init_subclass__), пользовательские метаклассы должны гарантировать, что новая запись пространства имён `__classcell__` передаётся в `type.__new__` (как описано в [Создание объекта класса](https://python-all.ru/3/reference/datamodel.html#class-object-creation)).206207> **См. также**208>209> **[**PEP 487**](https://python-all.ru/3/whatsnew/3.6.html) – Упрощённая настройка создания классов**210>211> PEP написан и реализован Мартином Тайхманом.212>213> [Документация по функции](https://python-all.ru/3/reference/datamodel.html#class-customization)214215### PEP 487: Улучшения протокола дескрипторов216217[**PEP 487**](https://python-all.ru/3/whatsnew/3.6.html) расширяет протокол дескрипторов, добавляя новый необязательный метод [`__set_name__()`](https://python-all.ru/3/reference/datamodel.html#object.__set_name__). При каждом определении нового класса этот новый метод будет вызываться на всех дескрипторах, включённых в определение, предоставляя им ссылку на определяемый класс и имя, данное дескриптору в пространстве имён класса. Другими словами, экземпляры дескрипторов теперь могут знать имя атрибута дескриптора в классе-владельце:218219```python220class IntField:221 def __get__(self, instance, owner):222 return instance.__dict__[self.name]223224 def __set__(self, instance, value):225 if not isinstance(value, int):226 raise ValueError(f'expecting integer in {self.name}')227 instance.__dict__[self.name] = value228229 # это новый инициализатор:230 def __set_name__(self, owner, name):231 self.name = name232233class Model:234 int_field = IntField()235```236237> **См. также**238>239> **[**PEP 487**](https://python-all.ru/3/whatsnew/3.6.html) – Упрощённая настройка создания классов**240>241> PEP написан и реализован Мартином Тайхманом.242>243> [Документация по функции](https://python-all.ru/3/reference/datamodel.html#descriptors)244245### PEP 519: Добавление протокола путей файловой системы246247Пути файловой системы исторически представлялись как объекты [`str`](https://python-all.ru/3/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes). Это привело к тому, что разработчики кода, работающего с путями файловой системы, предполагают, что такие объекты относятся только к одному из этих двух типов ([`int`](https://python-all.ru/3/library/functions.html#int), представляющий файловый дескриптор, не считается, так как это не путь к файлу). К сожалению, такое предположение мешает альтернативным объектным представлениям путей файловой системы, таким как [`pathlib`](https://python-all.ru/3/library/pathlib.html#module-pathlib), работать с существующим кодом, включая стандартную библиотеку Python.248249Чтобы исправить эту ситуацию, был определён новый интерфейс, представленный [`os.PathLike`](https://python-all.ru/3/library/os.html#os.PathLike). Реализуя метод [`__fspath__()`](https://python-all.ru/3/library/os.html#os.PathLike.__fspath__), объект сигнализирует, что он представляет путь. Затем объект может предоставить низкоуровневое представление пути файловой системы в виде объекта [`str`](https://python-all.ru/3/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes). Это означает, что объект считается [путеподобным](https://python-all.ru/3/glossary.html#term-path-like-object), если он реализует `os.PathLike` или является объектом `str` или `bytes`, который представляет путь файловой системы. Код может использовать [`os.fspath()`](https://python-all.ru/3/library/os.html#os.fspath), [`os.fsdecode()`](https://python-all.ru/3/library/os.html#os.fsdecode) или [`os.fsencode()`](https://python-all.ru/3/library/os.html#os.fsencode) для явного получения представления `str` и/или `bytes` путеподобного объекта.250251Встроенная функция [`open()`](https://python-all.ru/3/library/functions.html#open) была обновлена для принятия объектов [`os.PathLike`](https://python-all.ru/3/library/os.html#os.PathLike), как и все соответствующие функции в модулях [`os`](https://python-all.ru/3/library/os.html#module-os) и [`os.path`](https://python-all.ru/3/library/os.path.html#module-os.path), а также большинство других функций и классов в стандартной библиотеке. Класс [`os.DirEntry`](https://python-all.ru/3/library/os.html#os.DirEntry) и соответствующие классы в [`pathlib`](https://python-all.ru/3/library/pathlib.html#module-pathlib) также были обновлены для реализации `os.PathLike`.252253Надеемся, что обновление фундаментальных функций для работы с путями файловой системы приведёт к тому, что сторонний код будет неявно поддерживать все [путеподобные объекты](https://python-all.ru/3/glossary.html#term-path-like-object) без каких-либо изменений кода или, по крайней мере, с минимальными (например, вызов [`os.fspath()`](https://python-all.ru/3/library/os.html#os.fspath) в начале кода перед работой с путеподобным объектом).254255Вот несколько примеров того, как новый интерфейс позволяет использовать [`pathlib.Path`](https://python-all.ru/3/library/pathlib.html#pathlib.Path) проще и прозрачнее с существующим кодом:256257```python258>>> import pathlib259>>> with open(pathlib.Path("README")) as f:260... contents = f.read()261...262>>> import os.path263>>> os.path.splitext(pathlib.Path("some_file.txt"))264('some_file', '.txt')265>>> os.path.join("/a/b", pathlib.Path("c"))266'/a/b/c'267>>> import os268>>> os.fspath(pathlib.Path("some_file.txt"))269'some_file.txt'270```271272(Реализовано Бреттом Кэнноном, Итаном Фурманом, Дасти Филлипсом и Йелле Зейлстрой.)273274> **См. также**275>276> **[**PEP 519**](https://python-all.ru/3/whatsnew/3.6.html) – Добавление протокола путей файловой системы**277>278> PEP написан Бреттом Кэнноном и Кусом Зевенховеном.279280### PEP 495: Устранение неоднозначности местного времени281282В большинстве регионов мира были и будут моменты, когда местные часы переводятся назад. В такие моменты возникают интервалы, в течение которых местные часы показывают одно и то же время дважды за день. В этих ситуациях информации, отображаемой на местных часах (или хранящейся в экземпляре Python datetime), недостаточно для идентификации конкретного момента времени.283284[**PEP 495**](https://python-all.ru/3/whatsnew/3.6.html) добавляет новый атрибут *fold* к экземплярам классов [`datetime.datetime`](https://python-all.ru/3/library/datetime.html#datetime.datetime) и [`datetime.time`](https://python-all.ru/3/library/datetime.html#datetime.time), чтобы различать два момента времени, для которых местные времена одинаковы:285286```python287>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)288>>> for i in range(4):289... u = u0 + i*HOUR290... t = u.astimezone(Eastern)291... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)292...29304:00:00 UTC = 00:00:00 EDT 029405:00:00 UTC = 01:00:00 EDT 029506:00:00 UTC = 01:00:00 EST 129607:00:00 UTC = 02:00:00 EST 0297```298299Значения атрибута [`fold`](https://python-all.ru/3/library/datetime.html#datetime.datetime.fold) имеют значение `0` для всех экземпляров, кроме тех, которые представляют второй (хронологически) момент времени в неоднозначном случае.300301> **См. также**302>303> **[**PEP 495**](https://python-all.ru/3/whatsnew/3.6.html) – Устранение неоднозначности местного времени**304>305> PEP написан Александром Белопольским и Тимом Питерсом, реализация – Александром Белопольским.306307### PEP 529: Изменение кодировки файловой системы Windows на UTF-8308309Представление путей файловой системы лучше всего выполнять с помощью str (Unicode), а не bytes. Однако есть ситуации, когда использование bytes достаточно и корректно.310311До Python 3.6 использование путей в виде bytes в Windows могло приводить к потере данных. Благодаря этому изменению использование bytes для представления путей теперь поддерживается в Windows при условии, что эти bytes закодированы с помощью кодировки, возвращаемой [`sys.getfilesystemencoding()`](https://python-all.ru/3/library/sys.html#sys.getfilesystemencoding), которая теперь по умолчанию равна `'utf-8'`.312313Приложения, не использующие str для представления путей, должны использовать [`os.fsencode()`](https://python-all.ru/3/library/os.html#os.fsencode) и [`os.fsdecode()`](https://python-all.ru/3/library/os.html#os.fsdecode), чтобы гарантировать правильную кодировку их bytes. Чтобы вернуть предыдущее поведение, установите [`PYTHONLEGACYWINDOWSFSENCODING`](https://python-all.ru/3/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSFSENCODING) или вызовите [`sys._enablelegacywindowsfsencoding()`](https://python-all.ru/3/library/sys.html#sys._enablelegacywindowsfsencoding).314315См. [**PEP 529**](https://python-all.ru/3/whatsnew/3.6.html) для получения дополнительной информации и обсуждения возможных изменений кода.316317### PEP 528: Изменение кодировки консоли Windows на UTF-8318319Консоль по умолчанию в Windows теперь принимает все символы Unicode и предоставляет корректно прочитанные объекты str для кода Python. `sys.stdin`, `sys.stdout` и `sys.stderr` теперь по умолчанию используют кодировку utf-8.320321Это изменение применяется только при использовании интерактивной консоли, а не при перенаправлении файлов или каналов. Чтобы вернуть предыдущее поведение для интерактивной консоли, установите [`PYTHONLEGACYWINDOWSSTDIO`](https://python-all.ru/3/using/cmdline.html#envvar-PYTHONLEGACYWINDOWSSTDIO).322323> **См. также**324>325> **[**PEP 528**](https://python-all.ru/3/whatsnew/3.6.html) – Изменение кодировки консоли Windows на UTF-8**326>327> PEP написан и реализован Стивом Дауэром.328329### PEP 520: Сохранение порядка определения атрибутов класса330331Атрибуты в теле определения класса имеют естественный порядок: тот же порядок, в котором имена появляются в исходном коде. Этот порядок теперь сохраняется в атрибуте [`__dict__`](https://python-all.ru/3/reference/datamodel.html#type.__dict__) нового класса.332333Кроме того, действующее пространство имён *execution* класса по умолчанию (возвращаемое из [type.\_\_prepare\_\_()](https://python-all.ru/3/reference/datamodel.html#prepare)) теперь является отображением, сохраняющим порядок вставки.334335> **См. также**336>337> **[**PEP 520**](https://python-all.ru/3/whatsnew/3.6.html) – Сохранение порядка определения атрибутов класса**338>339> PEP написан и реализован Эриком Сноу.340341### PEP 468: Сохранение порядка именованных аргументов342343`**kwargs` в сигнатуре функции теперь гарантированно является отображением, сохраняющим порядок вставки.344345> **См. также**346>347> **[**PEP 468**](https://python-all.ru/3/whatsnew/3.6.html) – Сохранение порядка именованных аргументов**348>349> PEP написан и реализован Эриком Сноу.350351### Новая [dict](https://python-all.ru/3/library/stdtypes.html#typesmapping) реализация352353Тип [dict](https://python-all.ru/3/library/stdtypes.html#typesmapping) теперь использует «компактное» представление, основанное на [предложении Рэймонда Хеттингера](https://python-all.ru/3/whatsnew/3.6.html), которое было [впервые реализовано в PyPy](https://python-all.ru/3/whatsnew/3.6.html). Потребление памяти нового [`dict()`](https://python-all.ru/3/library/stdtypes.html#dict) на 20–25% меньше по сравнению с Python 3.5.354355Аспект сохранения порядка в этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно, чтобы эта новая реализация dict побыла в языке несколько релизов, прежде чем менять спецификацию языка, чтобы требовать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где всё ещё действует случайный порядок итерации, например, Python 3.5).356357(Автор: INADA Naoki в [bpo-27350](https://python-all.ru/3/whatsnew/3.6.html). Идея [изначально предложена Рэймондом Хеттингером](https://python-all.ru/3/whatsnew/3.6.html).)358359### PEP 523: Добавление API для оценки фреймов в CPython360361Хотя Python предоставляет широкие возможности для настройки выполнения кода, одним из мест, где этого не было, является оценка объектов фреймов. Если требовался способ перехвата оценки фреймов в Python, то без прямого манипулирования указателями на функции для определённых функций его не было.362363[**PEP 523**](https://python-all.ru/3/whatsnew/3.6.html) меняет это, предоставляя API для подключения оценки фреймов на уровне C. Это позволит таким инструментам, как отладчики и JIT-компиляторы, перехватывать оценку фреймов до начала выполнения кода Python. Это даёт возможность использовать альтернативные реализации оценки для кода Python, отслеживание оценки фреймов и т.д.364365Это API не является частью ограниченного C API и помечено как приватное, чтобы указать, что его использование предполагается ограниченным и применимым только к очень специфическим низкоуровневым сценариям. Семантика API будет меняться по мере необходимости вместе с Python.366367> **См. также**368>369> **[**PEP 523**](https://python-all.ru/3/whatsnew/3.6.html) – Добавление API оценки фреймов в CPython**370>371> PEP написан Бреттом Кэнноном и Дино Вилендом.372373### Переменная окружения PYTHONMALLOC374375Новая переменная окружения [`PYTHONMALLOC`](https://python-all.ru/3/using/cmdline.html#envvar-PYTHONMALLOC) позволяет настраивать распределители памяти Python и устанавливать отладочные перехватчики.376377Теперь можно устанавливать отладочные перехватчики на распределители памяти Python в Python, скомпилированном в режиме выпуска, с помощью `PYTHONMALLOC=debug`. Эффекты отладочных перехватчиков:378379- Вновь выделенная память заполняется байтом `0xCB`380- Освобождённая память заполняется байтом `0xDB`381- Обнаружение нарушений API распределителя памяти Python. Например, [`PyObject_Free()`](https://python-all.ru/3/c-api/memory.html#c.PyObject_Free) вызывается для блока памяти, выделенного через [`PyMem_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_Malloc).382- Обнаружение записи до начала буфера (недополнение буфера)383- Обнаружение записи после конца буфера (переполнение буфера)384- Проверка, удерживается ли [GIL](https://python-all.ru/3/glossary.html#term-global-interpreter-lock) при вызове функций распределителя доменов [`PYMEM_DOMAIN_OBJ`](https://python-all.ru/3/c-api/memory.html#c.PYMEM_DOMAIN_OBJ) (например, [`PyObject_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyObject_Malloc)) и [`PYMEM_DOMAIN_MEM`](https://python-all.ru/3/c-api/memory.html#c.PYMEM_DOMAIN_MEM) (например, [`PyMem_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_Malloc)).385386Проверка удержания GIL – также новая возможность Python 3.6.387388Смотрите функцию [`PyMem_SetupDebugHooks()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_SetupDebugHooks) для отладочных перехватчиков на распределителях памяти Python.389390Теперь также можно принудительно использовать распределитель `malloc()` библиотеки C для всех выделений памяти Python с помощью `PYTHONMALLOC=malloc`. Это полезно при использовании внешних отладчиков памяти, таких как Valgrind, для Python, скомпилированного в режиме выпуска.391392При ошибке отладочные перехватчики на распределителях памяти Python теперь используют модуль [`tracemalloc`](https://python-all.ru/3/library/tracemalloc.html#module-tracemalloc) для получения трассировки стека, где был выделен блок памяти.393394Пример фатальной ошибки при переполнении буфера с использованием `python3.6 -X tracemalloc=5` (сохранять 5 фреймов в трассировках):395396```python397Debug memory block at address p=0x7fbcd41666f8: API 'o'398 4 bytes originally requested399 The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.400 The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):401 at tail+0: 0x02 *** OUCH402 at tail+1: 0xfb403 at tail+2: 0xfb404 at tail+3: 0xfb405 at tail+4: 0xfb406 at tail+5: 0xfb407 at tail+6: 0xfb408 at tail+7: 0xfb409 The block was made by call #1233329 для отладки malloc/realloc.410 Data at p: 1a 2b 30 00411412Memory block allocated at (most recent call first):413 File "test/test_bytes.py", line 323414 File "unittest/case.py", line 600415 File "unittest/case.py", line 648416 File "unittest/suite.py", line 122417 File "unittest/suite.py", line 84418419Fatal Python error: bad trailing pad byte420421Current thread 0x00007fbcdbd32700 (most recent call first):422 File "test/test_bytes.py", line 323 in test_hex423 File "unittest/case.py", line 600 in run424 File "unittest/case.py", line 648 in __call__425 File "unittest/suite.py", line 122 in run426 File "unittest/suite.py", line 84 in __call__427 File "unittest/suite.py", line 122 in run428 File "unittest/suite.py", line 84 in __call__429 ...430```431432(Автор: Victor Stinner в [bpo-26516](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-26564](https://python-all.ru/3/whatsnew/3.6.html).)433434### Поддержка зондов DTrace и SystemTap435436Python теперь может быть собран с `--with-dtrace`, что включает статические маркеры для следующих событий в интерпретаторе:437438- вызов/возврат функции439- начало/завершение сборки мусора440- выполнение строки кода.441442Это можно использовать для инструментирования работающих интерпретаторов в производственной среде без необходимости перекомпиляции [отладочных сборок](https://python-all.ru/3/using/configure.html#debug-build) или написания прикладного кода профилирования/отладки.443444Подробнее в [Инструментирование CPython с помощью DTrace и SystemTap](https://python-all.ru/3/howto/instrumentation.html#instrumentation).445446Текущая реализация протестирована на Linux и macOS. В будущем могут быть добавлены дополнительные маркеры.447448(Автор: Łukasz Langa в [bpo-21590](https://python-all.ru/3/whatsnew/3.6.html), на основе патчей Jesús Cea Avión, David Malcolm и Nikhil Benesch.)449450## Другие изменения языка451452Некоторые более мелкие изменения в ядре языка Python:453454- Оператор `global` или `nonlocal` теперь должен текстуально располагаться до первого использования затрагиваемого имени в той же области видимости. Ранее это было [`SyntaxWarning`](https://python-all.ru/3/library/exceptions.html#SyntaxWarning).455- Теперь можно задать [специальный метод](https://python-all.ru/3/reference/datamodel.html#specialnames) как `None`, чтобы указать, что соответствующая операция недоступна. Например, если в классе установить [`__iter__()`](https://python-all.ru/3/reference/datamodel.html#object.__iter__) в `None`, класс не будет итерируемым. (Авторы: Andrew Barnert и Ivan Levkivskyi в [bpo-25958](https://python-all.ru/3/whatsnew/3.6.html).)456- Длинные последовательности повторяющихся строк трассировки теперь сокращаются как `"[Previous line repeated {count} more times]"` (пример см. в [traceback](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-traceback)). (Автор: Emanuel Barry в [bpo-26823](https://python-all.ru/3/whatsnew/3.6.html).)457- Теперь при импорте, если модуль не найден, вызывается новое исключение [`ModuleNotFoundError`](https://python-all.ru/3/library/exceptions.html#ModuleNotFoundError) (подкласс [`ImportError`](https://python-all.ru/3/library/exceptions.html#ImportError)). Код, который сейчас проверяет ImportError (в try-except), по-прежнему будет работать. (Автор: Eric Snow в [bpo-15767](https://python-all.ru/3/whatsnew/3.6.html).)458- Методы класса, которые полагаются на вызов `super()` без аргументов, теперь будут работать корректно при вызове из методов метакласса во время создания класса. (Автор: Martin Teichmann в [bpo-23722](https://python-all.ru/3/whatsnew/3.6.html).)459460## Новые модули461462### secrets463464Основная цель нового модуля [`secrets`](https://python-all.ru/3/library/secrets.html#module-secrets) – предоставить очевидный способ надёжной генерации криптостойких псевдослучайных значений, подходящих для управления секретами, такими как аутентификация учётных записей, токены и т.п.465466> **Предупреждение**467>468> Обратите внимание, что псевдослучайные генераторы в модуле [`random`](https://python-all.ru/3/library/random.html#module-random) *НЕ* должны использоваться для целей безопасности. Используйте [`secrets`](https://python-all.ru/3/library/secrets.html#module-secrets) на Python 3.6+ и [`os.urandom()`](https://python-all.ru/3/library/os.html#os.urandom) на Python 3.5 и более ранних версиях.469470> **См. также**471>472> **[**PEP 506**](https://python-all.ru/3/whatsnew/3.6.html) – Добавление модуля Secrets в стандартную библиотеку**473>474> PEP написан и реализован Steven D’Aprano.475476## Улучшенные модули477478### array479480Исчерпанные итераторы [`array.array`](https://python-all.ru/3/library/array.html#array.array) теперь остаются исчерпанными, даже если итерируемый массив расширен. Это соответствует поведению других изменяемых последовательностей.481482Автор: Serhiy Storchaka в [bpo-26492](https://python-all.ru/3/whatsnew/3.6.html).483484### ast485486Добавлен новый узел AST [`ast.Constant`](https://python-all.ru/3/library/ast.html#ast.Constant). Он может использоваться внешними оптимизаторами AST для целей свёртывания констант.487488Автор: Victor Stinner в [bpo-26146](https://python-all.ru/3/whatsnew/3.6.html).489490### asyncio491492Начиная с Python 3.6, модуль `asyncio` больше не является временным, и его API считается стабильным.493494Заметные изменения в модуле [`asyncio`](https://python-all.ru/3/library/asyncio.html#module-asyncio), начиная с Python 3.5.0 (все перенесены в 3.5.x из-за временного статуса):495496- Функция [`get_event_loop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.get_event_loop) изменена так, чтобы всегда возвращать текущий выполняющийся цикл событий при вызове из корутин и колбэков. (Автор: Yury Selivanov в [bpo-28613](https://python-all.ru/3/whatsnew/3.6.html).)497- Функция [`ensure_future()`](https://python-all.ru/3/library/asyncio-future.html#asyncio.ensure_future) и все функции, которые её используют, такие как [`loop.run_until_complete()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.run_until_complete), теперь принимают все виды [ожидаемых объектов](https://python-all.ru/3/glossary.html#term-awaitable). (Автор: Yury Selivanov.)498- Новая функция [`run_coroutine_threadsafe()`](https://python-all.ru/3/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) для отправки корутин в циклы событий из других потоков. (Автор: Vincent Michel.)499- Новый метод [`Transport.is_closing()`](https://python-all.ru/3/library/asyncio-protocol.html#asyncio.BaseTransport.is_closing) для проверки, закрывается ли транспорт или уже закрыт. (Автор: Yury Selivanov.)500- Метод [`loop.create_server()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_server) теперь может принимать список хостов. (Автор: Yann Sionneau.)501- Новый метод [`loop.create_future()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_future) для создания объектов Future. Это позволяет альтернативным реализациям цикла событий, таким как [uvloop](https://python-all.ru/3/whatsnew/3.6.html), предоставлять более быструю реализацию [`asyncio.Future`](https://python-all.ru/3/library/asyncio-future.html#asyncio.Future). (Автор: Yury Selivanov в [bpo-27041](https://python-all.ru/3/whatsnew/3.6.html).)502- Новый метод [`loop.get_exception_handler()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.get_exception_handler) для получения текущего обработчика исключений. (Автор: Yury Selivanov в [bpo-27040](https://python-all.ru/3/whatsnew/3.6.html).)503- Новый метод [`StreamReader.readuntil()`](https://python-all.ru/3/library/asyncio-stream.html#asyncio.StreamReader.readuntil) для чтения данных из потока до появления последовательности байтов-разделителей. (Автор: Mark Korenberg.)504- Производительность [`StreamReader.readexactly()`](https://python-all.ru/3/library/asyncio-stream.html#asyncio.StreamReader.readexactly) улучшена. (Автор: Mark Korenberg в [bpo-28370](https://python-all.ru/3/whatsnew/3.6.html).)505- Метод [`loop.getaddrinfo()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.getaddrinfo) оптимизирован, чтобы избегать вызова системной функции `getaddrinfo`, если адрес уже разрешён. (Автор: A. Jesse Jiryu Davis.)506- Метод [`loop.stop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.stop) изменён: теперь он останавливает цикл сразу после текущей итерации. Любые новые колбэки, запланированные в результате последней итерации, будут отброшены. (Автор: Guido van Rossum в [bpo-25593](https://python-all.ru/3/whatsnew/3.6.html).)507- [`Future.set_exception`](https://python-all.ru/3/library/asyncio-future.html#asyncio.Future.set_exception) теперь будет вызывать [`TypeError`](https://python-all.ru/3/library/exceptions.html#TypeError), если ему передать экземпляр исключения [`StopIteration`](https://python-all.ru/3/library/exceptions.html#StopIteration). (Автор: Chris Angelico в [bpo-26221](https://python-all.ru/3/whatsnew/3.6.html).)508- Новый метод [`loop.connect_accepted_socket()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.connect_accepted_socket) предназначен для серверов, которые принимают соединения вне asyncio, но используют asyncio для их обработки. (Предложено Джимом Фултоном в [bpo-27392](https://python-all.ru/3/whatsnew/3.6.html).)509- Флаг `TCP_NODELAY` теперь по умолчанию устанавливается для всех TCP-транспортов. (Предложено Юрием Селивановым в [bpo-27456](https://python-all.ru/3/whatsnew/3.6.html).)510- Новый [`loop.shutdown_asyncgens()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.shutdown_asyncgens) для корректного закрытия ожидающих асинхронных генераторов перед закрытием цикла. (Предложено Юрием Селивановым в [bpo-28003](https://python-all.ru/3/whatsnew/3.6.html).)511- Классы [`Future`](https://python-all.ru/3/library/asyncio-future.html#asyncio.Future) и [`Task`](https://python-all.ru/3/library/asyncio-task.html#asyncio.Task) теперь имеют оптимизированную реализацию на C, что ускоряет код asyncio до 30%. (Предложено Юрием Селивановым и Инадой Наоки в [bpo-26081](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-28544](https://python-all.ru/3/whatsnew/3.6.html).)512513### binascii514515Функция [`b2a_base64()`](https://python-all.ru/3/library/binascii.html#binascii.b2a_base64) теперь принимает необязательный именованный аргумент *newline*, управляющий добавлением символа новой строки к возвращаемому значению. (Предложено Виктором Стиннером в [bpo-25357](https://python-all.ru/3/whatsnew/3.6.html).)516517### cmath518519Добавлена новая константа [`cmath.tau`](https://python-all.ru/3/library/cmath.html#cmath.tau) (*τ*). (Предложено Лизой Роуч в [bpo-12345](https://python-all.ru/3/whatsnew/3.6.html); подробнее см. [**PEP 628**](https://python-all.ru/3/whatsnew/3.6.html).)520521Новые константы: [`cmath.inf`](https://python-all.ru/3/library/cmath.html#cmath.inf) и [`cmath.nan`](https://python-all.ru/3/library/cmath.html#cmath.nan), соответствующие [`math.inf`](https://python-all.ru/3/library/math.html#math.inf) и [`math.nan`](https://python-all.ru/3/library/math.html#math.nan), а также [`cmath.infj`](https://python-all.ru/3/library/cmath.html#cmath.infj) и [`cmath.nanj`](https://python-all.ru/3/library/cmath.html#cmath.nanj), соответствующие формату представления complex. (Предложено Марком Дикинсоном в [bpo-23229](https://python-all.ru/3/whatsnew/3.6.html).)522523### collections524525Добавлен новый абстрактный базовый класс [`Collection`](https://python-all.ru/3/library/collections.abc.html#collections.abc.Collection) для представления размерных итерируемых классов-контейнеров. (Предложено Иваном Левкивским, документация – Нил Гирдхар в [bpo-27598](https://python-all.ru/3/whatsnew/3.6.html).)526527Новый абстрактный базовый класс [`Reversible`](https://python-all.ru/3/library/collections.abc.html#collections.abc.Reversible) представляет итерируемые классы, которые также предоставляют метод [`__reversed__()`](https://python-all.ru/3/reference/datamodel.html#object.__reversed__). (Предложено Иваном Левкивским в [bpo-25987](https://python-all.ru/3/whatsnew/3.6.html).)528529Новый абстрактный базовый класс [`AsyncGenerator`](https://python-all.ru/3/library/collections.abc.html#collections.abc.AsyncGenerator) представляет асинхронные генераторы. (Предложено Юрием Селивановым в [bpo-28720](https://python-all.ru/3/whatsnew/3.6.html).)530531Функция [`namedtuple()`](https://python-all.ru/3/library/collections.html#collections.namedtuple) теперь принимает необязательный именованный аргумент *module*, который при указании используется для атрибута [`__module__`](https://python-all.ru/3/reference/datamodel.html#type.__module__) возвращаемого класса именованного кортежа. (Предложено Рэймондом Хеттингером в [bpo-17941](https://python-all.ru/3/whatsnew/3.6.html).)532533Аргументы *verbose* и *rename* для [`namedtuple()`](https://python-all.ru/3/library/collections.html#collections.namedtuple) теперь являются только именованными. (Предложено Рэймондом Хеттингером в [bpo-25628](https://python-all.ru/3/whatsnew/3.6.html).)534535Рекурсивные экземпляры [`collections.deque`](https://python-all.ru/3/library/collections.html#collections.deque) теперь можно сериализовать с помощью модуля pickle. (Предложено Сергеем Сторчакой в [bpo-26482](https://python-all.ru/3/whatsnew/3.6.html).)536537### concurrent.futures538539Конструктор класса [`ThreadPoolExecutor`](https://python-all.ru/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) теперь принимает необязательный аргумент *thread\_name\_prefix*, позволяющий настраивать имена потоков, создаваемых пулом. (Предложено Грегори П. Смитом в [bpo-27664](https://python-all.ru/3/whatsnew/3.6.html).)540541### contextlib542543Добавлен класс [`contextlib.AbstractContextManager`](https://python-all.ru/3/library/contextlib.html#contextlib.AbstractContextManager), предоставляющий абстрактный базовый класс для контекстных менеджеров. Он содержит разумную реализацию по умолчанию для `__enter__()`, которая возвращает `self` и оставляет `__exit__()` абстрактным методом. Соответствующий класс добавлен в модуль [`typing`](https://python-all.ru/3/library/typing.html#module-typing) как [`typing.ContextManager`](https://python-all.ru/3/library/typing.html#typing.ContextManager). (Предложено Бреттом Кэнноном в [bpo-25609](https://python-all.ru/3/whatsnew/3.6.html).)544545### datetime546547Классы [`datetime`](https://python-all.ru/3/library/datetime.html#datetime.datetime) и [`time`](https://python-all.ru/3/library/datetime.html#datetime.time) получили новый атрибут [`fold`](https://python-all.ru/3/library/datetime.html#datetime.time.fold), используемый для устранения неоднозначности местного времени при необходимости. Многие функции в [`datetime`](https://python-all.ru/3/library/datetime.html#module-datetime) были обновлены для поддержки разрешения неоднозначности местного времени. Подробнее см. раздел [Local Time Disambiguation](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep495). (Предложено Александром Белопольским в [bpo-24773](https://python-all.ru/3/whatsnew/3.6.html).)548549Методы [`datetime.strftime()`](https://python-all.ru/3/library/datetime.html#datetime.datetime.strftime) и [`date.strftime()`](https://python-all.ru/3/library/datetime.html#datetime.date.strftime) теперь поддерживают директивы даты ISO 8601 `%G`, `%u` и `%V`. (Предложено Эшли Андерсоном в [bpo-12006](https://python-all.ru/3/whatsnew/3.6.html).)550551Функция [`datetime.isoformat()`](https://python-all.ru/3/library/datetime.html#datetime.datetime.isoformat) теперь принимает необязательный аргумент *timespec*, указывающий количество дополнительных компонентов значения времени для включения. (Предложено Алессандро Куччи и Александром Белопольским в [bpo-19475](https://python-all.ru/3/whatsnew/3.6.html).)552553[`datetime.combine()`](https://python-all.ru/3/library/datetime.html#datetime.datetime.combine) теперь принимает необязательный аргумент *tzinfo*. (Предложено Александром Белопольским в [bpo-27661](https://python-all.ru/3/whatsnew/3.6.html).)554555### decimal556557Новый метод [`Decimal.as_integer_ratio()`](https://python-all.ru/3/library/decimal.html#decimal.Decimal.as_integer_ratio), возвращающий пару `(n, d)` целых чисел, представляющих заданный экземпляр [`Decimal`](https://python-all.ru/3/library/decimal.html#decimal.Decimal) в виде дроби, сокращенной до несократимых членов и с положительным знаменателем:558559```python560>>> Decimal('-3.14').as_integer_ratio()561(-157, 50)562```563564(Предложено Стефаном Кра и Марком Дикинсоном в [bpo-25928](https://python-all.ru/3/whatsnew/3.6.html).)565566### distutils567568Атрибут `default_format` удалён из `distutils.command.sdist.sdist`, а атрибут `formats` по умолчанию равен `['gztar']`. Хотя это не ожидалось, любой код, полагающийся на наличие `default_format`, возможно, потребуется адаптировать. Подробнее см. [bpo-27819](https://python-all.ru/3/whatsnew/3.6.html).569570### email571572Новый почтовый API, включаемый с помощью ключевого слова *policy* в различных конструкторах, больше не является предварительным. Документация [`email`](https://python-all.ru/3/library/email.html#module-email) была реорганизована и переписана с упором на новый API, при этом сохранена старая документация для устаревшего API. (Предложено Р. Дэвидом Мюрреем в [bpo-24277](https://python-all.ru/3/whatsnew/3.6.html).)573574Все классы [`email.mime`](https://python-all.ru/3/library/email.mime.html#module-email.mime) теперь принимают необязательный параметр *policy*. (Автор: Berker Peksag в [bpo-27331](https://python-all.ru/3/whatsnew/3.6.html).)575576Теперь [`DecodedGenerator`](https://python-all.ru/3/library/email.generator.html#email.generator.DecodedGenerator) поддерживает ключевой аргумент *policy*.577578Появился новый атрибут [`policy`](https://python-all.ru/3/library/email.policy.html#module-email.policy), [`message_factory`](https://python-all.ru/3/library/email.policy.html#email.policy.Policy.message_factory), который определяет, какой класс используется по умолчанию, когда парсер создаёт новые объекты сообщений. Для политики [`email.policy.compat32`](https://python-all.ru/3/library/email.policy.html#email.policy.compat32) это [`Message`](https://python-all.ru/3/library/email.compat32-message.html#email.message.Message), для новых политик – [`EmailMessage`](https://python-all.ru/3/library/email.message.html#email.message.EmailMessage). (Автор: R. David Murray в [bpo-20476](https://python-all.ru/3/whatsnew/3.6.html).)579580### encodings581582В Windows добавлена кодировка `'oem'`, использующая `CP_OEMCP`, а также псевдоним `'ansi'` для существующей кодировки `'mbcs'`, которая использует кодовую страницу `CP_ACP`. (Автор: Steve Dower в [bpo-27959](https://python-all.ru/3/whatsnew/3.6.html).)583584### enum585586В модуль [`enum`](https://python-all.ru/3/library/enum.html#module-enum) добавлены два новых базовых класса перечислений: [`Flag`](https://python-all.ru/3/library/enum.html#enum.Flag) и [`IntFlag`](https://python-all.ru/3/library/enum.html#enum.IntFlag). Оба используются для определения констант, которые можно комбинировать с помощью побитовых операторов. (Автор: Ethan Furman в [bpo-23591](https://python-all.ru/3/whatsnew/3.6.html).)587588Многие модули стандартной библиотеки были обновлены: теперь они используют класс [`IntFlag`](https://python-all.ru/3/library/enum.html#enum.IntFlag) для своих констант.589590Новое значение [`enum.auto`](https://python-all.ru/3/library/enum.html#enum.auto) можно использовать для автоматического присвоения значений элементам перечисления:591592```python593>>> from enum import Enum, auto594>>> class Color(Enum):595... red = auto()596... blue = auto()597... green = auto()598...599>>> list(Color)600[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]601```602603### faulthandler604605В Windows модуль [`faulthandler`](https://python-all.ru/3/library/faulthandler.html#module-faulthandler) теперь устанавливает обработчик для исключений Windows: см. [`faulthandler.enable()`](https://python-all.ru/3/library/faulthandler.html#faulthandler.enable). (Автор: Victor Stinner в [bpo-23848](https://python-all.ru/3/whatsnew/3.6.html).)606607### fileinput608609[`hook_encoded()`](https://python-all.ru/3/library/fileinput.html#fileinput.hook_encoded) теперь поддерживает аргумент *errors*. (Автор: Joseph Hackman в [bpo-25788](https://python-all.ru/3/whatsnew/3.6.html).)610611### hashlib612613[`hashlib`](https://python-all.ru/3/library/hashlib.html#module-hashlib) поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2. (Автор: Christian Heimes в [bpo-26470](https://python-all.ru/3/whatsnew/3.6.html).)614615В модуль добавлены хеш-функции BLAKE2. [`blake2b()`](https://python-all.ru/3/library/hashlib.html#hashlib.blake2b) и [`blake2s()`](https://python-all.ru/3/library/hashlib.html#hashlib.blake2s) всегда доступны и поддерживают полный набор возможностей BLAKE2. (Автор: Christian Heimes в [bpo-26798](https://python-all.ru/3/whatsnew/3.6.html) на основе кода Dmitry Chestnykh и Samuel Neves. Документация написана Dmitry Chestnykh.)616617Добавлены хеш-функции SHA-3 [`sha3_224()`](https://python-all.ru/3/library/hashlib.html#hashlib.sha3_224), [`sha3_256()`](https://python-all.ru/3/library/hashlib.html#hashlib.sha3_256), [`sha3_384()`](https://python-all.ru/3/library/hashlib.html#hashlib.sha3_384), [`sha3_512()`](https://python-all.ru/3/library/hashlib.html#hashlib.sha3_512) и хеш-функции SHAKE [`shake_128()`](https://python-all.ru/3/library/hashlib.html#hashlib.shake_128) и [`shake_256()`](https://python-all.ru/3/library/hashlib.html#hashlib.shake_256). (Автор: Christian Heimes в [bpo-16113](https://python-all.ru/3/whatsnew/3.6.html). Пакет кода Keccak от Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche и Ronny Van Keer.)618619Функция получения ключа на основе пароля [`scrypt()`](https://python-all.ru/3/library/hashlib.html#hashlib.scrypt) теперь доступна в OpenSSL 1.1.0 и новее. (Автор: Christian Heimes в [bpo-27928](https://python-all.ru/3/whatsnew/3.6.html).)620621### http.client622623[`HTTPConnection.request()`](https://python-all.ru/3/library/http.client.html#http.client.HTTPConnection.request) и [`endheaders()`](https://python-all.ru/3/library/http.client.html#http.client.HTTPConnection.endheaders) теперь оба поддерживают кодирование передаваемых частями (chunked encoding) тел запросов. (Авторы: Demian Brecht и Rolf Krahl в [bpo-12319](https://python-all.ru/3/whatsnew/3.6.html).)624625### idlelib and IDLE626627Пакет idlelib модернизируется и рефакторится, чтобы улучшить внешний вид и работу IDLE, а также сделать код более понятным, тестируемым и улучшаемым. Часть улучшений внешнего вида, особенно на Linux и Mac, заключается в использовании виджетов ttk, в основном в диалоговых окнах. В результате IDLE больше не работает с tcl/tk 8.4. Теперь требуется tcl/tk 8.5 или 8.6. Рекомендуется использовать последнюю версию любого из них.628629«Модернизация» включает переименование и консолидацию модулей idlelib. Переименование файлов с частично заглавными именами похоже на переименование, например, Tkinter и TkFont в tkinter и tkinter.font в версии 3.0. В результате импорты файлов idlelib, которые работали в 3.5, обычно не будут работать в 3.6. Как минимум потребуется изменить имя модуля (см. idlelib/README.txt), иногда и больше. (Изменения имён выполнены Al Swiegart и Terry Reedy в [bpo-24225](https://python-all.ru/3/whatsnew/3.6.html). Большинство последующих и будущих патчей idlelib являются частью этого процесса.)630631В качестве компенсации, конечным результатом станет то, что некоторые классы idlelib будут проще в использовании, с лучшими API и поясняющими их docstrings. Дополнительная полезная информация будет добавлена в idlelib, когда станет доступна.632633Новое в версии 3.6.2:634635Множественные исправления для автозавершения. (Автор: Louie Lu в [bpo-15786](https://python-all.ru/3/whatsnew/3.6.html).)636637Новое в версии 3.6.3:638639Обозреватель модулей (в меню File, ранее назывался Class Browser) теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Авторы: Guilherme Polo, Cheryl Sabella и Terry Jan Reedy в [bpo-1612262](https://python-all.ru/3/whatsnew/3.6.html).)640641Функции IDLE, ранее реализованные как расширения, были переработаны как обычные функции. Их настройки перенесены с вкладки Extensions на другие вкладки диалоговых окон. (Авторы: Charles Wohlganger и Terry Jan Reedy в [bpo-27099](https://python-all.ru/3/whatsnew/3.6.html).)642643Диалог настроек (Options, Configure IDLE) был частично переписан для улучшения как внешнего вида, так и функциональности. (Авторы: Cheryl Sabella и Terry Jan Reedy в нескольких задачах.)644645Новое в версии 3.6.4:646647Образец шрифта теперь включает набор нелатинских символов, чтобы пользователи могли лучше видеть эффект выбора конкретного шрифта. (Автор: Terry Jan Reedy в [bpo-13802](https://python-all.ru/3/whatsnew/3.6.html).) Образец можно редактировать, чтобы включить другие символы. (Автор: Serhiy Storchaka в [bpo-31860](https://python-all.ru/3/whatsnew/3.6.html).)648649Новое в версии 3.6.6:650651Параметр контекста кода редактора переработан. Окно отображает все строки контекста вплоть до maxlines. Щелчок по строке контекста перемещает редактор к этой строке. Цвета контекста для настраиваемых тем добавлены на вкладку «Подсветка» окна настроек. (Авторы: Cheryl Sabella и Terry Jan Reedy в [bpo-33642](https://python-all.ru/3/whatsnew/3.6.html), [bpo-33768](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-33679](https://python-all.ru/3/whatsnew/3.6.html).)652653В Windows новый вызов API сообщает Windows, что tk масштабируется под DPI. В Windows 8.1+ или 10, если свойства совместимости DPI двоичного файла Python не изменены и разрешение монитора больше 96 DPI, это должно сделать текст и линии более чёткими. В остальных случаях на работу не влияет. (Автор: Terry Jan Reedy в [bpo-33656](https://python-all.ru/3/whatsnew/3.6.html).)654655Новое в версии 3.6.7:656657Вывод длиннее N строк (по умолчанию 50) сжимается до одной кнопки. N можно изменить в разделе PyShell на вкладке «Общие» окна настроек. Меньшее количество строк, но возможно очень длинных, можно сжать, щёлкнув по выводу правой кнопкой мыши. Сжатый вывод можно развернуть на месте двойным щелчком по кнопке или отправить в буфер обмена или отдельное окно щелчком правой кнопкой. (Автор: Tal Einat в [bpo-1529353](https://python-all.ru/3/whatsnew/3.6.html).)658659### importlib660661Импорт теперь вызывает новое исключение [`ModuleNotFoundError`](https://python-all.ru/3/library/exceptions.html#ModuleNotFoundError) (подкласс [`ImportError`](https://python-all.ru/3/library/exceptions.html#ImportError)), когда не может найти модуль. Код, который сейчас проверяет `ImportError` (в try-except), продолжит работать. (Автор: Eric Snow в [bpo-15767](https://python-all.ru/3/whatsnew/3.6.html).)662663[`importlib.util.LazyLoader`](https://python-all.ru/3/library/importlib.html#importlib.util.LazyLoader) теперь вызывает [`create_module()`](https://python-all.ru/3/library/importlib.html#importlib.abc.Loader.create_module) для обёрнутого загрузчика, снимая ограничение, что [`importlib.machinery.BuiltinImporter`](https://python-all.ru/3/library/importlib.html#importlib.machinery.BuiltinImporter) и [`importlib.machinery.ExtensionFileLoader`](https://python-all.ru/3/library/importlib.html#importlib.machinery.ExtensionFileLoader) нельзя было использовать с `importlib.util.LazyLoader`.664665[`importlib.util.cache_from_source()`](https://python-all.ru/3/library/importlib.html#importlib.util.cache_from_source), [`importlib.util.source_from_cache()`](https://python-all.ru/3/library/importlib.html#importlib.util.source_from_cache) и [`importlib.util.spec_from_file_location()`](https://python-all.ru/3/library/importlib.html#importlib.util.spec_from_file_location) теперь принимают [объект, подобный пути](https://python-all.ru/3/glossary.html#term-path-like-object).666667### inspect668669Функция [`inspect.signature()`](https://python-all.ru/3/library/inspect.html#inspect.signature) теперь сообщает о неявных параметрах `.0`, которые компилятор создаёт для областей видимости включений и выражений генераторов, так, как если бы это были позиционные параметры с именем `implicit0`. (Автор: Jelle Zijlstra в [bpo-19611](https://python-all.ru/3/whatsnew/3.6.html).)670671Чтобы уменьшить объём изменений в коде при обновлении с Python 2.7 и устаревшего API `inspect.getargspec()`, ранее задокументированное объявление устаревшим [`inspect.getfullargspec()`](https://python-all.ru/3/library/inspect.html#inspect.getfullargspec) было отменено. Хотя эта функция удобна для единой кодовой базы Python 2/3, более богатый интерфейс [`inspect.signature()`](https://python-all.ru/3/library/inspect.html#inspect.signature) остаётся рекомендуемым подходом для нового кода. (Автор: Nick Coghlan в [bpo-27172](https://python-all.ru/3/whatsnew/3.6.html))672673### json674675[`json.load()`](https://python-all.ru/3/library/json.html#json.load) и [`json.loads()`](https://python-all.ru/3/library/json.html#json.loads) теперь поддерживают двоичный ввод. Закодированный JSON должен быть представлен в UTF-8, UTF-16 или UTF-32. (Автор: Serhiy Storchaka в [bpo-17909](https://python-all.ru/3/whatsnew/3.6.html).)676677### logging678679Добавлен новый метод [`WatchedFileHandler.reopenIfNeeded()`](https://python-all.ru/3/library/logging.handlers.html#logging.handlers.WatchedFileHandler.reopenIfNeeded), предоставляющий возможность проверить, нужно ли переоткрыть файл журнала. (Автор: Marian Horban в [bpo-24884](https://python-all.ru/3/whatsnew/3.6.html).)680681### math682683Константа тау (*τ*) добавлена в модули [`math`](https://python-all.ru/3/library/math.html#module-math) и [`cmath`](https://python-all.ru/3/library/cmath.html#module-cmath). (Автор: Lisa Roach в [bpo-12345](https://python-all.ru/3/whatsnew/3.6.html); подробности см. в [**PEP 628**](https://python-all.ru/3/whatsnew/3.6.html).)684685### multiprocessing686687[Объекты-прокси](https://python-all.ru/3/library/multiprocessing.html#multiprocessing-proxy-objects), возвращаемые [`multiprocessing.Manager()`](https://python-all.ru/3/library/multiprocessing.html#multiprocessing.Manager), теперь могут быть вложенными. (Автор: Davin Potts в [bpo-6766](https://python-all.ru/3/whatsnew/3.6.html).)688689### os690691Подробности о том, как модули [`os`](https://python-all.ru/3/library/os.html#module-os) и [`os.path`](https://python-all.ru/3/library/os.path.html#module-os.path) теперь поддерживают [объекты, подобные пути](https://python-all.ru/3/glossary.html#term-path-like-object), см. в описании [PEP 519](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep519).692693[`scandir()`](https://python-all.ru/3/library/os.html#os.scandir) теперь поддерживает пути [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes) в Windows.694695Новый метод [`close()`](https://python-all.ru/3/library/os.html#os.scandir.close) позволяет явно закрыть итератор [`scandir()`](https://python-all.ru/3/library/os.html#os.scandir). Итератор `scandir()` теперь поддерживает протокол [менеджера контекста](https://python-all.ru/3/glossary.html#term-context-manager). Если итератор `scandir()` не исчерпан и не закрыт явно, в его деструкторе будет сгенерировано предупреждение [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning). (Автор: Serhiy Storchaka в [bpo-25994](https://python-all.ru/3/whatsnew/3.6.html).)696697В Linux [`os.urandom()`](https://python-all.ru/3/library/os.html#os.urandom) теперь блокируется до инициализации системного пула энтропии urandom для повышения безопасности. Обоснование см. в [**PEP 524**](https://python-all.ru/3/whatsnew/3.6.html).698699Системный вызов Linux `getrandom()` (получить случайные байты) теперь доступен как новая функция [`os.getrandom()`](https://python-all.ru/3/library/os.html#os.getrandom). (Автор: Victor Stinner, часть [**PEP 524**](https://python-all.ru/3/whatsnew/3.6.html))700701### pathlib702703[`pathlib`](https://python-all.ru/3/library/pathlib.html#module-pathlib) теперь поддерживает [объекты, подобные пути](https://python-all.ru/3/glossary.html#term-path-like-object). (Автор: Brett Cannon в [bpo-27186](https://python-all.ru/3/whatsnew/3.6.html).)704705Подробности см. в описании [PEP 519](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep519).706707### pdb708709Конструктор класса [`Pdb`](https://python-all.ru/3/library/pdb.html#pdb.Pdb) получил новый необязательный аргумент *readrc* для управления тем, следует ли читать файлы `.pdbrc`.710711### pickle712713Объекты, которым требуется `__new__` с именованными аргументами, теперь можно сериализовать с помощью [протоколов pickle](https://python-all.ru/3/library/pickle.html#pickle-protocols) старше версии 4 протокола. Версия 4 протокола уже поддерживает такой случай. (Вклад Serhiy Storchaka в [bpo-24164](https://python-all.ru/3/whatsnew/3.6.html).)714715### pickletools716717[`pickletools.dis()`](https://python-all.ru/3/library/pickletools.html#pickletools.dis) теперь выводит неявный индекс memo для опкода `MEMOIZE`. (Вклад Serhiy Storchaka в [bpo-25382](https://python-all.ru/3/whatsnew/3.6.html).)718719### pydoc720721Модуль [`pydoc`](https://python-all.ru/3/library/pydoc.html#module-pydoc) научился учитывать переменную окружения `MANPAGER`. (Вклад Matthias Klose в [bpo-8637](https://python-all.ru/3/whatsnew/3.6.html).)722723[`help()`](https://python-all.ru/3/library/functions.html#help) и [`pydoc`](https://python-all.ru/3/library/pydoc.html#module-pydoc) теперь могут выводить поля именованных кортежей в порядке их определения, а не в алфавитном. (Вклад Raymond Hettinger в [bpo-24879](https://python-all.ru/3/whatsnew/3.6.html).)724725### random726727Новая функция [`choices()`](https://python-all.ru/3/library/random.html#random.choices) возвращает список элементов заданного размера из указанной совокупности с возможностью указания весов. (Вклад Raymond Hettinger в [bpo-18844](https://python-all.ru/3/whatsnew/3.6.html).)728729### re730731Добавлена поддержка модификаторов диапазонов в регулярных выражениях. Примеры: `'(?i:p)ython'` соответствует `'python'` и `'Python'`, но не `'PYTHON'`; `'(?i)g(?-i:v)r'` соответствует `'GvR'` и `'gvr'`, но не `'GVR'`. (Вклад Serhiy Storchaka в [bpo-433028](https://python-all.ru/3/whatsnew/3.6.html).)732733К группам объекта сопоставления можно обращаться по `__getitem__`, что эквивалентно `group()`. Теперь `mo['name']` эквивалентно `mo.group('name')`. (Вклад Eric Smith в [bpo-24454](https://python-all.ru/3/whatsnew/3.6.html).)734735Объекты [`Match`](https://python-all.ru/3/library/re.html#re.Match) теперь поддерживают [`index-like objects`](https://python-all.ru/3/reference/datamodel.html#object.__index__) в качестве индексов групп. (Вклад Jeroen Demeyer и Xiang Zhang в [bpo-27177](https://python-all.ru/3/whatsnew/3.6.html).)736737### readline738739Добавлено [`set_auto_history()`](https://python-all.ru/3/library/readline.html#readline.set_auto_history) для включения или отключения автоматического добавления ввода в список истории. (Вклад Tyler Crompton в [bpo-26870](https://python-all.ru/3/whatsnew/3.6.html).)740741### rlcompleter742743Закрытые и специальные имена атрибутов теперь опускаются, если только префикс не начинается с подчёркиваний. Пробел или двоеточие добавляется после некоторых завершённых ключевых слов. (Вклад Serhiy Storchaka в [bpo-25011](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-25209](https://python-all.ru/3/whatsnew/3.6.html).)744745### shlex746747Класс [`shlex`](https://python-all.ru/3/library/shlex.html#shlex.shlex) получил [значительно улучшенную совместимость с оболочкой](https://python-all.ru/3/library/shlex.html#improved-shell-compatibility) благодаря новому аргументу *punctuation\_chars*, который управляет тем, какие символы считаются знаками пунктуации. (Вклад Vinay Sajip в [bpo-1521950](https://python-all.ru/3/whatsnew/3.6.html).)748749### site750751При указании путей для добавления в [`sys.path`](https://python-all.ru/3/library/sys.html#sys.path) в файле `.pth` теперь можно указывать пути к файлам наряду с каталогами (например, zip-файлы). (Вклад Wolfgang Langner в [bpo-26587](https://python-all.ru/3/whatsnew/3.6.html)).752753### sqlite3754755[`sqlite3.Cursor.lastrowid`](https://python-all.ru/3/library/sqlite3.html#sqlite3.Cursor.lastrowid) теперь поддерживает оператор `REPLACE`. (Вклад Alex LordThorsen в [bpo-16864](https://python-all.ru/3/whatsnew/3.6.html).)756757### socket758759Функция [`ioctl()`](https://python-all.ru/3/library/socket.html#socket.socket.ioctl) теперь поддерживает управляющий код [`SIO_LOOPBACK_FAST_PATH`](https://python-all.ru/3/library/socket.html#socket.SIO_LOOPBACK_FAST_PATH). (Вклад Daniel Stokes в [bpo-26536](https://python-all.ru/3/whatsnew/3.6.html).)760761Константы [`getsockopt()`](https://python-all.ru/3/library/socket.html#socket.socket.getsockopt): `SO_DOMAIN`, `SO_PROTOCOL`, `SO_PEERSEC` и `SO_PASSSEC` теперь поддерживаются. (Вклад Christian Heimes в [bpo-26907](https://python-all.ru/3/whatsnew/3.6.html).)762763Функция [`setsockopt()`](https://python-all.ru/3/library/socket.html#socket.socket.setsockopt) теперь поддерживает форму `setsockopt(level, optname, None, optlen: int)`. (Вклад Christian Heimes в [bpo-27744](https://python-all.ru/3/whatsnew/3.6.html).)764765Модуль socket теперь поддерживает семейство адресов [`AF_ALG`](https://python-all.ru/3/library/socket.html#socket.AF_ALG) для взаимодействия с криптографическим API ядра Linux. Были добавлены `ALG_*`, `SOL_ALG` и [`sendmsg_afalg()`](https://python-all.ru/3/library/socket.html#socket.socket.sendmsg_afalg). (Вклад Christian Heimes в [bpo-27744](https://python-all.ru/3/whatsnew/3.6.html) при поддержке Victor Stinner.)766767Добавлены новые константы Linux `TCP_USER_TIMEOUT` и `TCP_CONGESTION`. (Вклад Omar Sandoval, [bpo-26273](https://python-all.ru/3/whatsnew/3.6.html)).768769### socketserver770771Серверы на основе модуля [`socketserver`](https://python-all.ru/3/library/socketserver.html#module-socketserver), включая определённые в [`http.server`](https://python-all.ru/3/library/http.server.html#module-http.server), [`xmlrpc.server`](https://python-all.ru/3/library/xmlrpc.server.html#module-xmlrpc.server) и [`wsgiref.simple_server`](https://python-all.ru/3/library/wsgiref.html#module-wsgiref.simple_server), теперь поддерживают протокол [контекстного менеджера](https://python-all.ru/3/glossary.html#term-context-manager). (Вклад Aviv Palivoda в [bpo-26404](https://python-all.ru/3/whatsnew/3.6.html).)772773Атрибут [`wfile`](https://python-all.ru/3/library/socketserver.html#socketserver.DatagramRequestHandler.wfile) классов [`StreamRequestHandler`](https://python-all.ru/3/library/socketserver.html#socketserver.StreamRequestHandler) теперь реализует интерфейс [`io.BufferedIOBase`](https://python-all.ru/3/library/io.html#io.BufferedIOBase) для записи. В частности, вызов [`write()`](https://python-all.ru/3/library/io.html#io.BufferedIOBase.write) теперь гарантированно отправляет данные полностью. (Вклад Martin Panter в [bpo-26721](https://python-all.ru/3/whatsnew/3.6.html).)774775### ssl776777[`ssl`](https://python-all.ru/3/library/ssl.html#module-ssl) поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2. (Автор: Christian Heimes в [bpo-26470](https://python-all.ru/3/whatsnew/3.6.html).)7787793DES удалён из набора шифров по умолчанию, добавлены наборы шифров ChaCha20 Poly1305. (Автор: Christian Heimes в [bpo-27850](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-27766](https://python-all.ru/3/whatsnew/3.6.html).)780781[`SSLContext`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext) имеет более качественную конфигурацию по умолчанию для опций и шифров. (Автор: Christian Heimes в [bpo-28043](https://python-all.ru/3/whatsnew/3.6.html).)782783SSL-сессию можно скопировать из одного клиентского соединения в другое с помощью нового класса [`SSLSession`](https://python-all.ru/3/library/ssl.html#ssl.SSLSession). Возобновление TLS-сессии может ускорить начальное рукопожатие, уменьшить задержку и повысить производительность. (Автор: Christian Heimes в [bpo-19500](https://python-all.ru/3/whatsnew/3.6.html) на основе черновика Alex Warhawk.)784785Новый метод [`get_ciphers()`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext.get_ciphers) можно использовать для получения списка включённых шифров в порядке их приоритета.786787Все константы и флаги преобразованы в [`IntEnum`](https://python-all.ru/3/library/enum.html#enum.IntEnum) и [`IntFlag`](https://python-all.ru/3/library/enum.html#enum.IntFlag). (Автор: Christian Heimes в [bpo-28025](https://python-all.ru/3/whatsnew/3.6.html).)788789Добавлены серверные и клиентские протоколы TLS для [`SSLContext`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext). (Автор: Christian Heimes в [bpo-28085](https://python-all.ru/3/whatsnew/3.6.html).)790791Добавлены [`ssl.SSLContext.post_handshake_auth`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext.post_handshake_auth) для включения и [`ssl.SSLSocket.verify_client_post_handshake()`](https://python-all.ru/3/library/ssl.html#ssl.SSLSocket.verify_client_post_handshake) для инициирования аутентификации после рукопожатия TLS 1.3. (Автор: Christian Heimes в [gh-78851](https://python-all.ru/3/whatsnew/3.6.html).)792793### statistics794795Добавлена новая функция [`harmonic_mean()`](https://python-all.ru/3/library/statistics.html#statistics.harmonic_mean). (Автор: Steven D'Aprano в [bpo-27181](https://python-all.ru/3/whatsnew/3.6.html).)796797### struct798799[`struct`](https://python-all.ru/3/library/struct.html#module-struct) теперь поддерживает числа с плавающей запятой половинной точности IEEE 754 через спецификатор формата `'e'`. (Авторы: Eli Stevens, Mark Dickinson в [bpo-11734](https://python-all.ru/3/whatsnew/3.6.html).)800801### подпроцесс802803Деструктор [`subprocess.Popen`](https://python-all.ru/3/library/subprocess.html#subprocess.Popen) теперь выдаёт предупреждение [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning), если дочерний процесс всё ещё выполняется. Используйте протокол контекстного менеджера (`with proc: ...`) или явно вызывайте метод [`wait()`](https://python-all.ru/3/library/subprocess.html#subprocess.Popen.wait) для чтения кода завершения дочернего процесса. (Автор: Victor Stinner в [bpo-26741](https://python-all.ru/3/whatsnew/3.6.html).)804805Конструктор [`subprocess.Popen`](https://python-all.ru/3/library/subprocess.html#subprocess.Popen) и все функции, передающие ему аргументы, теперь принимают аргументы *encoding* и *errors*. Указание любого из них включает текстовый режим для потоков *stdin*, *stdout* и *stderr*. (Автор: Steve Dower в [bpo-6135](https://python-all.ru/3/whatsnew/3.6.html).)806807### sys808809Новая функция [`getfilesystemencodeerrors()`](https://python-all.ru/3/library/sys.html#sys.getfilesystemencodeerrors) возвращает имя режима ошибок, используемого для преобразования между именами файлов в Unicode и байтах. (Автор: Steve Dower в [bpo-27781](https://python-all.ru/3/whatsnew/3.6.html).)810811В Windows возвращаемое значение функции [`getwindowsversion()`](https://python-all.ru/3/library/sys.html#sys.getwindowsversion) теперь включает поле *platform\_version*, которое содержит точные номера основной, дополнительной версии и сборки текущей операционной системы, а не версию, эмулируемую для процесса. (Автор: Steve Dower в [bpo-27932](https://python-all.ru/3/whatsnew/3.6.html).)812813### telnetlib814815`telnetlib.Telnet` теперь является контекстным менеджером (автор: Stéphane Wirtel в [bpo-25485](https://python-all.ru/3/whatsnew/3.6.html)).816817### time818819Атрибуты [`struct_time`](https://python-all.ru/3/library/time.html#time.struct_time), `tm_gmtoff` и `tm_zone` теперь доступны на всех платформах.820821### timeit822823Добавлен новый удобный метод [`Timer.autorange()`](https://python-all.ru/3/library/timeit.html#timeit.Timer.autorange) для многократного вызова [`Timer.timeit()`](https://python-all.ru/3/library/timeit.html#timeit.Timer.timeit) таким образом, чтобы общее время выполнения было не меньше 200 миллисекунд. (Автор: Steven D'Aprano в [bpo-6422](https://python-all.ru/3/whatsnew/3.6.html).)824825[`timeit`](https://python-all.ru/3/library/timeit.html#module-timeit) теперь предупреждает, когда есть существенное (в 4 раза) различие между лучшим и худшим временем. (Автор: Serhiy Storchaka в [bpo-23552](https://python-all.ru/3/whatsnew/3.6.html).)826827### tkinter828829Добавлены методы `Variable.trace_add()`, `Variable.trace_remove()` и `trace_info()` в классе `tkinter.Variable`. Они заменяют старые методы `trace_variable()`, `trace()`, `trace_vdelete()` и `trace_vinfo()`, которые используют устаревшие команды Tcl и могут не работать в будущих версиях Tcl. (Автор: Serhiy Storchaka в [bpo-22115](https://python-all.ru/3/whatsnew/3.6.html)).830831### traceback832833Как модуль traceback, так и встроенное отображение исключений интерпретатора теперь сокращают длинные последовательности повторяющихся строк в трассировках, как показано в следующем примере:834835```python836>>> def f(): f()837...838>>> f()839Traceback (most recent call last):840 File "<stdin>", line 1, in <module>841 File "<stdin>", line 1, in f842 File "<stdin>", line 1, in f843 File "<stdin>", line 1, in f844 [Previous line repeated 995 more times]845RecursionError: maximum recursion depth exceeded846```847848(Автор: Emanuel Barry в [bpo-26823](https://python-all.ru/3/whatsnew/3.6.html).)849850### tracemalloc851852Модуль [`tracemalloc`](https://python-all.ru/3/library/tracemalloc.html#module-tracemalloc) теперь поддерживает трассировку выделений памяти в нескольких различных адресных пространствах.853854Добавлен новый класс фильтра [`DomainFilter`](https://python-all.ru/3/library/tracemalloc.html#tracemalloc.DomainFilter) для фильтрации следов блоков по их адресному пространству (домену).855856(Предложено Виктором Штиннером в [bpo-26588](https://python-all.ru/3/whatsnew/3.6.html).)857858### typing859860Поскольку модуль [`typing`](https://python-all.ru/3/library/typing.html#module-typing) является [временным](https://python-all.ru/3/glossary.html#term-provisional-API), все изменения, внесённые в Python 3.6, также были перенесены в Python 3.5.x.861862Модуль [`typing`](https://python-all.ru/3/library/typing.html#module-typing) получил значительно улучшенную поддержку обобщённых псевдонимов типов. Например, `Dict[str, Tuple[S, T]]` теперь является допустимой аннотацией типа. (Предложено Гвидо ван Россумом в [Github #195](https://python-all.ru/3/whatsnew/3.6.html).)863864Добавлен класс [`typing.ContextManager`](https://python-all.ru/3/library/typing.html#typing.ContextManager) для представления [`contextlib.AbstractContextManager`](https://python-all.ru/3/library/contextlib.html#contextlib.AbstractContextManager). (Предложено Бреттом Кэнноном в [bpo-25609](https://python-all.ru/3/whatsnew/3.6.html).)865866Добавлен класс [`typing.Collection`](https://python-all.ru/3/library/typing.html#typing.Collection) для представления [`collections.abc.Collection`](https://python-all.ru/3/library/collections.abc.html#collections.abc.Collection). (Предложено Иваном Левкивским в [bpo-27598](https://python-all.ru/3/whatsnew/3.6.html).)867868Добавлена конструкция типа [`typing.ClassVar`](https://python-all.ru/3/library/typing.html#typing.ClassVar) для обозначения переменных класса. Как представлено в [**PEP 526**](https://python-all.ru/3/whatsnew/3.6.html), аннотация переменной, обёрнутая в ClassVar, указывает, что данный атрибут предназначен для использования в качестве переменной класса и не должен устанавливаться на экземплярах этого класса. (Предложено Иваном Левкивским в [Github #280](https://python-all.ru/3/whatsnew/3.6.html).)869870Новая константа [`TYPE_CHECKING`](https://python-all.ru/3/library/typing.html#typing.TYPE_CHECKING), которая статическими проверяющими типами считается `True`, но во время выполнения является `False`. (Предложено Гвидо ван Россумом в [Github #230](https://python-all.ru/3/whatsnew/3.6.html).)871872Добавлена новая вспомогательная функция [`NewType()`](https://python-all.ru/3/library/typing.html#typing.NewType) для создания облегчённых отдельных типов для аннотаций:873874```python875from typing import NewType876877UserId = NewType('UserId', int)878some_id = UserId(524313)879```880881Статический проверяющий типов будет обрабатывать новый тип так, как если бы он был подклассом исходного типа. (Предложено Иваном Левкивским в [Github #189](https://python-all.ru/3/whatsnew/3.6.html).)882883### unicodedata884885Модуль [`unicodedata`](https://python-all.ru/3/library/unicodedata.html#module-unicodedata) теперь использует данные из [Unicode 9.0.0](https://python-all.ru/3/whatsnew/3.6.html). (Предложено Бенджамином Петерсоном.)886887### unittest.mock888889Класс [`Mock`](https://python-all.ru/3/library/unittest.mock.html#unittest.mock.Mock) получил следующие улучшения:890891- Два новых метода: [`Mock.assert_called()`](https://python-all.ru/3/library/unittest.mock.html#unittest.mock.Mock.assert_called) и [`Mock.assert_called_once()`](https://python-all.ru/3/library/unittest.mock.html#unittest.mock.Mock.assert_called_once) для проверки, был ли вызван объект-заглушка. (Предложено Амит Саха в [bpo-26323](https://python-all.ru/3/whatsnew/3.6.html).)892- Метод [`Mock.reset_mock()`](https://python-all.ru/3/library/unittest.mock.html#unittest.mock.Mock.reset_mock) теперь имеет два необязательных аргумента, передаваемых только по ключу: *return\_value* и *side\_effect*. (Предложено Кушалом Дасом в [bpo-21271](https://python-all.ru/3/whatsnew/3.6.html).)893894### urllib.request895896Если HTTP-запрос имеет тело в виде файла или итерируемого объекта (не являющегося объектом bytes), но не имеет заголовка `Content-Length`, то теперь вместо возникновения ошибки [`AbstractHTTPHandler`](https://python-all.ru/3/library/urllib.request.html#urllib.request.HTTPHandler) переключается на использование фрагментированной передачи (chunked transfer encoding). (Предложено Демианом Брехтом и Рольфом Кралем в [bpo-12319](https://python-all.ru/3/whatsnew/3.6.html).)897898### urllib.robotparser899900[`RobotFileParser`](https://python-all.ru/3/library/urllib.robotparser.html#urllib.robotparser.RobotFileParser) теперь поддерживает расширения `Crawl-delay` и `Request-rate`. (Предложено Николаем Богоячевым в [bpo-16099](https://python-all.ru/3/whatsnew/3.6.html).)901902### venv903904[`venv`](https://python-all.ru/3/library/venv.html#module-venv) принимает новый параметр `--prompt`. Этот параметр предоставляет альтернативный префикс для виртуального окружения. (Предложено Лукашем Бальцержаком и портировано на 3.6 Стефаном Виртелем в [bpo-22829](https://python-all.ru/3/whatsnew/3.6.html).)905906### warnings907908Новый необязательный параметр *source* добавлен в функцию [`warnings.warn_explicit()`](https://python-all.ru/3/library/warnings.html#warnings.warn_explicit): уничтоженный объект, породивший предупреждение [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning). Атрибут *source* также добавлен в `warnings.WarningMessage` (предложено Виктором Штиннером в [bpo-26568](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-26567](https://python-all.ru/3/whatsnew/3.6.html)).909910При регистрации предупреждения [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning) теперь используется модуль [`tracemalloc`](https://python-all.ru/3/library/tracemalloc.html#module-tracemalloc), чтобы попытаться получить трассировку того места, где был размещён уничтоженный объект.911912Пример со скриптом `example.py`:913914```python915import warnings916917def func():918 return open(__file__)919920f = func()921f = None922```923924Вывод команды `python3.6 -Wd -X tracemalloc=5 example.py`:925926```python927example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>928 f = None929Object allocated at (most recent call first):930 File "example.py", lineno 4931 return open(__file__)932 File "example.py", lineno 6933 f = func()934```935936Трассировка «Объект размещён по адресу» является новой и отображается только в том случае, если [`tracemalloc`](https://python-all.ru/3/library/tracemalloc.html#module-tracemalloc) отслеживает выделения памяти Python и если модуль [`warnings`](https://python-all.ru/3/library/warnings.html#module-warnings) уже был импортирован.937938### winreg939940Добавлен 64-битный целочисленный тип [`REG_QWORD`](https://python-all.ru/3/library/winreg.html#winreg.REG_QWORD). (Предложено Клементом Руо в [bpo-23026](https://python-all.ru/3/whatsnew/3.6.html).)941942### winsound943944Разрешена передача именованных аргументов в [`Beep`](https://python-all.ru/3/library/winsound.html#winsound.Beep), [`MessageBeep`](https://python-all.ru/3/library/winsound.html#winsound.MessageBeep) и [`PlaySound`](https://python-all.ru/3/library/winsound.html#winsound.PlaySound) ([bpo-27982](https://python-all.ru/3/whatsnew/3.6.html)).945946### xmlrpc.client947948Модуль [`xmlrpc.client`](https://python-all.ru/3/library/xmlrpc.client.html#module-xmlrpc.client) теперь поддерживает распаковку (unmarshalling) дополнительных типов данных, используемых реализацией Apache XML-RPC для числовых значений и `None`. (Автор: Serhiy Storchaka в [bpo-26885](https://python-all.ru/3/whatsnew/3.6.html).)949950### zipfile951952Новый метод класса [`ZipInfo.from_file()`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipInfo.from_file) позволяет создать экземпляр [`ZipInfo`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipInfo) из файла файловой системы. Новый метод [`ZipInfo.is_dir()`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipInfo.is_dir) можно использовать для проверки, представляет ли экземпляр `ZipInfo` каталог. (Автор: Thomas Kluyver в [bpo-26039](https://python-all.ru/3/whatsnew/3.6.html).)953954Метод [`ZipFile.open()`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipFile.open) теперь можно использовать для записи данных в ZIP-файл, а также для извлечения данных. (Автор: Thomas Kluyver в [bpo-26039](https://python-all.ru/3/whatsnew/3.6.html).)955956### zlib957958Функции [`compress()`](https://python-all.ru/3/library/zlib.html#zlib.compress) и [`decompress()`](https://python-all.ru/3/library/zlib.html#zlib.decompress) теперь принимают именованные аргументы. (Авторы: Aviv Palivoda в [bpo-26243](https://python-all.ru/3/whatsnew/3.6.html) и Xiang Zhang в [bpo-16764](https://python-all.ru/3/whatsnew/3.6.html) соответственно.)959960## Оптимизации961962- Интерпретатор Python теперь использует 16-битный wordcode вместо байткода, что позволило провести ряд оптимизаций opcode. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в [bpo-26647](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-28050](https://python-all.ru/3/whatsnew/3.6.html).)963- Класс [`asyncio.Future`](https://python-all.ru/3/library/asyncio-future.html#asyncio.Future) теперь имеет оптимизированную реализацию на C. (Авторы: Yury Selivanov и INADA Naoki в [bpo-26081](https://python-all.ru/3/whatsnew/3.6.html).)964- Класс [`asyncio.Task`](https://python-all.ru/3/library/asyncio-task.html#asyncio.Task) теперь имеет оптимизированную реализацию на C. (Автор: Yury Selivanov в [bpo-28544](https://python-all.ru/3/whatsnew/3.6.html).)965- Различные улучшения реализации в модуле [`typing`](https://python-all.ru/3/library/typing.html#module-typing) (например, кэширование обобщённых типов) позволяют добиться повышения производительности до 30 раз и уменьшения потребления памяти.966- ASCII-декодер теперь работает до 60 раз быстрее для обработчиков ошибок `surrogateescape`, `ignore` и `replace` (Автор: Victor Stinner в [bpo-24870](https://python-all.ru/3/whatsnew/3.6.html)).967- ASCII- и Latin1-кодеры теперь работают до 3 раз быстрее для обработчика ошибок `surrogateescape` (Автор: Victor Stinner в [bpo-25227](https://python-all.ru/3/whatsnew/3.6.html)).968- UTF-8-кодер теперь работает до 75 раз быстрее для обработчиков ошибок `ignore`, `replace`, `surrogateescape`, `surrogatepass` (Автор: Victor Stinner в [bpo-25267](https://python-all.ru/3/whatsnew/3.6.html)).969- UTF-8-декодер теперь работает до 15 раз быстрее для обработчиков ошибок `ignore`, `replace` и `surrogateescape` (Автор: Victor Stinner в [bpo-25301](https://python-all.ru/3/whatsnew/3.6.html)).970- `bytes % args` теперь работает до 2 раз быстрее. (Автор: Victor Stinner в [bpo-25349](https://python-all.ru/3/whatsnew/3.6.html)).971- `bytearray % args` теперь работает в 2,5–5 раз быстрее. (Автор: Victor Stinner в [bpo-25399](https://python-all.ru/3/whatsnew/3.6.html)).972- Оптимизированы [`bytes.fromhex()`](https://python-all.ru/3/library/stdtypes.html#bytes.fromhex) и [`bytearray.fromhex()`](https://python-all.ru/3/library/stdtypes.html#bytearray.fromhex): теперь они работают в 2–3,5 раза быстрее. (Автор: Victor Stinner в [bpo-25401](https://python-all.ru/3/whatsnew/3.6.html)).973- Оптимизированы `bytes.replace(b'', b'.')` и `bytearray.replace(b'', b'.')`: до 80% быстрее. (Автор: Josh Snider в [bpo-26574](https://python-all.ru/3/whatsnew/3.6.html)).974- Функции распределителя памяти домена [`PyMem_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_Malloc) ([`PYMEM_DOMAIN_MEM`](https://python-all.ru/3/c-api/memory.html#c.PYMEM_DOMAIN_MEM)) теперь используют [распределитель памяти pymalloc](https://python-all.ru/3/c-api/memory.html#pymalloc) вместо функции `malloc()` библиотеки C. Распределитель pymalloc оптимизирован для объектов размером не более 512 байт с коротким временем жизни и использует `malloc()` для больших блоков памяти. (Автор: Victor Stinner в [bpo-26249](https://python-all.ru/3/whatsnew/3.6.html)).975- [`pickle.load()`](https://python-all.ru/3/library/pickle.html#pickle.load) и [`pickle.loads()`](https://python-all.ru/3/library/pickle.html#pickle.loads) теперь работают до 10% быстрее при десериализации множества мелких объектов (Автор: Victor Stinner в [bpo-27056](https://python-all.ru/3/whatsnew/3.6.html)).976- Передача [именованных аргументов](https://python-all.ru/3/glossary.html#term-keyword-argument) в функцию требует дополнительных затрат по сравнению с передачей [позиционных аргументов](https://python-all.ru/3/glossary.html#term-positional-argument). Теперь в функциях расширения, реализованных с помощью Argument Clinic, эти затраты значительно снижены. (Автор: Serhiy Storchaka в [bpo-27574](https://python-all.ru/3/whatsnew/3.6.html)).977- Оптимизированы функции [`glob()`](https://python-all.ru/3/library/glob.html#glob.glob) и [`iglob()`](https://python-all.ru/3/library/glob.html#glob.iglob) в модуле [`glob`](https://python-all.ru/3/library/glob.html#module-glob); теперь они работают примерно в 3–6 раз быстрее. (Автор: Serhiy Storchaka в [bpo-25596](https://python-all.ru/3/whatsnew/3.6.html)).978- Оптимизирована глоббинг (globbing) в [`pathlib`](https://python-all.ru/3/library/pathlib.html#module-pathlib) с помощью [`os.scandir()`](https://python-all.ru/3/library/os.html#os.scandir); теперь она работает примерно в 1,5–4 раза быстрее. (Автор: Serhiy Storchaka в [bpo-26032](https://python-all.ru/3/whatsnew/3.6.html)).979- Производительность разбора (parsing), итерации и deepcopy для [`xml.etree.ElementTree`](https://python-all.ru/3/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) значительно улучшена. (Автор: Serhiy Storchaka в [bpo-25638](https://python-all.ru/3/whatsnew/3.6.html), [bpo-25873](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-25869](https://python-all.ru/3/whatsnew/3.6.html).)980- Создание экземпляров [`fractions.Fraction`](https://python-all.ru/3/library/fractions.html#fractions.Fraction) из чисел с плавающей точкой и десятичных чисел теперь в 2–3 раза быстрее. (Автор: Serhiy Storchaka в [bpo-25971](https://python-all.ru/3/whatsnew/3.6.html).)981982## Изменения в сборке и C API983984- Для сборки Python теперь требуется поддержка некоторых возможностей C99 в инструментальной цепочке. В частности, Python теперь использует стандартные целочисленные типы и макросы вместо пользовательских макросов, таких как `PY_LONG_LONG`. Дополнительную информацию см. в [**PEP 7**](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-17884](https://python-all.ru/3/whatsnew/3.6.html).985- Кросс-компиляция CPython с Android NDK и уровнем API Android, установленным на 21 (Android 5.0 Lollipop) или выше, выполняется успешно. Хотя Android пока не является поддерживаемой платформой, тестовый набор Python запускается на эмуляторе Android всего с примерно 16 неудачными тестами. См. мета-задачу Android [bpo-26865](https://python-all.ru/3/whatsnew/3.6.html).986- Добавлен флаг конфигурации `--enable-optimizations`. Его включение активирует дорогостоящие оптимизации, такие как PGO. (Оригинальный патч от Alecsandru Patrascu из Intel в [bpo-26359](https://python-all.ru/3/whatsnew/3.6.html).)987- [GIL](https://python-all.ru/3/glossary.html#term-global-interpreter-lock) теперь должен удерживаться при вызове функций распределителя памяти доменов [`PYMEM_DOMAIN_OBJ`](https://python-all.ru/3/c-api/memory.html#c.PYMEM_DOMAIN_OBJ) (например, [`PyObject_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyObject_Malloc)) и [`PYMEM_DOMAIN_MEM`](https://python-all.ru/3/c-api/memory.html#c.PYMEM_DOMAIN_MEM) (например, [`PyMem_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_Malloc)).988- Новый API [`Py_FinalizeEx()`](https://python-all.ru/3/c-api/interp-lifecycle.html#c.Py_FinalizeEx), который сообщает, не удалась ли сброс буферизованных данных. (Автор: Martin Panter в [bpo-5319](https://python-all.ru/3/whatsnew/3.6.html).)989- [`PyArg_ParseTupleAndKeywords()`](https://python-all.ru/3/c-api/arg.html#c.PyArg_ParseTupleAndKeywords) теперь поддерживает [только позиционные параметры](https://python-all.ru/3/glossary.html#positional-only-parameter). Только позиционные параметры определяются пустыми именами. (Предложено Serhiy Storchaka в [bpo-26282](https://python-all.ru/3/whatsnew/3.6.html)).990- Метод `PyTraceback_Print` теперь сокращает длинные последовательности повторяющихся строк как `"[Previous line repeated {count} more times]"`. (Предложено Emanuel Barry в [bpo-26823](https://python-all.ru/3/whatsnew/3.6.html).)991- Новая функция [`PyErr_SetImportErrorSubclass()`](https://python-all.ru/3/c-api/exceptions.html#c.PyErr_SetImportErrorSubclass) позволяет указать подкласс [`ImportError`](https://python-all.ru/3/library/exceptions.html#ImportError) для возбуждения. (Предложено Eric Snow в [bpo-15767](https://python-all.ru/3/whatsnew/3.6.html).)992- Новую функцию [`PyErr_ResourceWarning()`](https://python-all.ru/3/c-api/exceptions.html#c.PyErr_ResourceWarning) можно использовать для генерации [`ResourceWarning`](https://python-all.ru/3/library/exceptions.html#ResourceWarning), предоставляющего источник выделения ресурсов. (Предложено Victor Stinner в [bpo-26567](https://python-all.ru/3/whatsnew/3.6.html).)993- Новая функция [`PyOS_FSPath()`](https://python-all.ru/3/c-api/sys.html#c.PyOS_FSPath) возвращает файловое системное представление [путеподобного объекта](https://python-all.ru/3/glossary.html#term-path-like-object). (Предложено Brett Cannon в [bpo-27186](https://python-all.ru/3/whatsnew/3.6.html).)994- Функции [`PyUnicode_FSConverter()`](https://python-all.ru/3/c-api/unicode.html#c.PyUnicode_FSConverter) и [`PyUnicode_FSDecoder()`](https://python-all.ru/3/c-api/unicode.html#c.PyUnicode_FSDecoder) теперь принимают [путеподобные объекты](https://python-all.ru/3/glossary.html#term-path-like-object).995996## Другие улучшения997998- Если [`--version`](https://python-all.ru/3/using/cmdline.html#cmdoption-version) (краткая форма: [`-V`](https://python-all.ru/3/using/cmdline.html#cmdoption-V)) указывается дважды, Python выводит [`sys.version`](https://python-all.ru/3/library/sys.html#sys.version) для подробной информации.9991000 ```console1001 $ ./python -VV1002 Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)1003 [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]1004 ```10051006## Устарело10071008### Новые ключевые слова10091010`async` и `await` не рекомендуется использовать в качестве имен переменных, классов, функций или модулей. Введенные [**PEP 492**](https://python-all.ru/3/whatsnew/3.6.html) в Python 3.5, они станут полноценными ключевыми словами в Python 3.7. Начиная с Python 3.6, использование `async` или `await` в качестве имен будет вызывать [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning).10111012### Устаревшее поведение Python10131014Возбуждение исключения [`StopIteration`](https://python-all.ru/3/library/exceptions.html#StopIteration) внутри генератора теперь будет генерировать [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning) и вызовет [`RuntimeError`](https://python-all.ru/3/library/exceptions.html#RuntimeError) в Python 3.7. Подробнее см. [PEP 479: Изменение обработки StopIteration внутри генераторов](https://python-all.ru/3/whatsnew/3.5.html#whatsnew-pep-479).10151016Метод [`__aiter__()`](https://python-all.ru/3/reference/datamodel.html#object.__aiter__) теперь должен возвращать асинхронный итератор напрямую, а не ожидаемый объект, как раньше. При возврате итератора будет вызвано [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning). Обратная совместимость будет удалена в Python 3.7. (Предложено Yury Selivanov в [bpo-27243](https://python-all.ru/3/whatsnew/3.6.html).)10171018Пара символов обратной косой черты, не являющаяся допустимой управляющей последовательностью, теперь генерирует [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning). Хотя со временем это станет [`SyntaxError`](https://python-all.ru/3/library/exceptions.html#SyntaxError), этого не произойдет в течение нескольких выпусков Python. (Предложено Emanuel Barry в [bpo-27364](https://python-all.ru/3/whatsnew/3.6.html).)10191020При выполнении относительного импорта обращение к `__name__` и `__path__` из вызывающего модуля, если `__spec__` или `__package__` не определены, теперь вызывает [`ImportWarning`](https://python-all.ru/3/library/exceptions.html#ImportWarning). (Предложено Rose Ames в [bpo-25791](https://python-all.ru/3/whatsnew/3.6.html).)10211022### Устаревшие модули, функции и методы Python10231024#### asynchat10251026`asynchat` устарел в пользу [`asyncio`](https://python-all.ru/3/library/asyncio.html#module-asyncio). (Предложено Mariatta в [bpo-25002](https://python-all.ru/3/whatsnew/3.6.html).)10271028#### asyncore10291030`asyncore` устарел в пользу [`asyncio`](https://python-all.ru/3/library/asyncio.html#module-asyncio). (Предложено Mariatta в [bpo-25002](https://python-all.ru/3/whatsnew/3.6.html).)10311032#### dbm10331034В отличие от других реализаций [`dbm`](https://python-all.ru/3/library/dbm.html#module-dbm), модуль [`dbm.dumb`](https://python-all.ru/3/library/dbm.html#module-dbm.dumb) создает базы данных в режиме `'rw'` и позволяет изменять базу данных, открытую в режиме `'r'`. Такое поведение теперь устарело и будет удалено в версии 3.8. (Предложено Serhiy Storchaka в [bpo-21708](https://python-all.ru/3/whatsnew/3.6.html).)10351036#### distutils10371038Незадокументированный аргумент `extra_path` конструктора `distutils.Distribution` теперь считается устаревшим и будет вызывать предупреждение при его установке. Поддержка этого параметра будет удалена в одном из будущих выпусков Python. Подробнее см. [bpo-27919](https://python-all.ru/3/whatsnew/3.6.html).10391040#### grp10411042Поддержка нецелочисленных аргументов в [`getgrgid()`](https://python-all.ru/3/library/grp.html#grp.getgrgid) устарела. (Предложено Serhiy Storchaka в [bpo-26129](https://python-all.ru/3/whatsnew/3.6.html).)10431044#### importlib10451046Методы [`importlib.machinery.SourceFileLoader.load_module()`](https://python-all.ru/3/library/importlib.html#importlib.machinery.SourceFileLoader.load_module) и [`importlib.machinery.SourcelessFileLoader.load_module()`](https://python-all.ru/3/library/importlib.html#importlib.machinery.SourcelessFileLoader.load_module) теперь устарели. Они были единственными оставшимися реализациями [`importlib.abc.Loader.load_module()`](https://python-all.ru/3/library/importlib.html#importlib.abc.Loader.load_module) в [`importlib`](https://python-all.ru/3/library/importlib.html#module-importlib), которые не были объявлены устаревшими в предыдущих версиях Python в пользу [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3/library/importlib.html#importlib.abc.Loader.exec_module).10471048Класс [`importlib.machinery.WindowsRegistryFinder`](https://python-all.ru/3/library/importlib.html#importlib.machinery.WindowsRegistryFinder) теперь устарел. Начиная с версии 3.6.0, он все еще добавляется в [`sys.meta_path`](https://python-all.ru/3/library/sys.html#sys.meta_path) по умолчанию (на Windows), но это может измениться в будущих выпусках.10491050#### os10511052Незадокументированная поддержка [байтоподобных объектов](https://python-all.ru/3/glossary.html#term-bytes-like-object) общего вида в качестве путей в функциях [`os`](https://python-all.ru/3/library/os.html#module-os), [`compile()`](https://python-all.ru/3/library/functions.html#compile) и подобных функциях теперь устарела. (Предложено Serhiy Storchaka в [bpo-25791](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-26754](https://python-all.ru/3/whatsnew/3.6.html).)10531054#### re10551056Поддержка встроенных флагов `(?letters)` в середине регулярного выражения устарела и будет удалена в будущей версии Python. Флаги в начале регулярного выражения по-прежнему разрешены. (Внёс Serhiy Storchaka в [bpo-22493](https://python-all.ru/3/whatsnew/3.6.html).)10571058#### ssl10591060OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль [`ssl`](https://python-all.ru/3/library/ssl.html#module-ssl) будет требовать как минимум OpenSSL 1.0.2 или 1.1.0.10611062Аргументы, связанные с SSL, такие как `certfile`, `keyfile` и `check_hostname`, в [`ftplib`](https://python-all.ru/3/library/ftplib.html#module-ftplib), [`http.client`](https://python-all.ru/3/library/http.client.html#module-http.client), [`imaplib`](https://python-all.ru/3/library/imaplib.html#module-imaplib), [`poplib`](https://python-all.ru/3/library/poplib.html#module-poplib) и [`smtplib`](https://python-all.ru/3/library/smtplib.html#module-smtplib) устарели в пользу `context`. (Внёс Christian Heimes в [bpo-28022](https://python-all.ru/3/whatsnew/3.6.html).)10631064Некоторые протоколы и функции модуля [`ssl`](https://python-all.ru/3/library/ssl.html#module-ssl) теперь устарели. Некоторые возможности будут недоступны в будущих версиях OpenSSL. Другие возможности устарели в пользу другого API. (Внёс Christian Heimes в [bpo-28022](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-26470](https://python-all.ru/3/whatsnew/3.6.html).)10651066#### tkinter10671068Модуль `tkinter.tix` теперь устарел. Пользователям [`tkinter`](https://python-all.ru/3/library/tkinter.html#module-tkinter) следует использовать [`tkinter.ttk`](https://python-all.ru/3/library/tkinter.ttk.html#module-tkinter.ttk) вместо него.10691070#### venv10711072Скрипт `pyvenv` устарел в пользу `python3 -m venv`. Это предотвращает путаницу в том, к какому интерпретатору Python подключён `pyvenv` и, следовательно, какой интерпретатор Python будет использоваться виртуальным окружением. (Внёс Brett Cannon в [bpo-25154](https://python-all.ru/3/whatsnew/3.6.html).)10731074### xml10751076- В качестве меры защиты от DTD и извлечения внешних сущностей модули [`xml.dom.minidom`](https://python-all.ru/3/library/xml.dom.minidom.html#module-xml.dom.minidom) и [`xml.sax`](https://python-all.ru/3/library/xml.sax.html#module-xml.sax) больше не обрабатывают внешние сущности по умолчанию. (Внёс Christian Heimes в [gh-61441](https://python-all.ru/3/whatsnew/3.6.html).)10771078### Устаревшие функции и типы C API10791080Undocumented functions `PyUnicode_AsEncodedObject()`, `PyUnicode_AsDecodedObject()`, `PyUnicode_AsEncodedUnicode()` and `PyUnicode_AsDecodedUnicode()` are deprecated now. Use the [generic codec based API](https://python-all.ru/3/c-api/codec.html#codec-registry) instead.10811082### Устаревшие параметры сборки10831084Флаг конфигурации `--with-system-ffi` теперь включён по умолчанию на UNIX-платформах, отличных от macOS. Его можно отключить с помощью `--without-system-ffi`, но использование флага устарело и не будет приниматься в Python 3.7. macOS это изменение не затрагивает. Обратите внимание, что многие распространители ОС уже используют флаг `--with-system-ffi` при сборке своего системного Python.10851086## Удалено10871088### Удаление API и возможностей10891090- Неизвестные экранирующие последовательности, состоящие из `'\'` и буквы ASCII в регулярных выражениях, теперь будут вызывать ошибку. В шаблонах замены для [`re.sub()`](https://python-all.ru/3/library/re.html#re.sub) они по-прежнему разрешены, но устарели. Флаг [`re.LOCALE`](https://python-all.ru/3/library/re.html#re.LOCALE) теперь может использоваться только с двоичными шаблонами.1091- `inspect.getmoduleinfo()` был удалён (устарел начиная с CPython 3.3). Для получения имени модуля по заданному пути следует использовать [`inspect.getmodulename()`](https://python-all.ru/3/library/inspect.html#inspect.getmodulename). (Внёс Yury Selivanov в [bpo-13248](https://python-all.ru/3/whatsnew/3.6.html).)1092- Класс `traceback.Ignore` и методы `traceback.usage`, `traceback.modname`, `traceback.fullmodname`, `traceback.find_lines_from_code`, `traceback.find_lines`, `traceback.find_strings`, `traceback.find_executable_lines` были удалены из модуля [`traceback`](https://python-all.ru/3/library/traceback.html#module-traceback). Это были недокументированные методы, устаревшие с Python 3.2; эквивалентная функциональность доступна через приватные методы.1093- Фиктивные методы `tk_menuBar()` и `tk_bindForTraversal()` в классах виджетов [`tkinter`](https://python-all.ru/3/library/tkinter.html#module-tkinter) были удалены (соответствующие команды Tk устарели начиная с Tk 4.0).1094- Метод [`open()`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipFile.open) класса [`zipfile.ZipFile`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipFile) больше не поддерживает режим `'U'` (устарел с Python 3.4). Используйте [`io.TextIOWrapper`](https://python-all.ru/3/library/io.html#io.TextIOWrapper) для чтения сжатых текстовых файлов в режиме [универсальных новых строк](https://python-all.ru/3/glossary.html#term-universal-newlines).1095- Незадокументированные модули `IN`, `CDROM`, `DLFCN`, `TYPES`, `CDIO` и `STROPTS` были удалены. Они были доступны в каталогах, специфичных для платформы `Lib/plat-*/`, но хронически устаревали, были непоследовательно доступны на разных платформах и не поддерживались. Скрипт, создававший эти модули, по-прежнему доступен в дистрибутиве исходного кода по адресу [Tools/scripts/h2py.py](https://python-all.ru/3/whatsnew/3.6.html).1096- Устаревший класс `asynchat.fifo` был удалён.10971098## Перенос на Python 3.610991100В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.11011102### Изменения в поведении команды ‘python’11031104- Вывод специальной сборки Python с определёнными макросами `COUNT_ALLOCS`, `SHOW_ALLOC_COUNT` или `SHOW_TRACK_COUNT` теперь по умолчанию отключён. Его можно снова включить с помощью опции `-X showalloccount`. Теперь он выводит в `stderr` вместо `stdout`. (Внёс Serhiy Storchaka в [bpo-23034](https://python-all.ru/3/whatsnew/3.6.html).)11051106### Изменения в Python API11071108- [`open()`](https://python-all.ru/3/library/functions.html#open) больше не будет разрешать комбинировать флаг режима `'U'` с `'+'`. (Внесли Jeff Balogh и John O’Connor в [bpo-2091](https://python-all.ru/3/whatsnew/3.6.html).)1109- [`sqlite3`](https://python-all.ru/3/library/sqlite3.html#module-sqlite3) больше не выполняет неявную фиксацию открытой транзакции перед операторами DDL.1110- На Linux [`os.urandom()`](https://python-all.ru/3/library/os.html#os.urandom) теперь блокируется до инициализации пула энтропии системного urandom для повышения безопасности.1111- Если определён [`importlib.abc.Loader.exec_module()`](https://python-all.ru/3/library/importlib.html#importlib.abc.Loader.exec_module), [`importlib.abc.Loader.create_module()`](https://python-all.ru/3/library/importlib.html#importlib.abc.Loader.create_module) тоже должен быть определён.1112- [`PyErr_SetImportError()`](https://python-all.ru/3/c-api/exceptions.html#c.PyErr_SetImportError) теперь устанавливает [`TypeError`](https://python-all.ru/3/library/exceptions.html#TypeError), если его аргумент **msg** не задан. Ранее возвращался только `NULL`.1113- Формат атрибута [`co_lnotab`](https://python-all.ru/3/reference/datamodel.html#codeobject.co_lnotab) объектов кода был изменён для поддержки отрицательного смещения номера строки. По умолчанию Python не генерирует байт-код с отрицательным смещением номера строки. Функции, использующие [`frame.f_lineno`](https://python-all.ru/3/reference/datamodel.html#frame.f_lineno), `PyFrame_GetLineNumber()` или `PyCode_Addr2Line()`, не затрагиваются. Функции, напрямую декодирующие `co_lnotab`, следует обновить для использования знакового 8-битного целого типа для смещения номера строки, но это требуется только для поддержки приложений, использующих отрицательное смещение. См. `Objects/lnotab_notes.txt` для описания формата `co_lnotab` и способов его декодирования, а также [**PEP 511**](https://python-all.ru/3/whatsnew/3.6.html) для обоснования.1114- Функции модуля [`compileall`](https://python-all.ru/3/library/compileall.html#module-compileall) теперь возвращают булевы значения вместо `1` или `0` для обозначения успеха или неудачи соответственно. Поскольку булевы значения являются подклассом целых чисел, это может быть проблемой только если вы использовали проверки идентичности с `1` или `0`. См. [bpo-25768](https://python-all.ru/3/whatsnew/3.6.html).1115- Чтение атрибута `port` у [`urllib.parse.urlsplit()`](https://python-all.ru/3/library/urllib.parse.html#urllib.parse.urlsplit) и [`urlparse()`](https://python-all.ru/3/library/urllib.parse.html#urllib.parse.urlparse) теперь вызывает [`ValueError`](https://python-all.ru/3/library/exceptions.html#ValueError) для значений вне диапазона, вместо возврата [`None`](https://python-all.ru/3/library/constants.html#None). См. [bpo-20059](https://python-all.ru/3/whatsnew/3.6.html).1116- Модуль `imp` теперь вызывает [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning) вместо [`PendingDeprecationWarning`](https://python-all.ru/3/library/exceptions.html#PendingDeprecationWarning).1117- У следующих модулей в атрибут [`__all__`](https://python-all.ru/3/reference/simple_stmts.html#module.__all__) были добавлены недостающие API для соответствия документированным API: [`calendar`](https://python-all.ru/3/library/calendar.html#module-calendar), `cgi`, [`csv`](https://python-all.ru/3/library/csv.html#module-csv), [`ElementTree`](https://python-all.ru/3/library/xml.etree.elementtree.html#module-xml.etree.ElementTree), [`enum`](https://python-all.ru/3/library/enum.html#module-enum), [`fileinput`](https://python-all.ru/3/library/fileinput.html#module-fileinput), [`ftplib`](https://python-all.ru/3/library/ftplib.html#module-ftplib), [`logging`](https://python-all.ru/3/library/logging.html#module-logging), [`mailbox`](https://python-all.ru/3/library/mailbox.html#module-mailbox), [`mimetypes`](https://python-all.ru/3/library/mimetypes.html#module-mimetypes), [`optparse`](https://python-all.ru/3/library/optparse.html#module-optparse), [`plistlib`](https://python-all.ru/3/library/plistlib.html#module-plistlib), `smtpd`, [`subprocess`](https://python-all.ru/3/library/subprocess.html#module-subprocess), [`tarfile`](https://python-all.ru/3/library/tarfile.html#module-tarfile), [`threading`](https://python-all.ru/3/library/threading.html#module-threading) и [`wave`](https://python-all.ru/3/library/wave.html#module-wave). Это означает, что они будут экспортировать новые символы при использовании `import *`. (Вклад Джоэла Таддеи и Яцека Колодзея в [bpo-23883](https://python-all.ru/3/whatsnew/3.6.html).)1118- При выполнении относительного импорта, если `__package__` не равно `__spec__.parent`, то вызывается [`ImportWarning`](https://python-all.ru/3/library/exceptions.html#ImportWarning). (Вклад Бретта Кэннона в [bpo-25791](https://python-all.ru/3/whatsnew/3.6.html).)1119- Когда выполняется относительный импорт и родительский пакет неизвестен, будет вызвано [`ImportError`](https://python-all.ru/3/library/exceptions.html#ImportError). Ранее могло вызываться [`SystemError`](https://python-all.ru/3/library/exceptions.html#SystemError). (Вклад Бретта Кэннона в [bpo-18018](https://python-all.ru/3/whatsnew/3.6.html).)1120- Серверы на основе модуля [`socketserver`](https://python-all.ru/3/library/socketserver.html#module-socketserver), включая определённые в [`http.server`](https://python-all.ru/3/library/http.server.html#module-http.server), [`xmlrpc.server`](https://python-all.ru/3/library/xmlrpc.server.html#module-xmlrpc.server) и [`wsgiref.simple_server`](https://python-all.ru/3/library/wsgiref.html#module-wsgiref.simple_server), теперь перехватывают только исключения, производные от [`Exception`](https://python-all.ru/3/library/exceptions.html#Exception). Поэтому если обработчик запроса вызывает исключение типа [`SystemExit`](https://python-all.ru/3/library/exceptions.html#SystemExit) или [`KeyboardInterrupt`](https://python-all.ru/3/library/exceptions.html#KeyboardInterrupt), [`handle_error()`](https://python-all.ru/3/library/socketserver.html#socketserver.BaseServer.handle_error) больше не вызывается, и исключение остановит однопоточный сервер. (Вклад Мартина Пантера в [bpo-23430](https://python-all.ru/3/whatsnew/3.6.html).)1121- `spwd.getspnam()` теперь вызывает [`PermissionError`](https://python-all.ru/3/library/exceptions.html#PermissionError) вместо [`KeyError`](https://python-all.ru/3/library/exceptions.html#KeyError), если у пользователя нет прав.1122- Метод [`socket.socket.close()`](https://python-all.ru/3/library/socket.html#socket.socket.close) теперь вызывает исключение, если базовый системный вызов сообщил об ошибке (например, `EBADF`). (Вклад Мартина Пантера в [bpo-26685](https://python-all.ru/3/whatsnew/3.6.html).)1123- Аргумент *decode\_data* конструкторов `smtpd.SMTPChannel` и `smtpd.SMTPServer` теперь по умолчанию равен `False`. Это означает, что аргумент, передаваемый в `process_message()`, теперь по умолчанию является объектом bytes, а в `process_message()` будут передаваться именованные аргументы. Код, который уже был обновлён в соответствии с предупреждением об устаревании, сгенерированным 3.5, не будет затронут.1124- Все необязательные аргументы функций [`dump()`](https://python-all.ru/3/library/json.html#json.dump), [`dumps()`](https://python-all.ru/3/library/json.html#json.dumps), [`load()`](https://python-all.ru/3/library/json.html#json.load) и [`loads()`](https://python-all.ru/3/library/json.html#json.loads) и конструкторов классов [`JSONEncoder`](https://python-all.ru/3/library/json.html#json.JSONEncoder) и [`JSONDecoder`](https://python-all.ru/3/library/json.html#json.JSONDecoder) в модуле [`json`](https://python-all.ru/3/library/json.html#module-json) теперь являются [только именованными](https://python-all.ru/3/glossary.html#keyword-only-parameter). (Вклад Сергея Сторчаки в [bpo-18726](https://python-all.ru/3/whatsnew/3.6.html).)1125- Подклассы [`type`](https://python-all.ru/3/library/functions.html#type), которые не переопределяют `type.__new__`, больше не могут использовать форму с одним аргументом для получения типа объекта.1126- В рамках [**PEP 487**](https://python-all.ru/3/whatsnew/3.6.html) обработка именованных аргументов, передаваемых в [`type`](https://python-all.ru/3/library/functions.html#type) (кроме подсказки метакласса `metaclass`), теперь последовательно делегируется [`object.__init_subclass__()`](https://python-all.ru/3/reference/datamodel.html#object.__init_subclass__). Это означает, что [`type.__new__`](https://python-all.ru/3/reference/datamodel.html#object.__new__) и [`type.__init__`](https://python-all.ru/3/reference/datamodel.html#object.__init__) теперь принимают произвольные именованные аргументы, но `object.__init_subclass__()` (который вызывается из `type.__new__`) будет отклонять их по умолчанию. Пользовательским метаклассам, принимающим дополнительные именованные аргументы, потребуется соответствующим образом скорректировать свои вызовы `type.__new__` (непосредственно или через [`super`](https://python-all.ru/3/library/functions.html#super)).1127- В `distutils.command.sdist.sdist` атрибут `default_format` был удалён и больше не учитывается. Вместо него по умолчанию на всех платформах используется формат сжатого tar-файла, и никакого выбора в зависимости от платформы не производится. В средах, где сборки создаются в Windows и требуются дистрибутивы в формате ZIP, настройте проект с помощью файла `setup.cfg`, содержащего следующее:11281129 ```ini1130 [sdist]1131 formats=zip1132 ```11331134 Это поведение также было портировано в более ранние версии Python в составе Setuptools 26.0.0.1135- В модуле [`urllib.request`](https://python-all.ru/3/library/urllib.request.html#module-urllib.request) и методе [`http.client.HTTPConnection.request()`](https://python-all.ru/3/library/http.client.html#http.client.HTTPConnection.request), если не указан заголовок Content-Length и тело запроса является файловым объектом, оно теперь отправляется с кодированием фрагментов HTTP 1.1. Если файловый объект должен быть отправлен на сервер HTTP 1.0, значение Content-Length теперь должно указываться вызывающей стороной. (Вклад Демиана Брехта и Рольфа Краля с доработками Мартина Пантера в [bpo-12319](https://python-all.ru/3/whatsnew/3.6.html).)1136- [`DictReader`](https://python-all.ru/3/library/csv.html#csv.DictReader) теперь возвращает строки типа [`OrderedDict`](https://python-all.ru/3/library/collections.html#collections.OrderedDict). (Вклад Стива Холдена в [bpo-27842](https://python-all.ru/3/whatsnew/3.6.html).)1137- `crypt.METHOD_CRYPT` больше не будет добавляться в `crypt.methods`, если это не поддерживается платформой. (Вклад Виктора Стиннера в [bpo-25287](https://python-all.ru/3/whatsnew/3.6.html).)1138- Аргументы *verbose* и *rename* для [`namedtuple()`](https://python-all.ru/3/library/collections.html#collections.namedtuple) теперь являются только именованными. (Вклад Рэймонда Хеттингера в [bpo-25628](https://python-all.ru/3/whatsnew/3.6.html).)1139- На Linux [`ctypes.util.find_library()`](https://python-all.ru/3/library/ctypes.html#ctypes.util.find_library) теперь ищет общие библиотеки в `LD_LIBRARY_PATH`. (Вклад Виная Саджипа в [bpo-9998](https://python-all.ru/3/whatsnew/3.6.html).)1140- Класс [`imaplib.IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4) теперь обрабатывает флаги, содержащие символ `']'`, в сообщениях, отправляемых с сервера, для улучшения совместимости в реальных условиях. (Вклад Литы Чо в [bpo-21815](https://python-all.ru/3/whatsnew/3.6.html).)1141- Функция [`mmap.mmap.write()`](https://python-all.ru/3/library/mmap.html#mmap.mmap.write) теперь возвращает количество записанных байтов, как и другие методы записи. (Вклад Якуба Стасяка в [bpo-26335](https://python-all.ru/3/whatsnew/3.6.html).)1142- Функции [`pkgutil.iter_modules()`](https://python-all.ru/3/library/pkgutil.html#pkgutil.iter_modules) и [`pkgutil.walk_packages()`](https://python-all.ru/3/library/pkgutil.html#pkgutil.walk_packages) теперь возвращают [`ModuleInfo`](https://python-all.ru/3/library/pkgutil.html#pkgutil.ModuleInfo) именованные кортежи. (Вклад Рамчандры Апте в [bpo-17211](https://python-all.ru/3/whatsnew/3.6.html).)1143- [`re.sub()`](https://python-all.ru/3/library/re.html#re.sub) теперь вызывает ошибку для недопустимых числовых ссылок на группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых ссылок на группы теперь включает индекс группы и позицию ссылки. (Вклад SilentGhost, Сергея Сторчаки в [bpo-25953](https://python-all.ru/3/whatsnew/3.6.html).)1144- [`zipfile.ZipFile`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipFile) теперь будет вызывать [`NotImplementedError`](https://python-all.ru/3/library/exceptions.html#NotImplementedError) для нераспознанных значений сжатия. Ранее вызывалось просто [`RuntimeError`](https://python-all.ru/3/library/exceptions.html#RuntimeError). Кроме того, вызов методов `ZipFile` на закрытом ZipFile или вызов метода [`write()`](https://python-all.ru/3/library/zipfile.html#zipfile.ZipFile.write) на ZipFile, созданном в режиме `'r'`, будет вызывать [`ValueError`](https://python-all.ru/3/library/exceptions.html#ValueError). Ранее в этих сценариях вызывалось `RuntimeError`.1145- Когда пользовательские метаклассы используются вместе с [`super()`](https://python-all.ru/3/library/functions.html#super) без аргументов или прямыми ссылками из методов на неявную переменную замыкания `__class__`, неявная запись пространства имён `__classcell__` теперь должна передаваться в `type.__new__` для инициализации. Невыполнение этого требования приведёт к [`DeprecationWarning`](https://python-all.ru/3/library/exceptions.html#DeprecationWarning) в Python 3.6 и к [`RuntimeError`](https://python-all.ru/3/library/exceptions.html#RuntimeError) в Python 3.8.1146- С введением [`ModuleNotFoundError`](https://python-all.ru/3/library/exceptions.html#ModuleNotFoundError) потребители системы импорта могут начать ожидать, что замены системы импорта будут вызывать это более конкретное исключение, когда это уместно, а не менее конкретное [`ImportError`](https://python-all.ru/3/library/exceptions.html#ImportError). Чтобы обеспечить будущую совместимость с такими потребителями, разработчики альтернативных систем импорта, полностью заменяющих [`__import__()`](https://python-all.ru/3/library/functions.html#import__), должны обновить свои реализации для вызова нового подкласса, когда модуль вообще не найден. Разработчики совместимых плагинов для стандартной системы импорта не должны вносить никаких изменений, так как стандартная система импорта будет вызывать новый подкласс, когда это уместно.11471148### Изменения в C API11491150- Семейство аллокаторов [`PyMem_Malloc()`](https://python-all.ru/3/c-api/memory.html#c.PyMem_Malloc) теперь использует [аллокатор pymalloc](https://python-all.ru/3/c-api/memory.html#pymalloc) вместо системного `malloc()`. Приложения, вызывающие `PyMem_Malloc()` без удержания GIL, могут аварийно завершаться. Установите переменную окружения [`PYTHONMALLOC`](https://python-all.ru/3/using/cmdline.html#envvar-PYTHONMALLOC) в значение `debug`, чтобы проверить использование аллокаторов памяти в вашем приложении. См. [bpo-26249](https://python-all.ru/3/whatsnew/3.6.html).1151- [`Py_Exit()`](https://python-all.ru/3/c-api/sys.html#c.Py_Exit) (и главный интерпретатор) теперь переопределяют код завершения на 120, если сброс буферизованных данных не удался. См. [bpo-5319](https://python-all.ru/3/whatsnew/3.6.html).11521153### Изменения байткода CPython11541155В Python 3.6 был внесён ряд серьёзных изменений в [байткод](https://python-all.ru/3/glossary.html#term-bytecode).11561157- Интерпретатор Python теперь использует 16-битный wordcode вместо байткода. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в [bpo-26647](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-28050](https://python-all.ru/3/whatsnew/3.6.html).)1158- Новые опкоды `FORMAT_VALUE` и [`BUILD_STRING`](https://python-all.ru/3/library/dis.html#opcode-BUILD_STRING) как часть реализации [форматированных строковых литералов](https://python-all.ru/3/whatsnew/3.6.html#whatsnew36-pep498). (Автор: Eric Smith в [bpo-25483](https://python-all.ru/3/whatsnew/3.6.html) и Serhiy Storchaka в [bpo-27078](https://python-all.ru/3/whatsnew/3.6.html).)1159- Новый опкод `BUILD_CONST_KEY_MAP` для оптимизации создания словарей с постоянными ключами. (Автор: Serhiy Storchaka в [bpo-27140](https://python-all.ru/3/whatsnew/3.6.html).)1160- Опкоды вызова функций были существенно переработаны для повышения производительности и упрощения реализации. Опкоды [`MAKE_FUNCTION`](https://python-all.ru/3/library/dis.html#opcode-MAKE_FUNCTION), `CALL_FUNCTION`, `CALL_FUNCTION_KW` и `BUILD_MAP_UNPACK_WITH_CALL` были изменены, добавлены новые [`CALL_FUNCTION_EX`](https://python-all.ru/3/library/dis.html#opcode-CALL_FUNCTION_EX) и `BUILD_TUPLE_UNPACK_WITH_CALL`, а опкоды `CALL_FUNCTION_VAR`, `CALL_FUNCTION_VAR_KW` и `MAKE_CLOSURE` удалены. (Автор: Demur Rumed в [bpo-27095](https://python-all.ru/3/whatsnew/3.6.html), и Serhiy Storchaka в [bpo-27213](https://python-all.ru/3/whatsnew/3.6.html), [bpo-28257](https://python-all.ru/3/whatsnew/3.6.html).)1161- Добавлены новые опкоды [`SETUP_ANNOTATIONS`](https://python-all.ru/3/library/dis.html#opcode-SETUP_ANNOTATIONS) и `STORE_ANNOTATION` для поддержки нового синтаксиса [аннотаций переменных](https://python-all.ru/3/glossary.html#term-variable-annotation). (Автор: Ivan Levkivskyi в [bpo-27985](https://python-all.ru/3/whatsnew/3.6.html).)11621163## Заметные изменения в Python 3.6.211641165### Новая `make regen-all` цель сборки11661167Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\\nсобрать без необходимости уже иметь установленную версию Python,\\nсистема сборки на основе autotools больше не пытается неявно\\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.11681169Вместо этого была добавлена новая команда `make regen-all` для принудительной\\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\\nбыла собрана на основе предварительно сгенерированных версий).11701171Также определены более выборочные цели регенерации – подробнее см.\\n[Makefile.pre.in](https://python-all.ru/src/3.14/Makefile.pre.in).11721173(Предложено Victor Stinner в [bpo-23404](https://python-all.ru/3/whatsnew/3.6.html).)11741175Добавлено в версии 3.6.2.11761177### Удаление `make touch` цели сборки11781179Цель сборки `make touch`, ранее использовавшаяся для запроса неявной перегенерации\\nсгенерированных файлов путем обновления времени их изменения, была удалена.11801181Она заменена новой целью `make regen-all`.11821183(Предложено Victor Stinner в [bpo-23404](https://python-all.ru/3/whatsnew/3.6.html).)11841185Изменено в версии 3.6.2.11861187## Заметные изменения в Python 3.6.411881189Синглтон `PyExc_RecursionErrorInst`, который был частью публичного API, удалён, поскольку его члены никогда не очищались и могли вызвать segfault при завершении работы интерпретатора. (Автор: Xavier de Gaye в [bpo-22898](https://python-all.ru/3/whatsnew/3.6.html) и [bpo-30697](https://python-all.ru/3/whatsnew/3.6.html).)11901191## Заметные изменения в Python 3.6.511921193Функция [`locale.localeconv()`](https://python-all.ru/3/library/locale.html#locale.localeconv) теперь временно устанавливает локаль `LC_CTYPE` в локаль `LC_NUMERIC` в некоторых случаях. (Автор: Victor Stinner в [bpo-31900](https://python-all.ru/3/whatsnew/3.6.html).)11941195## Заметные изменения в Python 3.6.711961197Модули [`xml.dom.minidom`](https://python-all.ru/3/library/xml.dom.minidom.html#module-xml.dom.minidom) и [`xml.sax`](https://python-all.ru/3/library/xml.sax.html#module-xml.sax) больше не обрабатывают внешние сущности по умолчанию. См. также [gh-61441](https://python-all.ru/3/whatsnew/3.6.html).11981199В 3.6.7 модуль [`tokenize`](https://python-all.ru/3/library/tokenize.html#module-tokenize) теперь неявно генерирует токен `NEWLINE`, когда на вход подаётся строка без завершающего перевода строки. Это поведение теперь соответствует тому, что делает внутренний токенизатор C. (Автор: Ammar Askar в [bpo-33899](https://python-all.ru/3/whatsnew/3.6.html).)12001201## Заметные изменения в Python 3.6.1012021203Из-за серьёзных проблем безопасности параметр *reuse\_address* функции [`asyncio.loop.create_datagram_endpoint()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_datagram_endpoint) больше не поддерживается. Это связано с поведением опции сокета `SO_REUSEADDR` в UDP. Подробнее см. в документации `loop.create_datagram_endpoint()`. (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в [bpo-37228](https://python-all.ru/3/whatsnew/3.6.html).)12041205## Заметные изменения в Python 3.6.1312061207В ранних версиях Python допускалось использование обоих символов `;` и `&` в качестве разделителей параметров запроса в [`urllib.parse.parse_qs()`](https://python-all.ru/3/library/urllib.parse.html#urllib.parse.parse_qs) и [`urllib.parse.parse_qsl()`](https://python-all.ru/3/library/urllib.parse.html#urllib.parse.parse_qsl). Из соображений безопасности и для соответствия новым рекомендациям W3C было изменено так, чтобы разрешался только один символ-разделитель, по умолчанию `&`. Это изменение также затрагивает `cgi.parse()` и `cgi.parse_multipart()`, поскольку они внутренне используют затронутые функции. Подробнее см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в [bpo-42967](https://python-all.ru/3/whatsnew/3.6.html).)12081209## Заметные изменения в Python 3.6.1412101211Исправление безопасности изменяет поведение [`ftplib.FTP`](https://python-all.ru/3/library/ftplib.html#ftplib.FTP): теперь не доверяется IPv4-адрес, отправленный удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для нестандартного кода, требующего старого поведения, установите атрибут `trust_server_pasv_ipv4_address` на вашем экземпляре FTP в значение `True`. (См. [gh-87451](https://python-all.ru/3/whatsnew/3.6.html))12121213Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. В соответствии со спецификацией WHATWG, обновляющей RFC 3986, символы ASCII перевода строки `\n`, `\r` и табуляции `\t` удаляются из URL парсером [`urllib.parse()`](https://python-all.ru/3/library/urllib.parse.html#module-urllib.parse), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (См. [gh-88048](https://python-all.ru/3/whatsnew/3.6.html))1214