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

Что нового в Python 3.6What’s New In Python 3.6

Редакторы:

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

В этой статье объясняются новые возможности Python 3.6 по сравнению с 3.5. Python 3.6 выпущен 23 декабря 2016 г. Полный список изменений см. в журнале изменений.

См. также

PEP 494 – График выпуска Python 3.6

Итоги – основные измененияSummary – Release highlights

Новые синтаксические возможности:

  • PEP 498, форматированные строковые литералы.

  • PEP 515, символы подчёркивания в числовых литералах.

  • PEP 526, синтаксис аннотаций переменных.

  • PEP 525, асинхронные генераторы.

  • PEP 530: асинхронные включения.

Новые модули библиотеки:

Улучшения реализации CPython:

Значительные улучшения в стандартной библиотеке:

  • Модуль asyncio получил новые возможности, значительные улучшения удобства использования и производительности, а также изрядное количество исправлений ошибок. Начиная с Python 3.6 модуль asyncio больше не является экспериментальным и его API считается стабильным.

  • Новый протокол путей файловой системы был реализован для поддержки путеподобных объектов. Все функции стандартной библиотеки, работающие с путями, были обновлены для работы с новым протоколом.

  • Модуль datetime получил поддержку устранения неоднозначности местного времени.

  • Модуль typing получил ряд улучшений.

  • Модуль tracemalloc был значительно переработан и теперь используется для обеспечения лучшего вывода для ResourceWarning, а также для обеспечения лучшей диагностики ошибок выделения памяти. Смотрите раздел PYTHONMALLOC для получения дополнительной информации.

Улучшения в области безопасности:

  • Новый модуль secrets был добавлен для упрощения генерации криптографически стойких псевдослучайных чисел, подходящих для управления секретами, такими как аутентификация учётных записей, токены и т.п.

  • В Linux os.urandom() теперь ожидает инициализации пула энтропии системного urandom для повышения безопасности. Смотрите PEP 524 для обоснования.

  • Модули hashlib и ssl теперь поддерживают OpenSSL 1.1.0.

  • Настройки по умолчанию и набор функций модуля ssl были улучшены.

  • Модуль hashlib получил поддержку алгоритмов хеширования BLAKE2, SHA-3 и SHAKE и функции выработки ключа scrypt().

Улучшения для Windows:

  • PEP 528 и PEP 529 – кодировка файловой системы и консоли Windows изменена на UTF-8.

  • Загрузчик py.exe при интерактивном использовании больше не предпочитает Python 2 вместо Python 3, если пользователь не указывает версию (через аргументы командной строки или конфигурационный файл). Обработка строк shebang остаётся без изменений – в этом случае “python” относится к Python 2.

  • python.exe и pythonw.exe были помечены как поддерживающие длинные пути, что означает, что ограничение в 260 символов на путь может больше не применяться. Смотрите снятие ограничения MAX_PATH для получения подробной информации.

  • Файл ._pth можно добавить, чтобы принудительно включить изолированный режим и полностью задать все пути поиска, избегая поиска в реестре и окружении. Смотрите документацию для получения дополнительной информации.

  • Файл python36.zip теперь служит ориентиром для определения PYTHONHOME. Смотрите документацию для получения дополнительной информации.

Новые возможностиNew Features

PEP 498: Форматированные строковые литералыPEP 498: Formatted string literals

PEP 498 вводит новый вид строковых литералов: f-строки, или форматированные строковые литералы.

Форматированные строковые литералы имеют префикс 'f' и аналогичны строкам формата, принимаемым str.format(). Они содержат поля замены, заключённые в фигурные скобки. Поля замены – это выражения, которые вычисляются во время выполнения, а затем форматируются с использованием протокола format():

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # вложенные поля
'result:      12.35'

См. также

PEP 498 – Интерполяция строковых литералов.

PEP написан и реализован Eric V. Smith.

Документация по возможностям.

PEP 526: Синтаксис аннотаций переменныхPEP 526: Syntax for variable annotations

PEP 484 ввёл стандарт для аннотаций типов параметров функций, также известных как подсказки типов. Этот PEP добавляет в Python синтаксис для аннотации типов переменных, включая переменные классов и экземпляров:

primes: List[int] = []

captain: str  # Примечание: нет начального значения!

class Starship:
    stats: Dict[str, int] = {}

Как и в случае аннотаций функций, интерпретатор Python не придаёт никакого особого значения аннотациям переменных и просто хранит их в атрибуте __annotations__ класса или модуля.

В отличие от объявлений переменных в статически типизированных языках, цель синтаксиса аннотаций – предоставить простой способ задания структурированных метаданных типов для сторонних инструментов и библиотек через абстрактное синтаксическое дерево и атрибут __annotations__.

См. также

PEP 526 – Синтаксис аннотаций переменных.

PEP написан Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach, и Guido van Rossum. Реализован Ivan Levkivskyi.

Инструменты, которые используют или будут использовать новый синтаксис: mypy, pytype, PyCharm и др.

PEP 515: Подчёркивания в числовых литералахPEP 515: Underscores in Numeric Literals

PEP 515 добавляет возможность использовать подчёркивания в числовых литералах для улучшения читаемости. Например:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

Одиночные подчёркивания допускаются между цифрами и после указателя основания. Ведущие, завершающие или несколько подряд идущих подчёркиваний не допускаются.

Язык строкового форматирования теперь также поддерживает опцию '_' для обозначения использования подчёркивания в качестве разделителя тысяч для типов представления с плавающей запятой и для целочисленного типа представления 'd'. Для целочисленных типов представления 'b', 'o', 'x' и 'X' подчёркивания будут вставляться каждые 4 цифры:

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

См. также

PEP 515 – Подчёркивания в числовых литералах

PEP написан Георгом Брандлем и Сергием Сторчакой.

PEP 525: Асинхронные генераторыPEP 525: Asynchronous Generators

PEP 492 ввёл поддержку нативных корутин и синтаксиса async / await в Python 3.5. Заметным ограничением реализации Python 3.5 было то, что нельзя было использовать await и yield в одном теле функции. В Python 3.6 это ограничение было снято, что позволило определять асинхронные генераторы:

async def ticker(delay, to):
    """Генерирует числа от 0 до *to* каждые *delay* секунд."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

Новый синтаксис позволяет писать более быстрый и лаконичный код.

См. также

PEP 525 – Асинхронные генераторы

PEP написан и реализован Юрием Селивановым.

PEP 530: Асинхронные включенияPEP 530: Asynchronous Comprehensions

PEP 530 добавляет поддержку использования async for в списочных, множественных, словарных включениях и генераторных выражениях:

result = [i async for i in aiter() if i % 2]

Кроме того, выражения await поддерживаются во всех видах включений:

result = [await fun() for fun in funcs if await condition()]

См. также

PEP 530 – Асинхронные включения

PEP написан и реализован Юрием Селивановым.

PEP 487: Упрощённая настройка создания классовPEP 487: Simpler customization of class creation

Теперь можно настраивать создание подклассов без использования метакласса. Новый метод класса __init_subclass__ будет вызываться на базовом классе при создании каждого нового подкласса:

class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass

Чтобы вызовы super() без аргументов корректно работали в реализациях __init_subclass__(), пользовательские метаклассы должны гарантировать, что новая запись пространства имён __classcell__ передаётся в type.__new__ (как описано в Создание объекта класса).

См. также

PEP 487 – Упрощённая настройка создания классов

PEP написан и реализован Мартином Тайхманом.

Документация по функции

PEP 487: Улучшения протокола дескрипторовPEP 487: Descriptor Protocol Enhancements

PEP 487 расширяет протокол дескрипторов, добавляя новый необязательный метод __set_name__(). При каждом определении нового класса этот новый метод будет вызываться на всех дескрипторах, включённых в определение, предоставляя им ссылку на определяемый класс и имя, данное дескриптору в пространстве имён класса. Другими словами, экземпляры дескрипторов теперь могут знать имя атрибута дескриптора в классе-владельце:

class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in {self.name}')
        instance.__dict__[self.name] = value

    # это новый инициализатор:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()

См. также

PEP 487 – Упрощённая настройка создания классов

PEP написан и реализован Мартином Тайхманом.

Документация по функции

PEP 519: Добавление протокола путей файловой системыPEP 519: Adding a file system path protocol

Пути файловой системы исторически представлялись как объекты str или bytes. Это привело к тому, что разработчики кода, работающего с путями файловой системы, предполагают, что такие объекты относятся только к одному из этих двух типов (int, представляющий файловый дескриптор, не считается, так как это не путь к файлу). К сожалению, такое предположение мешает альтернативным объектным представлениям путей файловой системы, таким как pathlib, работать с существующим кодом, включая стандартную библиотеку Python.

Чтобы исправить эту ситуацию, был определён новый интерфейс, представленный os.PathLike. Реализуя метод __fspath__(), объект сигнализирует, что он представляет путь. Затем объект может предоставить низкоуровневое представление пути файловой системы в виде объекта str или bytes. Это означает, что объект считается путеподобным, если он реализует os.PathLike или является объектом str или bytes, который представляет путь файловой системы. Код может использовать os.fspath(), os.fsdecode() или os.fsencode() для явного получения представления str и/или bytes путеподобного объекта.

Встроенная функция open() была обновлена для принятия объектов os.PathLike, как и все соответствующие функции в модулях os и os.path, а также большинство других функций и классов в стандартной библиотеке. Класс os.DirEntry и соответствующие классы в pathlib также были обновлены для реализации os.PathLike.

Надеемся, что обновление фундаментальных функций для работы с путями файловой системы приведёт к тому, что сторонний код будет неявно поддерживать все путеподобные объекты без каких-либо изменений кода или, по крайней мере, с минимальными (например, вызов os.fspath() в начале кода перед работой с путеподобным объектом).

Вот несколько примеров того, как новый интерфейс позволяет использовать pathlib.Path проще и прозрачнее с существующим кодом:

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(Реализовано Бреттом Кэнноном, Итаном Фурманом, Дасти Филлипсом и Йелле Зейлстрой.)

См. также

PEP 519 – Добавление протокола путей файловой системы

PEP написан Бреттом Кэнноном и Кусом Зевенховеном.

PEP 495: Устранение неоднозначности местного времениPEP 495: Local Time Disambiguation

В большинстве регионов мира были и будут моменты, когда местные часы переводятся назад. В такие моменты возникают интервалы, в течение которых местные часы показывают одно и то же время дважды за день. В этих ситуациях информации, отображаемой на местных часах (или хранящейся в экземпляре Python datetime), недостаточно для идентификации конкретного момента времени.

PEP 495 добавляет новый атрибут fold к экземплярам классов datetime.datetime и datetime.time, чтобы различать два момента времени, для которых местные времена одинаковы:

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

Значения атрибута fold имеют значение 0 для всех экземпляров, кроме тех, которые представляют второй (хронологически) момент времени в неоднозначном случае.

См. также

PEP 495 – Устранение неоднозначности местного времени

PEP написан Александром Белопольским и Тимом Питерсом, реализация – Александром Белопольским.

PEP 529: Изменение кодировки файловой системы Windows на UTF-8PEP 529: Change Windows filesystem encoding to UTF-8

Представление путей файловой системы лучше всего выполнять с помощью str (Unicode), а не bytes. Однако есть ситуации, когда использование bytes достаточно и корректно.

До Python 3.6 использование путей в виде bytes в Windows могло приводить к потере данных. Благодаря этому изменению использование bytes для представления путей теперь поддерживается в Windows при условии, что эти bytes закодированы с помощью кодировки, возвращаемой sys.getfilesystemencoding(), которая теперь по умолчанию равна 'utf-8'.

Приложения, не использующие str для представления путей, должны использовать os.fsencode() и os.fsdecode(), чтобы гарантировать правильную кодировку их bytes. Чтобы вернуть предыдущее поведение, установите PYTHONLEGACYWINDOWSFSENCODING или вызовите sys._enablelegacywindowsfsencoding().

См. PEP 529 для получения дополнительной информации и обсуждения возможных изменений кода.

PEP 528: Изменение кодировки консоли Windows на UTF-8PEP 528: Change Windows console encoding to UTF-8

Консоль по умолчанию в Windows теперь принимает все символы Unicode и предоставляет корректно прочитанные объекты str для кода Python. sys.stdin, sys.stdout и sys.stderr теперь по умолчанию используют кодировку utf-8.

Это изменение применяется только при использовании интерактивной консоли, а не при перенаправлении файлов или каналов. Чтобы вернуть предыдущее поведение для интерактивной консоли, установите PYTHONLEGACYWINDOWSSTDIO.

См. также

PEP 528 – Изменение кодировки консоли Windows на UTF-8

PEP написан и реализован Стивом Дауэром.

PEP 520: Сохранение порядка определения атрибутов классаPEP 520: Preserving Class Attribute Definition Order

Атрибуты в теле определения класса имеют естественный порядок: тот же порядок, в котором имена появляются в исходном коде. Этот порядок теперь сохраняется в атрибуте __dict__ нового класса.

Кроме того, действующее пространство имён execution класса по умолчанию (возвращаемое из type.__prepare__()) теперь является отображением, сохраняющим порядок вставки.

См. также

PEP 520 – Сохранение порядка определения атрибутов класса

PEP написан и реализован Эриком Сноу.

PEP 468: Сохранение порядка именованных аргументовPEP 468: Preserving Keyword Argument Order

**kwargs в сигнатуре функции теперь гарантированно является отображением, сохраняющим порядок вставки.

См. также

PEP 468 – Сохранение порядка именованных аргументов

PEP написан и реализован Эриком Сноу.

Новая dict реализацияNew dict implementation

Тип dict теперь использует «компактное» представление, основанное на предложении Рэймонда Хеттингера, которое было впервые реализовано в PyPy. Потребление памяти нового dict() на 20–25% меньше по сравнению с Python 3.5.

Аспект сохранения порядка в этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно, чтобы эта новая реализация dict побыла в языке несколько релизов, прежде чем менять спецификацию языка, чтобы требовать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где всё ещё действует случайный порядок итерации, например, Python 3.5).

(Автор: INADA Naoki в bpo-27350. Идея изначально предложена Рэймондом Хеттингером.)

PEP 523: Добавление API для оценки фреймов в CPythonPEP 523: Adding a frame evaluation API to CPython

Хотя Python предоставляет широкие возможности для настройки выполнения кода, одним из мест, где этого не было, является оценка объектов фреймов. Если требовался способ перехвата оценки фреймов в Python, то без прямого манипулирования указателями на функции для определённых функций его не было.

PEP 523 меняет это, предоставляя API для подключения оценки фреймов на уровне C. Это позволит таким инструментам, как отладчики и JIT-компиляторы, перехватывать оценку фреймов до начала выполнения кода Python. Это даёт возможность использовать альтернативные реализации оценки для кода Python, отслеживание оценки фреймов и т.д.

Это API не является частью ограниченного C API и помечено как приватное, чтобы указать, что его использование предполагается ограниченным и применимым только к очень специфическим низкоуровневым сценариям. Семантика API будет меняться по мере необходимости вместе с Python.

См. также

PEP 523 – Добавление API оценки фреймов в CPython

PEP написан Бреттом Кэнноном и Дино Вилендом.

Переменная окружения PYTHONMALLOCPYTHONMALLOC environment variable

Новая переменная окружения PYTHONMALLOC позволяет настраивать распределители памяти Python и устанавливать отладочные перехватчики.

Теперь можно устанавливать отладочные перехватчики на распределители памяти Python в Python, скомпилированном в режиме выпуска, с помощью PYTHONMALLOC=debug. Эффекты отладочных перехватчиков:

  • Вновь выделенная память заполняется байтом 0xCB

  • Освобождённая память заполняется байтом 0xDB

  • Обнаружение нарушений API распределителя памяти Python. Например, PyObject_Free() вызывается для блока памяти, выделенного через PyMem_Malloc().

  • Обнаружение записи до начала буфера (недополнение буфера)

  • Обнаружение записи после конца буфера (переполнение буфера)

  • Проверка, удерживается ли GIL при вызове функций распределителя доменов PYMEM_DOMAIN_OBJ (например, PyObject_Malloc()) и PYMEM_DOMAIN_MEM (например, PyMem_Malloc()).

Проверка удержания GIL – также новая возможность Python 3.6.

Смотрите функцию PyMem_SetupDebugHooks() для отладочных перехватчиков на распределителях памяти Python.

Теперь также можно принудительно использовать распределитель malloc() библиотеки C для всех выделений памяти Python с помощью PYTHONMALLOC=malloc. Это полезно при использовании внешних отладчиков памяти, таких как Valgrind, для Python, скомпилированного в режиме выпуска.

При ошибке отладочные перехватчики на распределителях памяти Python теперь используют модуль tracemalloc для получения трассировки стека, где был выделен блок памяти.

Пример фатальной ошибки при переполнении буфера с использованием python3.6 -X tracemalloc=5 (сохранять 5 фреймов в трассировках):

Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 для отладки malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...

(Автор: Victor Stinner в bpo-26516 и bpo-26564.)

Поддержка зондов DTrace и SystemTapDTrace and SystemTap probing support

Python теперь может быть собран с --with-dtrace, что включает статические маркеры для следующих событий в интерпретаторе:

  • вызов/возврат функции

  • начало/завершение сборки мусора

  • выполнение строки кода.

Это можно использовать для инструментирования работающих интерпретаторов в производственной среде без необходимости перекомпиляции отладочных сборок или написания прикладного кода профилирования/отладки.

Подробнее в Инструментирование CPython с помощью DTrace и SystemTap.

Текущая реализация протестирована на Linux и macOS. В будущем могут быть добавлены дополнительные маркеры.

(Автор: Łukasz Langa в bpo-21590, на основе патчей Jesús Cea Avión, David Malcolm и Nikhil Benesch.)

Другие изменения языкаOther Language Changes

Некоторые более мелкие изменения в ядре языка Python:

  • Оператор global или nonlocal теперь должен текстуально располагаться до первого использования затрагиваемого имени в той же области видимости. Ранее это было SyntaxWarning.

  • Теперь можно задать специальный метод как None, чтобы указать, что соответствующая операция недоступна. Например, если в классе установить __iter__() в None, класс не будет итерируемым. (Авторы: Andrew Barnert и Ivan Levkivskyi в bpo-25958.)

  • Длинные последовательности повторяющихся строк трассировки теперь сокращаются как "[Previous line repeated {count} more times]" (пример см. в traceback). (Автор: Emanuel Barry в bpo-26823.)

  • Теперь при импорте, если модуль не найден, вызывается новое исключение ModuleNotFoundError (подкласс ImportError). Код, который сейчас проверяет ImportError (в try-except), по-прежнему будет работать. (Автор: Eric Snow в bpo-15767.)

  • Методы класса, которые полагаются на вызов super() без аргументов, теперь будут работать корректно при вызове из методов метакласса во время создания класса. (Автор: Martin Teichmann в bpo-23722.)

Новые модулиNew Modules

secrets

Основная цель нового модуля secrets – предоставить очевидный способ надёжной генерации криптостойких псевдослучайных значений, подходящих для управления секретами, такими как аутентификация учётных записей, токены и т.п.

Предупреждение

Обратите внимание, что псевдослучайные генераторы в модуле random НЕ должны использоваться для целей безопасности. Используйте secrets на Python 3.6+ и os.urandom() на Python 3.5 и более ранних версиях.

См. также

PEP 506 – Добавление модуля Secrets в стандартную библиотеку

PEP написан и реализован Steven D’Aprano.

Улучшенные модулиImproved Modules

array

Исчерпанные итераторы array.array теперь остаются исчерпанными, даже если итерируемый массив расширен. Это соответствует поведению других изменяемых последовательностей.

Автор: Serhiy Storchaka в bpo-26492.

ast

Добавлен новый узел AST ast.Constant. Он может использоваться внешними оптимизаторами AST для целей свёртывания констант.

Автор: Victor Stinner в bpo-26146.

asyncio

Начиная с Python 3.6, модуль asyncio больше не является временным, и его API считается стабильным.

Заметные изменения в модуле asyncio, начиная с Python 3.5.0 (все перенесены в 3.5.x из-за временного статуса):

  • Функция get_event_loop() изменена так, чтобы всегда возвращать текущий выполняющийся цикл событий при вызове из корутин и колбэков. (Автор: Yury Selivanov в bpo-28613.)

  • Функция ensure_future() и все функции, которые её используют, такие как loop.run_until_complete(), теперь принимают все виды ожидаемых объектов. (Автор: Yury Selivanov.)

  • Новая функция run_coroutine_threadsafe() для отправки корутин в циклы событий из других потоков. (Автор: Vincent Michel.)

  • Новый метод Transport.is_closing() для проверки, закрывается ли транспорт или уже закрыт. (Автор: Yury Selivanov.)

  • Метод loop.create_server() теперь может принимать список хостов. (Автор: Yann Sionneau.)

  • Новый метод loop.create_future() для создания объектов Future. Это позволяет альтернативным реализациям цикла событий, таким как uvloop, предоставлять более быструю реализацию asyncio.Future. (Автор: Yury Selivanov в bpo-27041.)

  • Новый метод loop.get_exception_handler() для получения текущего обработчика исключений. (Автор: Yury Selivanov в bpo-27040.)

  • Новый метод StreamReader.readuntil() для чтения данных из потока до появления последовательности байтов-разделителей. (Автор: Mark Korenberg.)

  • Производительность StreamReader.readexactly() улучшена. (Автор: Mark Korenberg в bpo-28370.)

  • Метод loop.getaddrinfo() оптимизирован, чтобы избегать вызова системной функции getaddrinfo, если адрес уже разрешён. (Автор: A. Jesse Jiryu Davis.)

  • Метод loop.stop() изменён: теперь он останавливает цикл сразу после текущей итерации. Любые новые колбэки, запланированные в результате последней итерации, будут отброшены. (Автор: Guido van Rossum в bpo-25593.)

  • Future.set_exception теперь будет вызывать TypeError, если ему передать экземпляр исключения StopIteration. (Автор: Chris Angelico в bpo-26221.)

  • Новый метод loop.connect_accepted_socket() предназначен для серверов, которые принимают соединения вне asyncio, но используют asyncio для их обработки. (Предложено Джимом Фултоном в bpo-27392.)

  • Флаг TCP_NODELAY теперь по умолчанию устанавливается для всех TCP-транспортов. (Предложено Юрием Селивановым в bpo-27456.)

  • Новый loop.shutdown_asyncgens() для корректного закрытия ожидающих асинхронных генераторов перед закрытием цикла. (Предложено Юрием Селивановым в bpo-28003.)

  • Классы Future и Task теперь имеют оптимизированную реализацию на C, что ускоряет код asyncio до 30%. (Предложено Юрием Селивановым и Инадой Наоки в bpo-26081 и bpo-28544.)

binascii

Функция b2a_base64() теперь принимает необязательный именованный аргумент newline, управляющий добавлением символа новой строки к возвращаемому значению. (Предложено Виктором Стиннером в bpo-25357.)

cmath

Добавлена новая константа cmath.tau (τ). (Предложено Лизой Роуч в bpo-12345; подробнее см. PEP 628.)

Новые константы: cmath.inf и cmath.nan, соответствующие math.inf и math.nan, а также cmath.infj и cmath.nanj, соответствующие формату представления complex. (Предложено Марком Дикинсоном в bpo-23229.)

collections

Добавлен новый абстрактный базовый класс Collection для представления размерных итерируемых классов-контейнеров. (Предложено Иваном Левкивским, документация – Нил Гирдхар в bpo-27598.)

Новый абстрактный базовый класс Reversible представляет итерируемые классы, которые также предоставляют метод __reversed__(). (Предложено Иваном Левкивским в bpo-25987.)

Новый абстрактный базовый класс AsyncGenerator представляет асинхронные генераторы. (Предложено Юрием Селивановым в bpo-28720.)

Функция namedtuple() теперь принимает необязательный именованный аргумент module, который при указании используется для атрибута __module__ возвращаемого класса именованного кортежа. (Предложено Рэймондом Хеттингером в bpo-17941.)

Аргументы verbose и rename для namedtuple() теперь являются только именованными. (Предложено Рэймондом Хеттингером в bpo-25628.)

Рекурсивные экземпляры collections.deque теперь можно сериализовать с помощью модуля pickle. (Предложено Сергеем Сторчакой в bpo-26482.)

concurrent.futures

Конструктор класса ThreadPoolExecutor теперь принимает необязательный аргумент thread_name_prefix, позволяющий настраивать имена потоков, создаваемых пулом. (Предложено Грегори П. Смитом в bpo-27664.)

contextlib

Добавлен класс contextlib.AbstractContextManager, предоставляющий абстрактный базовый класс для контекстных менеджеров. Он содержит разумную реализацию по умолчанию для __enter__(), которая возвращает self и оставляет __exit__() абстрактным методом. Соответствующий класс добавлен в модуль typing как typing.ContextManager. (Предложено Бреттом Кэнноном в bpo-25609.)

datetime

Классы datetime и time получили новый атрибут fold, используемый для устранения неоднозначности местного времени при необходимости. Многие функции в datetime были обновлены для поддержки разрешения неоднозначности местного времени. Подробнее см. раздел Local Time Disambiguation. (Предложено Александром Белопольским в bpo-24773.)

Методы datetime.strftime() и date.strftime() теперь поддерживают директивы даты ISO 8601 %G, %u и %V. (Предложено Эшли Андерсоном в bpo-12006.)

Функция datetime.isoformat() теперь принимает необязательный аргумент timespec, указывающий количество дополнительных компонентов значения времени для включения. (Предложено Алессандро Куччи и Александром Белопольским в bpo-19475.)

datetime.combine() теперь принимает необязательный аргумент tzinfo. (Предложено Александром Белопольским в bpo-27661.)

decimal

Новый метод Decimal.as_integer_ratio(), возвращающий пару (n, d) целых чисел, представляющих заданный экземпляр Decimal в виде дроби, сокращенной до несократимых членов и с положительным знаменателем:

>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)

(Предложено Стефаном Кра и Марком Дикинсоном в bpo-25928.)

distutils

Атрибут default_format удалён из distutils.command.sdist.sdist, а атрибут formats по умолчанию равен ['gztar']. Хотя это не ожидалось, любой код, полагающийся на наличие default_format, возможно, потребуется адаптировать. Подробнее см. bpo-27819.

email

Новый почтовый API, включаемый с помощью ключевого слова policy в различных конструкторах, больше не является предварительным. Документация email была реорганизована и переписана с упором на новый API, при этом сохранена старая документация для устаревшего API. (Предложено Р. Дэвидом Мюрреем в bpo-24277.)

Все классы email.mime теперь принимают необязательный параметр policy. (Автор: Berker Peksag в bpo-27331.)

Теперь DecodedGenerator поддерживает ключевой аргумент policy.

Появился новый атрибут policy, message_factory, который определяет, какой класс используется по умолчанию, когда парсер создаёт новые объекты сообщений. Для политики email.policy.compat32 это Message, для новых политик – EmailMessage. (Автор: R. David Murray в bpo-20476.)

encodings

В Windows добавлена кодировка 'oem', использующая CP_OEMCP, а также псевдоним 'ansi' для существующей кодировки 'mbcs', которая использует кодовую страницу CP_ACP. (Автор: Steve Dower в bpo-27959.)

enum

В модуль enum добавлены два новых базовых класса перечислений: Flag и IntFlag. Оба используются для определения констант, которые можно комбинировать с помощью побитовых операторов. (Автор: Ethan Furman в bpo-23591.)

Многие модули стандартной библиотеки были обновлены: теперь они используют класс IntFlag для своих констант.

Новое значение enum.auto можно использовать для автоматического присвоения значений элементам перечисления:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

faulthandler

В Windows модуль faulthandler теперь устанавливает обработчик для исключений Windows: см. faulthandler.enable(). (Автор: Victor Stinner в bpo-23848.)

fileinput

hook_encoded() теперь поддерживает аргумент errors. (Автор: Joseph Hackman в bpo-25788.)

hashlib

hashlib поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2. (Автор: Christian Heimes в bpo-26470.)

В модуль добавлены хеш-функции BLAKE2. blake2b() и blake2s() всегда доступны и поддерживают полный набор возможностей BLAKE2. (Автор: Christian Heimes в bpo-26798 на основе кода Dmitry Chestnykh и Samuel Neves. Документация написана Dmitry Chestnykh.)

Добавлены хеш-функции SHA-3 sha3_224(), sha3_256(), sha3_384(), sha3_512() и хеш-функции SHAKE shake_128() и shake_256(). (Автор: Christian Heimes в bpo-16113. Пакет кода Keccak от Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche и Ronny Van Keer.)

Функция получения ключа на основе пароля scrypt() теперь доступна в OpenSSL 1.1.0 и новее. (Автор: Christian Heimes в bpo-27928.)

http.client

HTTPConnection.request() и endheaders() теперь оба поддерживают кодирование передаваемых частями (chunked encoding) тел запросов. (Авторы: Demian Brecht и Rolf Krahl в bpo-12319.)

idlelib and IDLE

Пакет idlelib модернизируется и рефакторится, чтобы улучшить внешний вид и работу IDLE, а также сделать код более понятным, тестируемым и улучшаемым. Часть улучшений внешнего вида, особенно на Linux и Mac, заключается в использовании виджетов ttk, в основном в диалоговых окнах. В результате IDLE больше не работает с tcl/tk 8.4. Теперь требуется tcl/tk 8.5 или 8.6. Рекомендуется использовать последнюю версию любого из них.

«Модернизация» включает переименование и консолидацию модулей idlelib. Переименование файлов с частично заглавными именами похоже на переименование, например, Tkinter и TkFont в tkinter и tkinter.font в версии 3.0. В результате импорты файлов idlelib, которые работали в 3.5, обычно не будут работать в 3.6. Как минимум потребуется изменить имя модуля (см. idlelib/README.txt), иногда и больше. (Изменения имён выполнены Al Swiegart и Terry Reedy в bpo-24225. Большинство последующих и будущих патчей idlelib являются частью этого процесса.)

В качестве компенсации, конечным результатом станет то, что некоторые классы idlelib будут проще в использовании, с лучшими API и поясняющими их docstrings. Дополнительная полезная информация будет добавлена в idlelib, когда станет доступна.

Новое в версии 3.6.2:

Множественные исправления для автозавершения. (Автор: Louie Lu в bpo-15786.)

Новое в версии 3.6.3:

Обозреватель модулей (в меню File, ранее назывался Class Browser) теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Авторы: Guilherme Polo, Cheryl Sabella и Terry Jan Reedy в bpo-1612262.)

Функции IDLE, ранее реализованные как расширения, были переработаны как обычные функции. Их настройки перенесены с вкладки Extensions на другие вкладки диалоговых окон. (Авторы: Charles Wohlganger и Terry Jan Reedy в bpo-27099.)

Диалог настроек (Options, Configure IDLE) был частично переписан для улучшения как внешнего вида, так и функциональности. (Авторы: Cheryl Sabella и Terry Jan Reedy в нескольких задачах.)

Новое в версии 3.6.4:

Образец шрифта теперь включает набор нелатинских символов, чтобы пользователи могли лучше видеть эффект выбора конкретного шрифта. (Автор: Terry Jan Reedy в bpo-13802.) Образец можно редактировать, чтобы включить другие символы. (Автор: Serhiy Storchaka в bpo-31860.)

Новое в версии 3.6.6:

Параметр контекста кода редактора переработан. Окно отображает все строки контекста вплоть до maxlines. Щелчок по строке контекста перемещает редактор к этой строке. Цвета контекста для настраиваемых тем добавлены на вкладку «Подсветка» окна настроек. (Авторы: Cheryl Sabella и Terry Jan Reedy в bpo-33642, bpo-33768 и bpo-33679.)

В Windows новый вызов API сообщает Windows, что tk масштабируется под DPI. В Windows 8.1+ или 10, если свойства совместимости DPI двоичного файла Python не изменены и разрешение монитора больше 96 DPI, это должно сделать текст и линии более чёткими. В остальных случаях на работу не влияет. (Автор: Terry Jan Reedy в bpo-33656.)

Новое в версии 3.6.7:

Вывод длиннее N строк (по умолчанию 50) сжимается до одной кнопки. N можно изменить в разделе PyShell на вкладке «Общие» окна настроек. Меньшее количество строк, но возможно очень длинных, можно сжать, щёлкнув по выводу правой кнопкой мыши. Сжатый вывод можно развернуть на месте двойным щелчком по кнопке или отправить в буфер обмена или отдельное окно щелчком правой кнопкой. (Автор: Tal Einat в bpo-1529353.)

importlib

Импорт теперь вызывает новое исключение ModuleNotFoundError (подкласс ImportError), когда не может найти модуль. Код, который сейчас проверяет ImportError (в try-except), продолжит работать. (Автор: Eric Snow в bpo-15767.)

importlib.util.LazyLoader теперь вызывает create_module() для обёрнутого загрузчика, снимая ограничение, что importlib.machinery.BuiltinImporter и importlib.machinery.ExtensionFileLoader нельзя было использовать с importlib.util.LazyLoader.

importlib.util.cache_from_source(), importlib.util.source_from_cache() и importlib.util.spec_from_file_location() теперь принимают объект, подобный пути.

inspect

Функция inspect.signature() теперь сообщает о неявных параметрах .0, которые компилятор создаёт для областей видимости включений и выражений генераторов, так, как если бы это были позиционные параметры с именем implicit0. (Автор: Jelle Zijlstra в bpo-19611.)

Чтобы уменьшить объём изменений в коде при обновлении с Python 2.7 и устаревшего API inspect.getargspec(), ранее задокументированное объявление устаревшим inspect.getfullargspec() было отменено. Хотя эта функция удобна для единой кодовой базы Python 2/3, более богатый интерфейс inspect.signature() остаётся рекомендуемым подходом для нового кода. (Автор: Nick Coghlan в bpo-27172)

json

json.load() и json.loads() теперь поддерживают двоичный ввод. Закодированный JSON должен быть представлен в UTF-8, UTF-16 или UTF-32. (Автор: Serhiy Storchaka в bpo-17909.)

logging

Добавлен новый метод WatchedFileHandler.reopenIfNeeded(), предоставляющий возможность проверить, нужно ли переоткрыть файл журнала. (Автор: Marian Horban в bpo-24884.)

math

Константа тау (τ) добавлена в модули math и cmath. (Автор: Lisa Roach в bpo-12345; подробности см. в PEP 628.)

multiprocessing

Объекты-прокси, возвращаемые multiprocessing.Manager(), теперь могут быть вложенными. (Автор: Davin Potts в bpo-6766.)

os

Подробности о том, как модули os и os.path теперь поддерживают объекты, подобные пути, см. в описании PEP 519.

scandir() теперь поддерживает пути bytes в Windows.

Новый метод close() позволяет явно закрыть итератор scandir(). Итератор scandir() теперь поддерживает протокол менеджера контекста. Если итератор scandir() не исчерпан и не закрыт явно, в его деструкторе будет сгенерировано предупреждение ResourceWarning. (Автор: Serhiy Storchaka в bpo-25994.)

В Linux os.urandom() теперь блокируется до инициализации системного пула энтропии urandom для повышения безопасности. Обоснование см. в PEP 524.

Системный вызов Linux getrandom() (получить случайные байты) теперь доступен как новая функция os.getrandom(). (Автор: Victor Stinner, часть PEP 524)

pathlib

pathlib теперь поддерживает объекты, подобные пути. (Автор: Brett Cannon в bpo-27186.)

Подробности см. в описании PEP 519.

pdb

Конструктор класса Pdb получил новый необязательный аргумент readrc для управления тем, следует ли читать файлы .pdbrc.

pickle

Объекты, которым требуется __new__ с именованными аргументами, теперь можно сериализовать с помощью протоколов pickle старше версии 4 протокола. Версия 4 протокола уже поддерживает такой случай. (Вклад Serhiy Storchaka в bpo-24164.)

pickletools

pickletools.dis() теперь выводит неявный индекс memo для опкода MEMOIZE. (Вклад Serhiy Storchaka в bpo-25382.)

pydoc

Модуль pydoc научился учитывать переменную окружения MANPAGER. (Вклад Matthias Klose в bpo-8637.)

help() и pydoc теперь могут выводить поля именованных кортежей в порядке их определения, а не в алфавитном. (Вклад Raymond Hettinger в bpo-24879.)

random

Новая функция choices() возвращает список элементов заданного размера из указанной совокупности с возможностью указания весов. (Вклад Raymond Hettinger в bpo-18844.)

re

Добавлена поддержка модификаторов диапазонов в регулярных выражениях. Примеры: '(?i:p)ython' соответствует 'python' и 'Python', но не 'PYTHON'; '(?i)g(?-i:v)r' соответствует 'GvR' и 'gvr', но не 'GVR'. (Вклад Serhiy Storchaka в bpo-433028.)

К группам объекта сопоставления можно обращаться по __getitem__, что эквивалентно group(). Теперь mo['name'] эквивалентно mo.group('name'). (Вклад Eric Smith в bpo-24454.)

Объекты Match теперь поддерживают index-like objects в качестве индексов групп. (Вклад Jeroen Demeyer и Xiang Zhang в bpo-27177.)

readline

Добавлено set_auto_history() для включения или отключения автоматического добавления ввода в список истории. (Вклад Tyler Crompton в bpo-26870.)

rlcompleter

Закрытые и специальные имена атрибутов теперь опускаются, если только префикс не начинается с подчёркиваний. Пробел или двоеточие добавляется после некоторых завершённых ключевых слов. (Вклад Serhiy Storchaka в bpo-25011 и bpo-25209.)

shlex

Класс shlex получил значительно улучшенную совместимость с оболочкой благодаря новому аргументу punctuation_chars, который управляет тем, какие символы считаются знаками пунктуации. (Вклад Vinay Sajip в bpo-1521950.)

site

При указании путей для добавления в sys.path в файле .pth теперь можно указывать пути к файлам наряду с каталогами (например, zip-файлы). (Вклад Wolfgang Langner в bpo-26587).

sqlite3

sqlite3.Cursor.lastrowid теперь поддерживает оператор REPLACE. (Вклад Alex LordThorsen в bpo-16864.)

socket

Функция ioctl() теперь поддерживает управляющий код SIO_LOOPBACK_FAST_PATH. (Вклад Daniel Stokes в bpo-26536.)

Константы getsockopt(): SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC и SO_PASSSEC теперь поддерживаются. (Вклад Christian Heimes в bpo-26907.)

Функция setsockopt() теперь поддерживает форму setsockopt(level, optname, None, optlen: int). (Вклад Christian Heimes в bpo-27744.)

Модуль socket теперь поддерживает семейство адресов AF_ALG для взаимодействия с криптографическим API ядра Linux. Были добавлены ALG_*, SOL_ALG и sendmsg_afalg(). (Вклад Christian Heimes в bpo-27744 при поддержке Victor Stinner.)

Добавлены новые константы Linux TCP_USER_TIMEOUT и TCP_CONGESTION. (Вклад Omar Sandoval, bpo-26273).

socketserver

Серверы на основе модуля socketserver, включая определённые в http.server, xmlrpc.server и wsgiref.simple_server, теперь поддерживают протокол контекстного менеджера. (Вклад Aviv Palivoda в bpo-26404.)

Атрибут wfile классов StreamRequestHandler теперь реализует интерфейс io.BufferedIOBase для записи. В частности, вызов write() теперь гарантированно отправляет данные полностью. (Вклад Martin Panter в bpo-26721.)

ssl

ssl поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2. (Автор: Christian Heimes в bpo-26470.)

3DES удалён из набора шифров по умолчанию, добавлены наборы шифров ChaCha20 Poly1305. (Автор: Christian Heimes в bpo-27850 и bpo-27766.)

SSLContext имеет более качественную конфигурацию по умолчанию для опций и шифров. (Автор: Christian Heimes в bpo-28043.)

SSL-сессию можно скопировать из одного клиентского соединения в другое с помощью нового класса SSLSession. Возобновление TLS-сессии может ускорить начальное рукопожатие, уменьшить задержку и повысить производительность. (Автор: Christian Heimes в bpo-19500 на основе черновика Alex Warhawk.)

Новый метод get_ciphers() можно использовать для получения списка включённых шифров в порядке их приоритета.

Все константы и флаги преобразованы в IntEnum и IntFlag. (Автор: Christian Heimes в bpo-28025.)

Добавлены серверные и клиентские протоколы TLS для SSLContext. (Автор: Christian Heimes в bpo-28085.)

Добавлены ssl.SSLContext.post_handshake_auth для включения и ssl.SSLSocket.verify_client_post_handshake() для инициирования аутентификации после рукопожатия TLS 1.3. (Автор: Christian Heimes в gh-78851.)

statistics

Добавлена новая функция harmonic_mean(). (Автор: Steven D'Aprano в bpo-27181.)

struct

struct теперь поддерживает числа с плавающей запятой половинной точности IEEE 754 через спецификатор формата 'e'. (Авторы: Eli Stevens, Mark Dickinson в bpo-11734.)

подпроцессsubprocess

Деструктор subprocess.Popen теперь выдаёт предупреждение ResourceWarning, если дочерний процесс всё ещё выполняется. Используйте протокол контекстного менеджера (with proc: ...) или явно вызывайте метод wait() для чтения кода завершения дочернего процесса. (Автор: Victor Stinner в bpo-26741.)

Конструктор subprocess.Popen и все функции, передающие ему аргументы, теперь принимают аргументы encoding и errors. Указание любого из них включает текстовый режим для потоков stdin, stdout и stderr. (Автор: Steve Dower в bpo-6135.)

sys

Новая функция getfilesystemencodeerrors() возвращает имя режима ошибок, используемого для преобразования между именами файлов в Unicode и байтах. (Автор: Steve Dower в bpo-27781.)

В Windows возвращаемое значение функции getwindowsversion() теперь включает поле platform_version, которое содержит точные номера основной, дополнительной версии и сборки текущей операционной системы, а не версию, эмулируемую для процесса. (Автор: Steve Dower в bpo-27932.)

telnetlib

telnetlib.Telnet теперь является контекстным менеджером (автор: Stéphane Wirtel в bpo-25485).

time

Атрибуты struct_time, tm_gmtoff и tm_zone теперь доступны на всех платформах.

timeit

Добавлен новый удобный метод Timer.autorange() для многократного вызова Timer.timeit() таким образом, чтобы общее время выполнения было не меньше 200 миллисекунд. (Автор: Steven D'Aprano в bpo-6422.)

timeit теперь предупреждает, когда есть существенное (в 4 раза) различие между лучшим и худшим временем. (Автор: Serhiy Storchaka в bpo-23552.)

tkinter

Добавлены методы Variable.trace_add(), Variable.trace_remove() и trace_info() в классе tkinter.Variable. Они заменяют старые методы trace_variable(), trace(), trace_vdelete() и trace_vinfo(), которые используют устаревшие команды Tcl и могут не работать в будущих версиях Tcl. (Автор: Serhiy Storchaka в bpo-22115).

traceback

Как модуль traceback, так и встроенное отображение исключений интерпретатора теперь сокращают длинные последовательности повторяющихся строк в трассировках, как показано в следующем примере:

>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

(Автор: Emanuel Barry в bpo-26823.)

tracemalloc

Модуль tracemalloc теперь поддерживает трассировку выделений памяти в нескольких различных адресных пространствах.

Добавлен новый класс фильтра DomainFilter для фильтрации следов блоков по их адресному пространству (домену).

(Предложено Виктором Штиннером в bpo-26588.)

typing

Поскольку модуль typing является временным, все изменения, внесённые в Python 3.6, также были перенесены в Python 3.5.x.

Модуль typing получил значительно улучшенную поддержку обобщённых псевдонимов типов. Например, Dict[str, Tuple[S, T]] теперь является допустимой аннотацией типа. (Предложено Гвидо ван Россумом в Github #195.)

Добавлен класс typing.ContextManager для представления contextlib.AbstractContextManager. (Предложено Бреттом Кэнноном в bpo-25609.)

Добавлен класс typing.Collection для представления collections.abc.Collection. (Предложено Иваном Левкивским в bpo-27598.)

Добавлена конструкция типа typing.ClassVar для обозначения переменных класса. Как представлено в PEP 526, аннотация переменной, обёрнутая в ClassVar, указывает, что данный атрибут предназначен для использования в качестве переменной класса и не должен устанавливаться на экземплярах этого класса. (Предложено Иваном Левкивским в Github #280.)

Новая константа TYPE_CHECKING, которая статическими проверяющими типами считается True, но во время выполнения является False. (Предложено Гвидо ван Россумом в Github #230.)

Добавлена новая вспомогательная функция NewType() для создания облегчённых отдельных типов для аннотаций:

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

Статический проверяющий типов будет обрабатывать новый тип так, как если бы он был подклассом исходного типа. (Предложено Иваном Левкивским в Github #189.)

unicodedata

Модуль unicodedata теперь использует данные из Unicode 9.0.0. (Предложено Бенджамином Петерсоном.)

unittest.mock

Класс Mock получил следующие улучшения:

  • Два новых метода: Mock.assert_called() и Mock.assert_called_once() для проверки, был ли вызван объект-заглушка. (Предложено Амит Саха в bpo-26323.)

  • Метод Mock.reset_mock() теперь имеет два необязательных аргумента, передаваемых только по ключу: return_value и side_effect. (Предложено Кушалом Дасом в bpo-21271.)

urllib.request

Если HTTP-запрос имеет тело в виде файла или итерируемого объекта (не являющегося объектом bytes), но не имеет заголовка Content-Length, то теперь вместо возникновения ошибки AbstractHTTPHandler переключается на использование фрагментированной передачи (chunked transfer encoding). (Предложено Демианом Брехтом и Рольфом Кралем в bpo-12319.)

urllib.robotparser

RobotFileParser теперь поддерживает расширения Crawl-delay и Request-rate. (Предложено Николаем Богоячевым в bpo-16099.)

venv

venv принимает новый параметр --prompt. Этот параметр предоставляет альтернативный префикс для виртуального окружения. (Предложено Лукашем Бальцержаком и портировано на 3.6 Стефаном Виртелем в bpo-22829.)

warnings

Новый необязательный параметр source добавлен в функцию warnings.warn_explicit(): уничтоженный объект, породивший предупреждение ResourceWarning. Атрибут source также добавлен в warnings.WarningMessage (предложено Виктором Штиннером в bpo-26568 и bpo-26567).

При регистрации предупреждения ResourceWarning теперь используется модуль tracemalloc, чтобы попытаться получить трассировку того места, где был размещён уничтоженный объект.

Пример со скриптом example.py:

import warnings

def func():
    return open(__file__)

f = func()
f = None

Вывод команды python3.6 -Wd -X tracemalloc=5 example.py:

example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()

Трассировка «Объект размещён по адресу» является новой и отображается только в том случае, если tracemalloc отслеживает выделения памяти Python и если модуль warnings уже был импортирован.

winreg

Добавлен 64-битный целочисленный тип REG_QWORD. (Предложено Клементом Руо в bpo-23026.)

winsound

Разрешена передача именованных аргументов в Beep, MessageBeep и PlaySound (bpo-27982).

xmlrpc.client

Модуль xmlrpc.client теперь поддерживает распаковку (unmarshalling) дополнительных типов данных, используемых реализацией Apache XML-RPC для числовых значений и None. (Автор: Serhiy Storchaka в bpo-26885.)

zipfile

Новый метод класса ZipInfo.from_file() позволяет создать экземпляр ZipInfo из файла файловой системы. Новый метод ZipInfo.is_dir() можно использовать для проверки, представляет ли экземпляр ZipInfo каталог. (Автор: Thomas Kluyver в bpo-26039.)

Метод ZipFile.open() теперь можно использовать для записи данных в ZIP-файл, а также для извлечения данных. (Автор: Thomas Kluyver в bpo-26039.)

zlib

Функции compress() и decompress() теперь принимают именованные аргументы. (Авторы: Aviv Palivoda в bpo-26243 и Xiang Zhang в bpo-16764 соответственно.)

ОптимизацииOptimizations

  • Интерпретатор Python теперь использует 16-битный wordcode вместо байткода, что позволило провести ряд оптимизаций opcode. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в bpo-26647 и bpo-28050.)

  • Класс asyncio.Future теперь имеет оптимизированную реализацию на C. (Авторы: Yury Selivanov и INADA Naoki в bpo-26081.)

  • Класс asyncio.Task теперь имеет оптимизированную реализацию на C. (Автор: Yury Selivanov в bpo-28544.)

  • Различные улучшения реализации в модуле typing (например, кэширование обобщённых типов) позволяют добиться повышения производительности до 30 раз и уменьшения потребления памяти.

  • ASCII-декодер теперь работает до 60 раз быстрее для обработчиков ошибок surrogateescape, ignore и replace (Автор: Victor Stinner в bpo-24870).

  • ASCII- и Latin1-кодеры теперь работают до 3 раз быстрее для обработчика ошибок surrogateescape (Автор: Victor Stinner в bpo-25227).

  • UTF-8-кодер теперь работает до 75 раз быстрее для обработчиков ошибок ignore, replace, surrogateescape, surrogatepass (Автор: Victor Stinner в bpo-25267).

  • UTF-8-декодер теперь работает до 15 раз быстрее для обработчиков ошибок ignore, replace и surrogateescape (Автор: Victor Stinner в bpo-25301).

  • bytes % args теперь работает до 2 раз быстрее. (Автор: Victor Stinner в bpo-25349).

  • bytearray % args теперь работает в 2,5–5 раз быстрее. (Автор: Victor Stinner в bpo-25399).

  • Оптимизированы bytes.fromhex() и bytearray.fromhex(): теперь они работают в 2–3,5 раза быстрее. (Автор: Victor Stinner в bpo-25401).

  • Оптимизированы bytes.replace(b'', b'.') и bytearray.replace(b'', b'.'): до 80% быстрее. (Автор: Josh Snider в bpo-26574).

  • Функции распределителя памяти домена PyMem_Malloc() (PYMEM_DOMAIN_MEM) теперь используют распределитель памяти pymalloc вместо функции malloc() библиотеки C. Распределитель pymalloc оптимизирован для объектов размером не более 512 байт с коротким временем жизни и использует malloc() для больших блоков памяти. (Автор: Victor Stinner в bpo-26249).

  • pickle.load() и pickle.loads() теперь работают до 10% быстрее при десериализации множества мелких объектов (Автор: Victor Stinner в bpo-27056).

  • Передача именованных аргументов в функцию требует дополнительных затрат по сравнению с передачей позиционных аргументов. Теперь в функциях расширения, реализованных с помощью Argument Clinic, эти затраты значительно снижены. (Автор: Serhiy Storchaka в bpo-27574).

  • Оптимизированы функции glob() и iglob() в модуле glob; теперь они работают примерно в 3–6 раз быстрее. (Автор: Serhiy Storchaka в bpo-25596).

  • Оптимизирована глоббинг (globbing) в pathlib с помощью os.scandir(); теперь она работает примерно в 1,5–4 раза быстрее. (Автор: Serhiy Storchaka в bpo-26032).

  • Производительность разбора (parsing), итерации и deepcopy для xml.etree.ElementTree значительно улучшена. (Автор: Serhiy Storchaka в bpo-25638, bpo-25873 и bpo-25869.)

  • Создание экземпляров fractions.Fraction из чисел с плавающей точкой и десятичных чисел теперь в 2–3 раза быстрее. (Автор: Serhiy Storchaka в bpo-25971.)

Изменения в сборке и C APIBuild and C API Changes

  • Для сборки Python теперь требуется поддержка некоторых возможностей C99 в инструментальной цепочке. В частности, Python теперь использует стандартные целочисленные типы и макросы вместо пользовательских макросов, таких как PY_LONG_LONG. Дополнительную информацию см. в PEP 7 и bpo-17884.

  • Кросс-компиляция CPython с Android NDK и уровнем API Android, установленным на 21 (Android 5.0 Lollipop) или выше, выполняется успешно. Хотя Android пока не является поддерживаемой платформой, тестовый набор Python запускается на эмуляторе Android всего с примерно 16 неудачными тестами. См. мета-задачу Android bpo-26865.

  • Добавлен флаг конфигурации --enable-optimizations. Его включение активирует дорогостоящие оптимизации, такие как PGO. (Оригинальный патч от Alecsandru Patrascu из Intel в bpo-26359.)

  • GIL теперь должен удерживаться при вызове функций распределителя памяти доменов PYMEM_DOMAIN_OBJ (например, PyObject_Malloc()) и PYMEM_DOMAIN_MEM (например, PyMem_Malloc()).

  • Новый API Py_FinalizeEx(), который сообщает, не удалась ли сброс буферизованных данных. (Автор: Martin Panter в bpo-5319.)

  • PyArg_ParseTupleAndKeywords() теперь поддерживает только позиционные параметры. Только позиционные параметры определяются пустыми именами. (Предложено Serhiy Storchaka в bpo-26282).

  • Метод PyTraceback_Print теперь сокращает длинные последовательности повторяющихся строк как "[Previous line repeated {count} more times]". (Предложено Emanuel Barry в bpo-26823.)

  • Новая функция PyErr_SetImportErrorSubclass() позволяет указать подкласс ImportError для возбуждения. (Предложено Eric Snow в bpo-15767.)

  • Новую функцию PyErr_ResourceWarning() можно использовать для генерации ResourceWarning, предоставляющего источник выделения ресурсов. (Предложено Victor Stinner в bpo-26567.)

  • Новая функция PyOS_FSPath() возвращает файловое системное представление путеподобного объекта. (Предложено Brett Cannon в bpo-27186.)

  • Функции PyUnicode_FSConverter() и PyUnicode_FSDecoder() теперь принимают путеподобные объекты.

Другие улучшенияOther Improvements

  • Если --version (краткая форма: -V) указывается дважды, Python выводит sys.version для подробной информации.

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

УстарелоDeprecated

Новые ключевые словаNew Keywords

async и await не рекомендуется использовать в качестве имен переменных, классов, функций или модулей. Введенные PEP 492 в Python 3.5, они станут полноценными ключевыми словами в Python 3.7. Начиная с Python 3.6, использование async или await в качестве имен будет вызывать DeprecationWarning.

Устаревшее поведение PythonDeprecated Python behavior

Возбуждение исключения StopIteration внутри генератора теперь будет генерировать DeprecationWarning и вызовет RuntimeError в Python 3.7. Подробнее см. PEP 479: Изменение обработки StopIteration внутри генераторов.

Метод __aiter__() теперь должен возвращать асинхронный итератор напрямую, а не ожидаемый объект, как раньше. При возврате итератора будет вызвано DeprecationWarning. Обратная совместимость будет удалена в Python 3.7. (Предложено Yury Selivanov в bpo-27243.)

Пара символов обратной косой черты, не являющаяся допустимой управляющей последовательностью, теперь генерирует DeprecationWarning. Хотя со временем это станет SyntaxError, этого не произойдет в течение нескольких выпусков Python. (Предложено Emanuel Barry в bpo-27364.)

При выполнении относительного импорта обращение к __name__ и __path__ из вызывающего модуля, если __spec__ или __package__ не определены, теперь вызывает ImportWarning. (Предложено Rose Ames в bpo-25791.)

Устаревшие модули, функции и методы PythonDeprecated Python modules, functions and methods

asynchat

asynchat устарел в пользу asyncio. (Предложено Mariatta в bpo-25002.)

asyncore

asyncore устарел в пользу asyncio. (Предложено Mariatta в bpo-25002.)

dbm

В отличие от других реализаций dbm, модуль dbm.dumb создает базы данных в режиме 'rw' и позволяет изменять базу данных, открытую в режиме 'r'. Такое поведение теперь устарело и будет удалено в версии 3.8. (Предложено Serhiy Storchaka в bpo-21708.)

distutils

Незадокументированный аргумент extra_path конструктора distutils.Distribution теперь считается устаревшим и будет вызывать предупреждение при его установке. Поддержка этого параметра будет удалена в одном из будущих выпусков Python. Подробнее см. bpo-27919.

grp

Поддержка нецелочисленных аргументов в getgrgid() устарела. (Предложено Serhiy Storchaka в bpo-26129.)

importlib

Методы importlib.machinery.SourceFileLoader.load_module() и importlib.machinery.SourcelessFileLoader.load_module() теперь устарели. Они были единственными оставшимися реализациями importlib.abc.Loader.load_module() в importlib, которые не были объявлены устаревшими в предыдущих версиях Python в пользу importlib.abc.Loader.exec_module().

Класс importlib.machinery.WindowsRegistryFinder теперь устарел. Начиная с версии 3.6.0, он все еще добавляется в sys.meta_path по умолчанию (на Windows), но это может измениться в будущих выпусках.

os

Незадокументированная поддержка байтоподобных объектов общего вида в качестве путей в функциях os, compile() и подобных функциях теперь устарела. (Предложено Serhiy Storchaka в bpo-25791 и bpo-26754.)

re

Поддержка встроенных флагов (?letters) в середине регулярного выражения устарела и будет удалена в будущей версии Python. Флаги в начале регулярного выражения по-прежнему разрешены. (Внёс Serhiy Storchaka в bpo-22493.)

ssl

OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль ssl будет требовать как минимум OpenSSL 1.0.2 или 1.1.0.

Аргументы, связанные с SSL, такие как certfile, keyfile и check_hostname, в ftplib, http.client, imaplib, poplib и smtplib устарели в пользу context. (Внёс Christian Heimes в bpo-28022.)

Некоторые протоколы и функции модуля ssl теперь устарели. Некоторые возможности будут недоступны в будущих версиях OpenSSL. Другие возможности устарели в пользу другого API. (Внёс Christian Heimes в bpo-28022 и bpo-26470.)

tkinter

Модуль tkinter.tix теперь устарел. Пользователям tkinter следует использовать tkinter.ttk вместо него.

venv

Скрипт pyvenv устарел в пользу python3 -m venv. Это предотвращает путаницу в том, к какому интерпретатору Python подключён pyvenv и, следовательно, какой интерпретатор Python будет использоваться виртуальным окружением. (Внёс Brett Cannon в bpo-25154.)

xml

  • В качестве меры защиты от DTD и извлечения внешних сущностей модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. (Внёс Christian Heimes в gh-61441.)

Устаревшие функции и типы C APIDeprecated functions and types of the C API

Undocumented functions PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() and PyUnicode_AsDecodedUnicode() are deprecated now. Use the generic codec based API instead.

Устаревшие параметры сборкиDeprecated Build Options

Флаг конфигурации --with-system-ffi теперь включён по умолчанию на UNIX-платформах, отличных от macOS. Его можно отключить с помощью --without-system-ffi, но использование флага устарело и не будет приниматься в Python 3.7. macOS это изменение не затрагивает. Обратите внимание, что многие распространители ОС уже используют флаг --with-system-ffi при сборке своего системного Python.

УдаленоRemoved

Удаление API и возможностейAPI and Feature Removals

  • Неизвестные экранирующие последовательности, состоящие из '\' и буквы ASCII в регулярных выражениях, теперь будут вызывать ошибку. В шаблонах замены для re.sub() они по-прежнему разрешены, но устарели. Флаг re.LOCALE теперь может использоваться только с двоичными шаблонами.

  • inspect.getmoduleinfo() был удалён (устарел начиная с CPython 3.3). Для получения имени модуля по заданному пути следует использовать inspect.getmodulename(). (Внёс Yury Selivanov в bpo-13248.)

  • Класс traceback.Ignore и методы traceback.usage, traceback.modname, traceback.fullmodname, traceback.find_lines_from_code, traceback.find_lines, traceback.find_strings, traceback.find_executable_lines были удалены из модуля traceback. Это были недокументированные методы, устаревшие с Python 3.2; эквивалентная функциональность доступна через приватные методы.

  • Фиктивные методы tk_menuBar() и tk_bindForTraversal() в классах виджетов tkinter были удалены (соответствующие команды Tk устарели начиная с Tk 4.0).

  • Метод open() класса zipfile.ZipFile больше не поддерживает режим 'U' (устарел с Python 3.4). Используйте io.TextIOWrapper для чтения сжатых текстовых файлов в режиме универсальных новых строк.

  • Незадокументированные модули IN, CDROM, DLFCN, TYPES, CDIO и STROPTS были удалены. Они были доступны в каталогах, специфичных для платформы Lib/plat-*/, но хронически устаревали, были непоследовательно доступны на разных платформах и не поддерживались. Скрипт, создававший эти модули, по-прежнему доступен в дистрибутиве исходного кода по адресу Tools/scripts/h2py.py.

  • Устаревший класс asynchat.fifo был удалён.

Перенос на Python 3.6Porting to Python 3.6

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.

Изменения в поведении команды ‘python’Changes in ‘python’ Command Behavior

  • Вывод специальной сборки Python с определёнными макросами COUNT_ALLOCS, SHOW_ALLOC_COUNT или SHOW_TRACK_COUNT теперь по умолчанию отключён. Его можно снова включить с помощью опции -X showalloccount. Теперь он выводит в stderr вместо stdout. (Внёс Serhiy Storchaka в bpo-23034.)

Изменения в Python APIChanges in the Python API

  • open() больше не будет разрешать комбинировать флаг режима 'U' с '+'. (Внесли Jeff Balogh и John O’Connor в bpo-2091.)

  • sqlite3 больше не выполняет неявную фиксацию открытой транзакции перед операторами DDL.

  • На Linux os.urandom() теперь блокируется до инициализации пула энтропии системного urandom для повышения безопасности.

  • Если определён importlib.abc.Loader.exec_module(), importlib.abc.Loader.create_module() тоже должен быть определён.

  • PyErr_SetImportError() теперь устанавливает TypeError, если его аргумент msg не задан. Ранее возвращался только NULL.

  • Формат атрибута co_lnotab объектов кода был изменён для поддержки отрицательного смещения номера строки. По умолчанию Python не генерирует байт-код с отрицательным смещением номера строки. Функции, использующие frame.f_lineno, PyFrame_GetLineNumber() или PyCode_Addr2Line(), не затрагиваются. Функции, напрямую декодирующие co_lnotab, следует обновить для использования знакового 8-битного целого типа для смещения номера строки, но это требуется только для поддержки приложений, использующих отрицательное смещение. См. Objects/lnotab_notes.txt для описания формата co_lnotab и способов его декодирования, а также PEP 511 для обоснования.

  • Функции модуля compileall теперь возвращают булевы значения вместо 1 или 0 для обозначения успеха или неудачи соответственно. Поскольку булевы значения являются подклассом целых чисел, это может быть проблемой только если вы использовали проверки идентичности с 1 или 0. См. bpo-25768.

  • Чтение атрибута port у urllib.parse.urlsplit() и urlparse() теперь вызывает ValueError для значений вне диапазона, вместо возврата None. См. bpo-20059.

  • Модуль imp теперь вызывает DeprecationWarning вместо PendingDeprecationWarning.

  • У следующих модулей в атрибут __all__ были добавлены недостающие API для соответствия документированным API: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threading и wave. Это означает, что они будут экспортировать новые символы при использовании import *. (Вклад Джоэла Таддеи и Яцека Колодзея в bpo-23883.)

  • При выполнении относительного импорта, если __package__ не равно __spec__.parent, то вызывается ImportWarning. (Вклад Бретта Кэннона в bpo-25791.)

  • Когда выполняется относительный импорт и родительский пакет неизвестен, будет вызвано ImportError. Ранее могло вызываться SystemError. (Вклад Бретта Кэннона в bpo-18018.)

  • Серверы на основе модуля socketserver, включая определённые в http.server, xmlrpc.server и wsgiref.simple_server, теперь перехватывают только исключения, производные от Exception. Поэтому если обработчик запроса вызывает исключение типа SystemExit или KeyboardInterrupt, handle_error() больше не вызывается, и исключение остановит однопоточный сервер. (Вклад Мартина Пантера в bpo-23430.)

  • spwd.getspnam() теперь вызывает PermissionError вместо KeyError, если у пользователя нет прав.

  • Метод socket.socket.close() теперь вызывает исключение, если базовый системный вызов сообщил об ошибке (например, EBADF). (Вклад Мартина Пантера в bpo-26685.)

  • Аргумент decode_data конструкторов smtpd.SMTPChannel и smtpd.SMTPServer теперь по умолчанию равен False. Это означает, что аргумент, передаваемый в process_message(), теперь по умолчанию является объектом bytes, а в process_message() будут передаваться именованные аргументы. Код, который уже был обновлён в соответствии с предупреждением об устаревании, сгенерированным 3.5, не будет затронут.

  • Все необязательные аргументы функций dump(), dumps(), load() и loads() и конструкторов классов JSONEncoder и JSONDecoder в модуле json теперь являются только именованными. (Вклад Сергея Сторчаки в bpo-18726.)

  • Подклассы type, которые не переопределяют type.__new__, больше не могут использовать форму с одним аргументом для получения типа объекта.

  • В рамках PEP 487 обработка именованных аргументов, передаваемых в type (кроме подсказки метакласса metaclass), теперь последовательно делегируется object.__init_subclass__(). Это означает, что type.__new__ и type.__init__ теперь принимают произвольные именованные аргументы, но object.__init_subclass__() (который вызывается из type.__new__) будет отклонять их по умолчанию. Пользовательским метаклассам, принимающим дополнительные именованные аргументы, потребуется соответствующим образом скорректировать свои вызовы type.__new__ (непосредственно или через super).

  • В distutils.command.sdist.sdist атрибут default_format был удалён и больше не учитывается. Вместо него по умолчанию на всех платформах используется формат сжатого tar-файла, и никакого выбора в зависимости от платформы не производится. В средах, где сборки создаются в Windows и требуются дистрибутивы в формате ZIP, настройте проект с помощью файла setup.cfg, содержащего следующее:

    [sdist]
    formats=zip
    

    Это поведение также было портировано в более ранние версии Python в составе Setuptools 26.0.0.

  • В модуле urllib.request и методе http.client.HTTPConnection.request(), если не указан заголовок Content-Length и тело запроса является файловым объектом, оно теперь отправляется с кодированием фрагментов HTTP 1.1. Если файловый объект должен быть отправлен на сервер HTTP 1.0, значение Content-Length теперь должно указываться вызывающей стороной. (Вклад Демиана Брехта и Рольфа Краля с доработками Мартина Пантера в bpo-12319.)

  • DictReader теперь возвращает строки типа OrderedDict. (Вклад Стива Холдена в bpo-27842.)

  • crypt.METHOD_CRYPT больше не будет добавляться в crypt.methods, если это не поддерживается платформой. (Вклад Виктора Стиннера в bpo-25287.)

  • Аргументы verbose и rename для namedtuple() теперь являются только именованными. (Вклад Рэймонда Хеттингера в bpo-25628.)

  • На Linux ctypes.util.find_library() теперь ищет общие библиотеки в LD_LIBRARY_PATH. (Вклад Виная Саджипа в bpo-9998.)

  • Класс imaplib.IMAP4 теперь обрабатывает флаги, содержащие символ ']', в сообщениях, отправляемых с сервера, для улучшения совместимости в реальных условиях. (Вклад Литы Чо в bpo-21815.)

  • Функция mmap.mmap.write() теперь возвращает количество записанных байтов, как и другие методы записи. (Вклад Якуба Стасяка в bpo-26335.)

  • Функции pkgutil.iter_modules() и pkgutil.walk_packages() теперь возвращают ModuleInfo именованные кортежи. (Вклад Рамчандры Апте в bpo-17211.)

  • re.sub() теперь вызывает ошибку для недопустимых числовых ссылок на группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых ссылок на группы теперь включает индекс группы и позицию ссылки. (Вклад SilentGhost, Сергея Сторчаки в bpo-25953.)

  • zipfile.ZipFile теперь будет вызывать NotImplementedError для нераспознанных значений сжатия. Ранее вызывалось просто RuntimeError. Кроме того, вызов методов ZipFile на закрытом ZipFile или вызов метода write() на ZipFile, созданном в режиме 'r', будет вызывать ValueError. Ранее в этих сценариях вызывалось RuntimeError.

  • Когда пользовательские метаклассы используются вместе с super() без аргументов или прямыми ссылками из методов на неявную переменную замыкания __class__, неявная запись пространства имён __classcell__ теперь должна передаваться в type.__new__ для инициализации. Невыполнение этого требования приведёт к DeprecationWarning в Python 3.6 и к RuntimeError в Python 3.8.

  • С введением ModuleNotFoundError потребители системы импорта могут начать ожидать, что замены системы импорта будут вызывать это более конкретное исключение, когда это уместно, а не менее конкретное ImportError. Чтобы обеспечить будущую совместимость с такими потребителями, разработчики альтернативных систем импорта, полностью заменяющих __import__(), должны обновить свои реализации для вызова нового подкласса, когда модуль вообще не найден. Разработчики совместимых плагинов для стандартной системы импорта не должны вносить никаких изменений, так как стандартная система импорта будет вызывать новый подкласс, когда это уместно.

Изменения в C APIChanges in the C API

  • Семейство аллокаторов PyMem_Malloc() теперь использует аллокатор pymalloc вместо системного malloc(). Приложения, вызывающие PyMem_Malloc() без удержания GIL, могут аварийно завершаться. Установите переменную окружения PYTHONMALLOC в значение debug, чтобы проверить использование аллокаторов памяти в вашем приложении. См. bpo-26249.

  • Py_Exit() (и главный интерпретатор) теперь переопределяют код завершения на 120, если сброс буферизованных данных не удался. См. bpo-5319.

Изменения байткода CPythonCPython bytecode changes

В Python 3.6 был внесён ряд серьёзных изменений в байткод.

  • Интерпретатор Python теперь использует 16-битный wordcode вместо байткода. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в bpo-26647 и bpo-28050.)

  • Новые опкоды FORMAT_VALUE и BUILD_STRING как часть реализации форматированных строковых литералов. (Автор: Eric Smith в bpo-25483 и Serhiy Storchaka в bpo-27078.)

  • Новый опкод BUILD_CONST_KEY_MAP для оптимизации создания словарей с постоянными ключами. (Автор: Serhiy Storchaka в bpo-27140.)

  • Опкоды вызова функций были существенно переработаны для повышения производительности и упрощения реализации. Опкоды MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KW и BUILD_MAP_UNPACK_WITH_CALL были изменены, добавлены новые CALL_FUNCTION_EX и BUILD_TUPLE_UNPACK_WITH_CALL, а опкоды CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KW и MAKE_CLOSURE удалены. (Автор: Demur Rumed в bpo-27095, и Serhiy Storchaka в bpo-27213, bpo-28257.)

  • Добавлены новые опкоды SETUP_ANNOTATIONS и STORE_ANNOTATION для поддержки нового синтаксиса аннотаций переменных. (Автор: Ivan Levkivskyi в bpo-27985.)

Заметные изменения в Python 3.6.2Notable changes in Python 3.6.2

Новая make regen-all цель сборкиNew make regen-all build target

Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\nсобрать без необходимости уже иметь установленную версию Python,\nсистема сборки на основе autotools больше не пытается неявно\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.

Вместо этого была добавлена новая команда make regen-all для принудительной\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\nбыла собрана на основе предварительно сгенерированных версий).

Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.

(Предложено Victor Stinner в bpo-23404.)

Добавлено в версии 3.6.2.

Удаление make touch цели сборкиRemoval of make touch build target

Цель сборки make touch, ранее использовавшаяся для запроса неявной перегенерации\nсгенерированных файлов путем обновления времени их изменения, была удалена.

Она заменена новой целью make regen-all.

(Предложено Victor Stinner в bpo-23404.)

Изменено в версии 3.6.2.

Заметные изменения в Python 3.6.4Notable changes in Python 3.6.4

Синглтон PyExc_RecursionErrorInst, который был частью публичного API, удалён, поскольку его члены никогда не очищались и могли вызвать segfault при завершении работы интерпретатора. (Автор: Xavier de Gaye в bpo-22898 и bpo-30697.)

Заметные изменения в Python 3.6.5Notable changes in Python 3.6.5

Функция locale.localeconv() теперь временно устанавливает локаль LC_CTYPE в локаль LC_NUMERIC в некоторых случаях. (Автор: Victor Stinner в bpo-31900.)

Заметные изменения в Python 3.6.7Notable changes in Python 3.6.7

Модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. См. также gh-61441.

В 3.6.7 модуль tokenize теперь неявно генерирует токен NEWLINE, когда на вход подаётся строка без завершающего перевода строки. Это поведение теперь соответствует тому, что делает внутренний токенизатор C. (Автор: Ammar Askar в bpo-33899.)

Заметные изменения в Python 3.6.10Notable changes in Python 3.6.10

Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Подробнее см. в документации loop.create_datagram_endpoint(). (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в bpo-37228.)

Заметные изменения в Python 3.6.13Notable changes in Python 3.6.13

В ранних версиях Python допускалось использование обоих символов ; и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия новым рекомендациям W3C было изменено так, чтобы разрешался только один символ-разделитель, по умолчанию &. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они внутренне используют затронутые функции. Подробнее см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)

Заметные изменения в Python 3.6.14Notable changes in Python 3.6.14

Исправление безопасности изменяет поведение ftplib.FTP: теперь не доверяется IPv4-адрес, отправленный удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для нестандартного кода, требующего старого поведения, установите атрибут trust_server_pasv_ipv4_address на вашем экземпляре FTP в значение True. (См. gh-87451)

Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. В соответствии со спецификацией WHATWG, обновляющей RFC 3986, символы ASCII перевода строки \n, \r и табуляции \t удаляются из URL парсером urllib.parse(), предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. gh-88048)