Что нового в 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 считается стабильным.

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

  • Модуль 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 в Python 3.5 появилась поддержка собственных короутинов и синтаксиса async / await. Заметным ограничением реализации в 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 в выражениях list, set, dict comprehensions и генераторах:

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

Теперь можно настраивать создание подклассов без использования метакласса. Метод класса new __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 для того, чтобы сделать оценку фреймов подключаемой на уровне Си. Это позволит таким инструментам, как отладчики и JIT, перехватывать оценку кадров до начала выполнения кода Python. Это позволяет использовать альтернативные реализации оценки для кода Python, отслеживать оценку кадров и т.д.

Этот API не является частью ограниченного C API и помечен как частный, чтобы показать, что использование этого 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, скомпилированном в режиме release.

При ошибке отладочные крючки на распределителях памяти 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-узел ast.Constant. Он может использоваться внешними оптимизаторами 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% быстрее. (Вклад Юрия Селиванова и INADA Naoki в 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 для соответствия формату, используемому комплексным репринтом. (Внесено Марком Дикинсоном в bpo-23229).

коллекции

Новый абстрактный базовый класс Collection был добавлен для представления классов итерируемых контейнеров. (Вклад Ивана Левкивского, docs Нила Гирдхара в 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__() which returns self and leaves __exit__(). Соответствующий класс был добавлен в модуль typing как typing.ContextManager. (Внесено Бреттом Кэнноном в bpo-25609).

дататайм

Классы 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.

электронная почта

Новый 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:

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

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

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

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

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

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

Пересмотрена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до maxlines. Щелчок на контекстной строке переводит редактор на эту строку. Цвета контекста для пользовательских тем добавлены на вкладку Выделения диалога Настройки. (Вклад внесли Шерил Сабелла и Терри Ян Риди в 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 и устаревшего API inspect.getargspec(), ранее документированная депривация 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).

математика

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

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

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

os

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

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 для управления тем, какие символы рассматриваются как знаки препинания. (Внесено Vinay Sajip в 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. (Вклад внес Омар Сандовал, выпуск:26273).

socketserver

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

Атрибут wfile классов StreamRequestHandler теперь реализует интерфейс io.BufferedIOBase writable. В частности, вызов 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).

статистика

Добавлена новая функция 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

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

время

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

timeit

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

timeit теперь предупреждает, когда существует значительная (4x) разница между лучшим и худшим временем. (Внесено Сергеем Сторчакой в 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 теперь возвращается к использованию кодировки передачи в виде кусков. (Вклад Демиана Брехта и Рольфа Краля в 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).

zipfile

Новый метод класса 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. (Вклад Юрия Селиванова и INADA Naoki в 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).

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

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

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

Изменения в API Build и C

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

  • Кросс-компиляция CPython с Android NDK и уровнем Android API, установленным на 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(), который указывает на неудачу при промывке буферизованных данных. (Внесено Мартином Пантером в 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, а в Python 3.7 будет вызывать RuntimeError. Подробности смотрите в разделе 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 в конструкторе 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).

Устаревшие функции и типы API языка C

Недокументированные функции PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() и PyUnicode_AsDecodedUnicode() теперь устарели. Вместо них используйте generic codec based API.

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

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

Удалено

Удаление API и функций

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

  • inspect.getmoduleinfo() был удален (был устаревшим с CPython 3.3). inspect.getmodulename() следует использовать для получения имени модуля для заданного пути. (Вклад Юрия Селиванова в 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 для чтения сжатых текстовых файлов в режиме 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-битного целочисленного типа для дельты номера строки, но это требуется только для поддержки приложений, использующих отрицательную дельту номера строки. Формат Objects/lnotab_notes.txt и способы его декодирования см. в co_lnotab, а обоснование см. в PEP 511.

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

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

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

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

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

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

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

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

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

  • Аргументом decode_data для конструкторов smtpd.SMTPChannel и smtpd.SMTPServer теперь по умолчанию является False. Это означает, что аргумент, передаваемый в process_message(), теперь по умолчанию является объектом байта, а в 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. (Вклад внес Vinay Sajip из 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__(), должны будут обновить свои реализации, чтобы они поднимали новый подкласс, когда модуль не может быть найден вообще. Реализаторам совместимых плагинов к системе импорта по умолчанию не нужно делать никаких изменений, так как система импорта по умолчанию будет поднимать новый подкласс, когда это необходимо.

Изменения в 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).

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

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

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

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

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

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

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

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

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

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

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

В версии 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).

Вернуться на верх