Что нового в Python 3.6

Редакция:

Элвис Пранскевичус <elvis@magic.io>, Юрий Селиванов <yury@magic.io>

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

См.также

PEP 494 - График выхода Python 3.6

Резюме - Основные моменты выпуска

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

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

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

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

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

  • PEP 530: асинхронные постижения.

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

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

  • Тип dict был переделан для использования more compact representation, основанного на a proposal by Raymond Hettinger и похожего на PyPy dict implementation. Это привело к тому, что словари стали использовать на 20-25 % меньше памяти по сравнению с Python 3.5.

  • Настройка создания классов была упрощена с помощью new protocol.

  • Порядок определения атрибутов класса - now preserved.

  • Порядок элементов в **kwargs теперь corresponds to the order, в котором ключевые слова-аргументы были переданы в функцию.

  • Добавлены DTrace и SystemTap probing support.

  • Новая переменная окружения PYTHONMALLOC теперь может быть использована для отладки ошибок выделения и доступа к памяти интерпретатора.

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

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

  • Для поддержки path-like objects был реализован новый file system path protocol. Все стандартные библиотечные функции, работающие с путями, были обновлены для работы с новым протоколом.

  • Модуль datetime получил поддержку Local Time Disambiguation.

  • Модуль typing получил номер improvements.

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

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

  • Новый модуль 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 символов больше не действует. Подробности см. в разделе removing the MAX_PATH limitation.

  • Можно добавить файл ._pth, чтобы включить изолированный режим и полностью указать все пути поиска, чтобы избежать поиска в реестре и окружении. Дополнительные сведения см. в разделе the documentation.

  • Файл python36.zip теперь работает как ориентир для вывода PYTHONHOME. Дополнительные сведения см. в разделе the documentation.

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

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

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

Форматированные строковые литералы имеют префикс '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}}"  # nested fields
'result:      12.35'

См.также

PEP 498 – Буквальная интерполяция строк.

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

Feature documentation.

PEP 526: Синтаксис для аннотаций переменных

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

primes: List[int] = []

captain: str  # Note: no initial value!

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

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

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

См.также

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

PEP написан Райаном Гонсалесом, Филипом Хаусом, Иваном Левкивским, Лизой Роуч и Гвидо ван Россумом. Реализован Иваном Левкивским.

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

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

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

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

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

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

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

См.также

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

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

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

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

async def ticker(delay, to):
    """Yield numbers from 0 to *to* every *delay* seconds."""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

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

См.также

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

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

PEP 530: Асинхронные постижения

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: Более простая настройка создания классов

Теперь можно настроить создание подклассов без использования метакласса. Новый метод класса __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 написан и реализован Мартином Тайхманом.

Feature documentation

PEP 487: Усовершенствования протокола дескрипторов

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

    # this is the new initializer:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()

См.также

PEP 487 – Более простая настройка создания классов

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

Feature documentation

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

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

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

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

Мы надеемся, что обновление фундаментальных функций для работы с путями файловой системы приведет к тому, что код сторонних разработчиков будет неявно поддерживать все path-like objects без каких-либо изменений в коде или хотя бы с минимальными изменениями (например, вызов 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: Определение местного времени

В большинстве стран мира были и будут времена, когда местные часы переводятся назад. В это время появляются интервалы, когда местные часы показывают одно и то же время дважды за один день. В таких ситуациях информации, отображаемой на местных часах (или хранящейся в экземпляре 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-8

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

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

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

Дополнительную информацию и обсуждение изменений в коде, которые могут потребоваться, см. в разделе PEP 529.

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

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

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

См.также

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

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

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

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

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

См.также

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

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

PEP 468: Сохранение порядка аргументов ключевых слов

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

См.также

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

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

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

Тип dict теперь использует «компактное» представление, основанное на a proposal by Raymond Hettinger, который был first implemented by PyPy. По сравнению с Python 3.5 использование памяти новым dict() уменьшилось на 20-25 %.

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

(Внесено INADA Naoki в bpo-27350. Идея originally suggested by Raymond Hettinger).

PEP 523: Добавление API для оценки кадров в CPython

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

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

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

См.также

PEP 523 – Добавление API для оценки кадров в CPython

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

Переменная среды PYTHONMALLOC

Новая переменная окружения 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 to debug 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__
  ...

(Внесено Виктором Стиннером в bpo-26516 и bpo-26564).

Поддержка зондирования DTrace и SystemTap

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

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

  • сборка мусора начата/закончена

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

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

Более подробная информация в Инструментирование CPython с помощью DTrace и SystemTap.

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

(Внесено Лукашем Ланга в bpo-21590, основано на исправлениях Хесуса Сеа Авиона, Дэвида Малкольма и Нихила Бенеша).

Другие языковые изменения

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

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

  • Теперь можно установить special method в None, чтобы указать, что соответствующая операция недоступна. Например, если для класса установить __iter__() в None, то класс не является итерируемым. (Внесено Эндрю Барнертом и Иваном Левкивским в bpo-25958).

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

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

  • Методы классов, полагающиеся на нулевой аргумент super(), теперь будут корректно работать при вызове из методов метакласса во время создания класса. (Внесено Мартином Тайхманом в bpo-23722).

Новые модули

секреты

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

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

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

См.также

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

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

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

массив

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

Вклад Сергея Сторчака в bpo-26492.

ast

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

Вклад Виктора Стиннера в bpo-26146.

asyncio

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

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

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

  • Функция ensure_future() и все использующие ее функции, такие как loop.run_until_complete(), теперь принимают все виды awaitable objects. (Внесено Юрием Селивановым.)

  • Новая функция run_coroutine_threadsafe() для передачи корутинов в циклы событий из других потоков. (Внесено Винсентом Мишелем).

  • Новый метод Transport.is_closing() для проверки того, закрывается ли транспорт или нет. (Внесено Юрием Селивановым).

  • Метод loop.create_server() теперь может принимать список хостов. (Внесено Янном Сионно).

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

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

  • Новый метод StreamReader.readuntil() для чтения данных из потока до появления последовательности байтов-разделителей. (Внесено Марком Коренбергом.)

  • Производительность StreamReader.readexactly() была улучшена. (Внесено Марком Коренбергом в bpo-28370).

  • Метод loop.getaddrinfo() оптимизирован, чтобы избежать вызова системной функции getaddrinfo, если адрес уже разрешен. (Внесено А. Джесси Джирю Дэвисом).

  • Метод loop.stop() был изменен таким образом, чтобы останавливать цикл сразу после текущей итерации. Все новые обратные вызовы, запланированные в результате последней итерации, будут отброшены. (Внесено Гвидо ван Россумом в bpo-25593).

  • Future.set_exception теперь будет поднимать TypeError при передаче экземпляра исключения StopIteration. (Внесено Крисом Анджелико в 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 repr. (Внесено Марком Дикинсоном в bpo-23229).

коллекции

Новый абстрактный базовый класс Collection был добавлен для представления классов итерируемых контейнеров большого размера. (Вклад Ивана Левкивского, док-ты Нила Гирдхара в bpo-27598).

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

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

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

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

Рекурсивные экземпляры collections.deque теперь можно мариновать. (Внесено Сергеем Сторчакой в 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.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.

e-mail

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

Все классы email.mime теперь принимают необязательное ключевое слово policy. (Внесено Беркером Пексагом в bpo-27331).

В DecodedGenerator теперь поддерживается ключевое слово policy.

Существует новый атрибут policy, message_factory, который управляет тем, какой класс используется по умолчанию при создании парсером новых объектов сообщений. Для политики email.policy.compat32 это Message, для новых политик - EmailMessage. (Внесено Р. Дэвидом Мюрреем в bpo-20476).

кодировки

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

enum

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

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

Новое значение 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(). (Внесено Виктором Стиннером в bpo-23848).

fileinput

hook_encoded() теперь поддерживает аргумент errors. (Внесено Джозефом Хакманом в bpo-25788).

hashlib

hashlib поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия - 1.0.2. (Внесено Кристианом Хаймсом в bpo-26470).

В модуль были добавлены хэш-функции BLAKE2. blake2b() и blake2s() всегда доступны и поддерживают полный набор функций BLAKE2. (Внесено Кристианом Хаймсом в bpo-26798 на основе кода Дмитрия Честных и Самуэля Невеса. Документация написана Дмитрием Честных).

Добавлены хэш-функции SHA-3 sha3_224(), sha3_256(), sha3_384(), sha3_512() и хэш-функции SHAKE shake_128() и shake_256(). (Внесено Кристианом Хаймсом в bpo-16113. Пакет кодов Keccak, подготовленный Гвидо Бертони, Джоан Демен, Михаэлем Пеетерсом, Жилем Ван Аше и Ронни Ван Кеером).

Функция получения ключей на основе пароля scrypt() теперь доступна в OpenSSL 1.1.0 и более новых версиях. (Внесено Кристианом Хаймсом в bpo-27928).

http.client

HTTPConnection.request() и endheaders() теперь поддерживают тела запросов в кодировке chunked. (Вклад Демиана Брехта и Рольфа Краля в bpo-12319).

idlelib и IDLE

Пакет idlelib модернизируется и рефакторизируется, чтобы IDLE выглядела и работала лучше, а код было легче понимать, тестировать и улучшать. Частью улучшения внешнего вида 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), а иногда и больше. (Изменения имен были внесены Элом Свигартом и Терри Риди в bpo-24225. Большинство исправлений idlelib с тех пор были и будут частью этого процесса).

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

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

Многочисленные исправления автозаполнения. (Внесено Луи Лу в bpo-15786).

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

Модуль Browser (меню File, ранее назывался Class Browser) теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Вклад внесли Гильерме Поло, Шерил Сабелла и Терри Ян Риди в bpo-1612262).

Функции IDLE, ранее реализованные как расширения, теперь реализованы как обычные функции. Их настройки были перенесены с вкладки «Расширения» на другие вкладки диалога. (Вклад внесли Чарльз Вольгангер и Терри Ян Риди в bpo-27099).

Диалог настроек (Options, Configure IDLE) был частично переписан для улучшения внешнего вида и функциональности. (Внесено Шерил Сабелла и Терри Джен Риди в нескольких выпусках).

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

Образец шрифта теперь включает в себя выборку нелатинских символов, чтобы пользователи могли лучше увидеть эффект от выбора конкретного шрифта. (Внесено Терри Яном Риди в bpo-13802) Образец можно редактировать, чтобы включить в него другие символы. (Внесено Сергеем Сторчакой в bpo-31860).

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

Изменена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до maxlines. Щелчок по контекстной строке переводит редактор на эту строку. Цвета контекста для пользовательских тем добавлены на вкладку Highlights диалога Settings. (Вклад Шерил Сабеллы и Терри Джен Риди в bpo-33642, bpo-33768 и bpo-33679).

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

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

Вывод более N строк (по умолчанию 50) сжимается до кнопки. N можно изменить в разделе PyShell на странице Общие в диалоге Настройки. Меньшее количество строк, но, возможно, очень длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод может быть развернут на месте двойным щелчком по кнопке или в буфер обмена или отдельное окно правым щелчком по кнопке. (Внесено Тал Эйнат в bpo-1529353).

importlib

Импорт теперь вызывает новое исключение ModuleNotFoundError (подкласс ImportError), когда не может найти модуль. Код, который в настоящее время проверяет наличие ImportError (в try-except), по-прежнему будет работать. (Внесено Эриком Сноу в 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() теперь принимают path-like object.

осмотреть

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

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

json

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

ведение журнала

Новый метод WatchedFileHandler.reopenIfNeeded() был добавлен для проверки необходимости повторного открытия файла журнала. (Внесено Мариан Хорбан в bpo-24884).

математика

В модули math и cmath добавлена константа тау (τ). (Внесена Лизой Роуч в bpo-12345, подробности см. в PEP 628).

многопроцессорная обработка

Proxy Objects, возвращаемые multiprocessing.Manager(), теперь могут быть вложенными. (Внесено Дэвином Поттсом в bpo-6766).

os

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

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

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

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

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

pathlib

pathlib теперь поддерживает path-like objects. (Внесено Бреттом Кэнноном в bpo-27186).

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

pdb

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

маринованный огурец

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

pickletools

pickletools.dis() теперь выводит неявный индекс мемо для опкода MEMOIZE. (Внесено Сергеем Сторчакой в bpo-25382).

pydoc

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

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

случайно

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

re

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

Доступ к группам совпадающих объектов можно получить с помощью __getitem__, что эквивалентно group(). Таким образом, mo['name'] теперь эквивалентен mo.group('name'). (Внесено Эриком Смитом в bpo-24454).

Объекты Match теперь поддерживают index-like objects в качестве групповых индексов. (Внесено Йеруном Демейером и Сяном Чжаном в bpo-27177).

readline

Добавлена функция set_auto_history() для включения или отключения автоматического добавления ввода в список истории. (Внесено Тайлером Кромптоном в bpo-26870).

rlcompleter

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

shlex

В shlex появилось много improved shell compatibility через новый аргумент punctuation_chars для управления тем, какие символы будут рассматриваться как знаки препинания. (Внесено Винаем Саджипом в bpo-1521950).

сайт

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

sqlite3

sqlite3.Cursor.lastrowid теперь поддерживает оператор REPLACE. (Внесено Алексом ЛордТорсеном в bpo-16864).

сокет

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

Теперь поддерживаются константы getsockopt() SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC и SO_PASSSEC. (Внесено Кристианом Хаймсом в bpo-26907).

Теперь setsockopt() поддерживает форму setsockopt(level, optname, None, optlen: int). (Внесено Кристианом Хаймсом в bpo-27744).

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

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

сокетсервер

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

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

ssl

ssl поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия - 1.0.2. (Внесено Кристианом Хаймсом в bpo-26470).

Из наборов шифров по умолчанию удален 3DES и добавлен набор шифров ChaCha20 Poly1305. (Внесено Кристианом Хаймсом в bpo-27850 и bpo-27766).

SSLContext имеет лучшую конфигурацию по умолчанию для опций и шифров. (Внесено Кристианом Хаймсом в bpo-28043).

Сессия SSL может быть скопирована с одного клиентского соединения на другое с помощью нового класса SSLSession. Возобновление сеанса TLS может ускорить начальное рукопожатие, уменьшить задержку и повысить производительность (Внесено Кристианом Хаймсом в bpo-19500 на основе проекта Алекса Вархока).

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

Все константы и флаги были преобразованы в IntEnum и IntFlags. (Внесено Кристианом Хаймсом в bpo-28025).

Добавлены специфические для сервера и клиента протоколы TLS для SSLContext. (Внесено Кристианом Хаймсом в bpo-28085).

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

статистика

Была добавлена новая функция harmonic_mean(). (Внесено Стивеном Д’Апрано в bpo-27181).

struct

struct теперь поддерживает плавающие числа половинной точности IEEE 754 через спецификатор формата 'e'. (Вклад Илая Стивенса, Марка Дикинсона в bpo-11734).

подпроцесс

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

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

sys

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

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

telnetlib

telnetlib.Telnet теперь является менеджером контекста (внесен Стефаном Виртелом в bpo-25485).

время

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

timeit

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

timeit теперь предупреждает о существенном (4-кратном) расхождении между лучшим и худшим временем. (Внесено Сергеем Сторчакой в bpo-23552).

tkinter

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

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

(Внесено Эмануэлем Барри в bpo-26823).

tracemalloc

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

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

(Внесено Виктором Стиннером в bpo-26588).

набор текста

Поскольку модуль typing стал provisional, все изменения, внесенные в 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(), для проверки того, был ли вызван объект mock. (Внесено Амитом Саха в bpo-26323).

  • Метод Mock.reset_mock() теперь имеет два необязательных аргумента, ограничивающихся ключевыми словами: возвращаемое_значение и боковой_эффект. (Внесено Кушалом Дасом в bpo-21271).

urllib.request

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

urllib.robotparser

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

venv

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

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

В функцию warnings.warn_explicit() добавлен новый необязательный параметр source: уничтоженный объект, испустивший 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()

Отслеживание «Object allocated at» является новым и отображается только в том случае, если tracemalloc отслеживает выделение памяти Python и если модуль warnings уже был импортирован.

winreg

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

winsound

Позволяет передавать аргументы с ключевыми словами в Beep, MessageBeep и PlaySound (bpo-27982).

xmlrpc.client

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

zip-файл

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

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

zlib

Функции compress() и decompress() теперь принимают аргументы в виде ключевых слов. (Вклад внесли Авив Паливода в bpo-26243 и Сян Чжан в bpo-16764 соответственно).

Оптимизации

  • Интерпретатор Python теперь использует 16-битный wordcode вместо bytecode, что позволило оптимизировать ряд опкодов. (Вклад Демура Румеда при участии и рецензиях Сергея Сторчака и Виктора Стиннера в bpo-26647 и bpo-28050).

  • Класс asyncio.Future теперь имеет оптимизированную реализацию на языке C. (Вклад Юрия Селиванова и Наоки Инады в bpo-26081).

  • Класс asyncio.Task теперь имеет оптимизированную реализацию на языке C. (Внесено Юрием Селивановым в bpo-28544).

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

  • Декодер ASCII теперь работает в 60 раз быстрее для обработчиков ошибок surrogateescape, ignore и replace (Внесено Виктором Стиннером в bpo-24870).

  • Кодировщики ASCII и Latin1 теперь работают в 3 раза быстрее для обработчика ошибок surrogateescape (внесено Виктором Стиннером в bpo-25227).

  • Кодировщик UTF-8 теперь в 75 раз быстрее для обработчиков ошибок ignore, replace, surrogateescape, surrogatepass (Внесено Виктором Стиннером в bpo-25267).

  • Декодер UTF-8 теперь работает в 15 раз быстрее для обработчиков ошибок ignore, replace и surrogateescape (Внесено Виктором Стиннером в bpo-25301).

  • bytes % args теперь работает в 2 раза быстрее. (Внесено Виктором Стиннером в bpo-25349).

  • bytearray % args теперь работает в 2,5-5 раз быстрее. (Внесено Виктором Стиннером в bpo-25399).

  • Оптимизируйте bytes.fromhex() и bytearray.fromhex(): теперь они работают в 2 - 3,5 раза быстрее. (Внесено Виктором Стиннером в bpo-25401).

  • Оптимизация bytes.replace(b'', b'.') и bytearray.replace(b'', b'.'): до 80 % быстрее. (Внесено Джошем Снайдером в bpo-26574).

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

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

  • Передача keyword arguments в функцию имеет накладные расходы по сравнению с передачей positional arguments. Теперь в функциях расширения, реализованных с использованием Argument Clinic, эти накладные расходы значительно снижены. (Внесено Сергеем Сторчакой в bpo-27574).

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

  • Оптимизирована работа globbing в pathlib с помощью os.scandir(); теперь она работает примерно в 1,5–4 раза быстрее. (Внесено Сергеем Сторчакой в bpo-26032).

  • Значительно улучшена производительность парсинга, итерации и глубокого копирования xml.etree.ElementTree. (Вклад Сергея Сторчака в bpo-25638, bpo-25873 и bpo-25869).

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

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

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

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

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

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

  • Новый Py_FinalizeEx() API, который указывает, не удалось ли выполнить промывку буферизованных данных. (Внесено Мартином Пантером в bpo-5319).

  • PyArg_ParseTupleAndKeywords() теперь поддерживает positional-only parameters. Параметры, задаваемые только позициями, определяются пустыми именами. (Внесено Сергеем Сторчакой в bpo-26282).

  • Метод PyTraceback_Print теперь сокращает длинные последовательности повторяющихся строк как "[Previous line repeated {count} more times]". (Внесено Эмануэлем Барри в bpo-26823).

  • Новая функция PyErr_SetImportErrorSubclass() позволяет указать подкласс ImportError для повышения уровня. (Внесено Эриком Сноу в bpo-15767).

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

  • Новая функция PyOS_FSPath() возвращает представление файловой системы в виде path-like object. (Внесено Бреттом Кэнноном в bpo-27186).

  • Функции PyUnicode_FSConverter() и PyUnicode_FSDecoder() теперь будут принимать path-like objects.

Прочие улучшения

  • Когда --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)]
    

Утратившие актуальность

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

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

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

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

Теперь ожидается, что метод __aiter__() будет возвращать асинхронный итератор напрямую, а не возвращать awaitable, как раньше. В первом случае будет срабатывать DeprecationWarning. Обратная совместимость будет устранена в Python 3.7. (Внесено Юрием Селивановым в bpo-27243).

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

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

Утратившие актуальность модули, функции и методы Python

asynchat

В настоящее время asynchat упразднен в пользу asyncio. (Внесено Mariatta в bpo-25002).

asyncore

В настоящее время asyncore упразднен в пользу asyncio. (Внесено Mariatta в bpo-25002).

dbm

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

distutils

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

группа

Поддержка нецелых аргументов в getgrgid() была отменена. (Внесено Сергеем Сторчакой в 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

Недокументированная поддержка общего bytes-like objects в качестве путей в функциях os, compile() и аналогичных функциях теперь не поддерживается. (Внесено Сергеем Сторчакой в bpo-25791 и bpo-26754).

re

Поддержка встроенных флагов (?letters) в середине регулярного выражения была устаревшей и будет удалена в одной из следующих версий Python. Флаги в начале регулярного выражения по-прежнему разрешены. (Внесено Сергеем Сторчакой в 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. (Внесено Кристианом Хаймсом в bpo-28022).

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

tkinter

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

venv

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

xml

  • xml

xml

xml

xml

xml

Удалено

Удалено

  • Удалено

  • Удалено

  • Класс 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 для чтения сжатых текстовых файлов в режиме universal newlines.

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

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

Переход на Python 3.6

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

Изменения в поведении команды „python“

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

Изменения в API Python

  • open() больше не позволит сочетать флаг режима 'U' с '+'. (Внесено Джеффом Балогом и Джоном О’Коннором из 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-битного целого типа для дельты номера строки, но это требуется только для поддержки приложений, использующих отрицательную дельту номера строки. Формат co_lnotab и способы его декодирования см. в Objects/lnotab_notes.txt, а обоснование - в 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 теперь равны keyword-only. (Внесено Сергеем Сторчакой в 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 был удален и больше не используется. Вместо этого формат gzipped tarfile используется по умолчанию на всех платформах, и выбор для конкретной платформы не делается. В средах, где дистрибутивы собираются под Windows и требуются zip-дистрибутивы, сконфигурируйте проект с файлом setup.cfg, содержащим следующее:

    [sdist]
    formats=zip
    

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

  • В модуле urllib.request и методе http.client.HTTPConnection.request(), если не указано поле заголовка Content-Length и тело запроса представляет собой файловый объект, он теперь отправляется с кодировкой HTTP 1.1 chunked. Если файловый объект должен быть отправлен на сервер 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.write() теперь возвращает количество записанных байт, как и другие методы записи. (Внесено Якубом Стасяком в bpo-26335).

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

  • re.sub() теперь выдает ошибку при недопустимых ссылках на числовые группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых групповых ссылок теперь включает индекс группы и позицию ссылки. (Вклад SilentGhost, Serhiy Storchaka в 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__(), должны будут обновить свои реализации, чтобы они поднимали новый подкласс, когда модуль вообще не может быть найден. Реализаторам совместимых плагинов к системе импорта по умолчанию не нужно вносить никаких изменений, так как система импорта по умолчанию будет поднимать новый подкласс, когда это необходимо.

Изменения в API языка C

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

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

Изменения байткода CPython

В Python 3.6 произошло несколько серьезных изменений в bytecode.

  • Интерпретатор Python теперь использует 16-битный wordcode вместо bytecode. (Внесено Демуром Румедом при участии и рецензиях Сергея Сторчака и Виктора Стиннера в bpo-26647 и bpo-28050).

  • Новые опкоды FORMAT_VALUE и BUILD_STRING как часть реализации formatted string literal. (Вклад Эрика Смита в bpo-25483 и Сергея Сторчака в bpo-27078).

  • Новый опкод BUILD_CONST_KEY_MAP для оптимизации создания словарей с постоянными ключами. (Внесено Сергеем Сторчакой в 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 были удалены. (Вклад Демура Румеда в bpo-27095 и Сергея Сторчака в bpo-27213, bpo-28257).

  • Новые опкоды SETUP_ANNOTATIONS и STORE_ANNOTATION были добавлены для поддержки нового синтаксиса variable annotation. (Внесено Иваном Левкивским в bpo-27985).

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

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

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

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

Также определяются более избирательные цели регенерации - подробности см. в разделе Makefile.pre.in.

(Внесено Виктором Стиннером в bpo-23404).

Added in version 3.6.2.

Удаление цели сборки make touch

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

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

(Внесено Виктором Стиннером в bpo-23404).

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

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

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

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

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

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

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

В версии 3.6.7 модуль tokenize теперь неявно выдает токен NEWLINE, когда на вход подается информация, не содержащая новой строки в конце. Такое поведение теперь соответствует тому, что делает внутренний токенизатор языка C. (Внесено Аммаром Аскаром в bpo-33899).

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

По соображениям безопасности параметр reuse_address asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением параметра сокета SO_REUSEADDR в UDP. Для получения более подробной информации см. документацию по loop.create_datagram_endpoint(). (Внесено Кайлом Стэнли, Антуаном Питру и Юрием Селивановым в bpo-37228).

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

В предыдущих версиях Python в качестве разделителей параметров запроса можно было использовать и ;, и & в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, а по умолчанию используется &. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они используют затронутые функции внутри. Более подробную информацию можно найти в соответствующей документации. (Внесено Адамом Голдшмидтом, Сентхилом Кумараном и Кеном Джином в bpo-42967).

Заметные изменения в 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).