Документация 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, что включает статические маркеры для следующих событий в интерпретаторе:

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

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

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

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

Подробнее в Инструментирование 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. (Добавлено Brett Cannon в 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 и IntFlags. Оба используются для определения констант, которые можно комбинировать с помощью побитовых операторов. (Автор: Ethan Furman в 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(). (Автор: 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 и IDLEidlelib 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:

Множество исправлений для автодополнения. (Вклад Луи Лу в bpo-15786.)

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

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

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

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

Новое в версии 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 на вкладке General диалогового окна Settings. Меньшее количество строк, но возможно очень длинных, можно свернуть, щелкнув правой кнопкой по выводу. Свёрнутый вывод можно развернуть на месте двойным щелчком по кнопке, либо в буфер обмена или отдельное окно щелчком правой кнопки по кнопке. (Предложено 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-файлы). (Предложено Вольфгангом Лангнером в 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. (Предложено Омаром Сандовалом, задача: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 и IntFlags. (Автор: Christian Heimes в bpo-28025.)

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

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

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

Добавлены методы trace_add(), 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 теперь использует фрагментированную передачу. (Авторы: Demian Brecht и Rolf Krahl, 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 конструктора 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.)

Устаревшие функции и типы 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 *. (Авторы: Joel Taddei и Jacek Kołodziej; 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.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 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

В 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.)