Что нового в Python 3.6
Авторы: | Элвис Пранскевичус, Юрий Селиванов |
---|
В этой статье объясняются новые возможности Python 3.6 по сравнению с 3.5. Python 3.6 был выпущен 23 декабря 2016 года. Полный список изменений см. в новостях.
См.также
PEP 494 — Расписание релиза Python 3.6
Резюме. Основные моменты релиза
Новые возможности синтаксиса:
- PEP 498, форматированные строковые литералы.
- PEP 515, подчеркивание в числовых литералах.
- PEP 526, синтаксис для аннотаций переменных.
- PEP 525, асинхронные генераторы.
- PEP 530: асинхронные понимания.
Новые модули библиотеки:
Улучшения реализации CPython:
- Тип dict был повторно реализован для использования более компактного представления, основанного на предложении Раймонда Хеттингера и аналогичной PyPy реализации словаря. Это привело к тому, что словари стали тратить на 20-25% меньше памяти по сравнению с Python 3.5.
- Настройка создания классов была упрощена с помощью нового протокола.
- Теперь сохранён порядок определения атрибута класса.
- Порядок элементов в
**kwargs
теперь соответствует порядку, в котором ключевые аргументы были переданы в функцию. - Добавлены датчики DTrace и SystemTap.
- Новую переменную среды PYTHONMALLOC теперь можно использовать для отладки выделения памяти интерпретатора и ошибок доступа.
Значительные улучшения в стандартной библиотеке:
- Модуль
asyncio
получил новые функции, значительные улучшения удобства использования и производительности, а также значительное количество исправлений ошибок. Начиная с Python 3.6 модульasyncio
больше не является временным, и его API считается стабильным. - Новый протокол пути к файловой системе был реализован для поддержки путеподобных объектов. Все функции стандартной библиотеки, работающие с путями, были обновлены для работы с новым протоколом.
- Модуль
datetime
получил поддержку значения местного времени. - Модуль
typing
получил некоторое кол-во улучшений. - Модуль
tracemalloc
был значительно переработан и теперь используется для обеспечения лучшего вывода дляResourceWarning
, а также для лучшей диагностики ошибок выделения памяти. См. секцию PYTHONMALLOC для получения дополнительной информации.
Улучшения безопасности:
- Новый модуль
secrets
был добавлен для упрощения создания криптографически стойких псевдослучайных чисел, подходящих для управления секретами, такими как аутентификация учётной записи, токены и т.п. - В Linux
os.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, если пользователь пропускает версию (через аргументы командной строки или файл конфигурации). Обработка строк шебанг остаётся неизменной — в этом случае «python» относится к Python 2. python.exe
иpythonw.exe
помечены как поддерживающие длинный путь, что означает, что ограничение пути в 260 символов больше не применяется. Подробности см. в снятие ограничения MAX_PATH.- Можно добавить файл
._pth
, чтобы включить изолированный режим и полностью указать все пути поиска, чтобы избежать поиска в реестре и среде. См. документацию для получения дополнительной информации. - Файл
python36.zip
теперь работает как ориентир для выводаPYTHONHOME
. См. документацию для получения дополнительной информации.
Новые особенности
PEP 498: форматированные строковые литералы
PEP 498 представляет новый тип строковых литералов: f-strings или форматированные строковые литералы.
Форматированные строковые литералы имеют префикс 'f'
и аналогичны строкам
формата, принятым str.format()
. Они содержат поля замены, окружённые
фигурными скобками. Поля замены — это выражения, которые вычисляются во время
выполнения, а затем форматируются с использованием протокола format()
:
>>> name = "Миша"
>>> f"Он сказал, что его зовут {name}."
'Он сказал, что его зовут Миша.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"реультат: {value:{width}.{precision}}" # вложенные поля
'реультат: 12.35'
См.также
- PEP 498 – Литеральная интерполяция строк.
- PEP написан и реализован Эриком В. Смитом.
PEP 526: синтаксис для аннотаций переменных
PEP 484 представил стандарт для аннотаций типов параметров функций, также известных как подсказки типов. Данный PEP добавляет в Python синтаксис для аннотирования типов переменных, включая переменные класса и переменные экземпляра:
primes: List[int] = []
captain: str # Примечание: нет начального значения!
class Starship:
stats: Dict[str, int] = {}
Как и в случае с аннотациями функций, интерпретатор Python не придаёт особого
значения аннотациям переменных и сохраняет их только в атрибуте
__annotations__
класса или модуля.
В отличие от объявлений переменных в статически типизированных языках, цель
синтаксиса аннотаций — предоставить простой способ указать метаданные
структурированного типа для сторонних инструментов и библиотек с помощью
абстрактного синтаксического дерева и атрибута __annotations__
.
PEP 515: символы подчеркивания в числовых литералах
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 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 добавлена поддержка использования async for
в списках,
множествах, словарных включениях и генераторах:
result = [i async for i in aiter() if i % 2]
Кроме того, await
выражения поддерживаются во всех видах включений:
result = [await fun() for fun in funcs if await condition()]
См.также
- PEP 530 – Асинхронные включения
- PEP написан и реализован Юрием Селивановым.
PEP 487: более простая настройка создания класса
Теперь можно настроить создание подкласса без использования метакласса. Новый
метод класса __init_subclass__
будет вызываться в базовом классе всякий
раз, когда создаётся новый подкласс:
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
Чтобы обеспечить правильную работу вызовов super()
без аргументов из
реализаций __init_subclass__()
, пользовательские метаклассы
должны гарантировать, что новая запись пространства имён __classcell__
распространяется на type.__new__
(как приведено в
Создание объекта класса).
См.также
- PEP 487 – Более простая настройка создания класса
- PEP написан и реализован Мартином Тейхманном.
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'ожидается целое число в {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: добавление протокола пути к файловой системе
Пути файловой системы исторически представлялись как объекты 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: значение местного времени
В большинстве мест мира были и будут времена, когда местные часы переводили назад. В это время вводятся интервалы, в которых местные часы показывают одно и то же время дважды в один и тот же день. В данных ситуациях информация, отображаемая на локальных часах (или хранящаяся в экземпляре даты и времени Python), недостаточна для определения момента времени.
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 (Юникод), а не байтов. Однако есть ситуации, когда использование байтов является достаточным и правильным.
До версии 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 теперь будет принимать все символы Юникод и
правильно читать str объекты для Python кода. sys.stdin
, sys.stdout
и
sys.stderr
теперь по умолчанию используют кодировку utf-8.
Это изменение применяется только при использовании интерактивной консоли, а не
при перенаправлении файлов или каналов (pipes).
Чтобы вернуться к предыдущему поведению
при использовании интерактивной консоли, установите
PYTHONLEGACYWINDOWSSTDIO
.
См.также
- PEP 528 – Изменение кодировки консоли Windows на UTF-8
- PEP написан и реализован Стивом Дауэром.
PEP 520: сохранение порядка определения атрибутов класса
Атрибуты в теле определения класса имеют естественный порядок: тот же порядок,
в котором имена появляются в источнике. Данный порядок теперь сохраняется в
атрибуте нового класса __dict__
.
Кроме того, эффективное пространство имён класса по умолчанию исполняется (возвращенное из type.__prepare__()) теперь является отображением, сохраняющим порядок вставки.
См.также
- PEP 520 – Сохранение порядка определения атрибутов класса
- PEP написан и реализован Эриком Сноу.
PEP 468: сохранение порядка ключевых аргументов
**kwargs
в сигнатуре функции теперь гарантированно является отображением,
сохраняющим порядок вставки.
См.также
- PEP 468 – Сохранение порядка ключевых аргументов
- PEP написан и реализован Эриком Сноу.
Новая реализация dict
Тип dict теперь использует «компактное» представление,
основанное на предложении Раймонда Хеттингера,
которое было впервые реализовано в PyPy. Использование памяти новым dict()
на 20-25% меньше по
сравнению с Python 3.5.
Аспект сохранения порядка в новой реализации считается деталью реализации, и на него не следует полагаться (может измениться в будущем, но желательно иметь эту новую реализацию словаря в языке для нескольких релизов, прежде чем изменять спецификацию языка для обязательной семантики сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где все ещё действует случайный порядок итераций, например в Python 3.5).
(Предоставлено Инада Наоки в bpo-27350. Идея первоначально предложена Рэймондом Хеттингером.)
PEP 523: добавление API вычисления фреймов в CPython
Хотя Python предоставляет обширную поддержку для настройки выполнения кода, есть одно место, где этого нет ,— это вычисление объектов фрейма. Если вам нужен какой-то способ перехватить вычисление фрейма в Python, то не было никакого способа без прямого манипулирования указателями функций для определённых функций.
PEP 523 предоставляет API, чтобы сделать вычисление фрейма подключаемой на уровне C. Это позволит таким инструментам, как отладчики и JIT, перехватывать вычисление фрейма до того, как начнётся выполнение кода Python. Это позволяет использовать альтернативные реализации вычисления для кода Python, вычисление фреймов отслеживания и т. д.
Данный API не является частью ограниченного API C и помечен как закрытый, чтобы сигнализировать о том, что использование этого API будет ограниченным и применимым только к очень избранным низкоуровневым вариантам использования. Семантика API будет меняться вместе с Python по мере необходимости.
См.также
- PEP 523 – Добавление API вычисления фреймов в CPython
- PEP, написанный Бреттом Кэнноном и Дино Виландом.
Переменная среды PYTHONMALLOC
Новая переменная среды PYTHONMALLOC
позволяет настраивать
распределители памяти Python и устанавливать перехватчики отладки.
Теперь можно установить перехватчики отладки в распределителях памяти Python на
Python, скомпилированном в режиме релиза с использованием
PYTHONMALLOC=debug
. Эффекты отладочных хуков:
- Вновь выделенная память заполняется байтом
0xCB
- Освобожденная память заполняется байтом
0xDB
- Обнаружение нарушений API распределителя памяти Python. Например,
PyObject_Free()
вызывает блок памяти, выделенныйPyMem_Malloc()
. - Обнаружение записи перед запуском буфера (опустошение буфера)
- Обнаружение записи после окончания буфера (буфер переполняется)
- Убедиться, что
GIL удерживается при вызове
функций распределителя доменов
PYMEM_DOMAIN_OBJ
(например,PyObject_Malloc()
) иPYMEM_DOMAIN_MEM
(например,PyMem_Malloc()
).
Проверка наличия GIL также является новой функцией Python 3.6.
См. функцию PyMem_SetupDebugHooks()
для отладочных хуков в
распределителях памяти Python.
Теперь также можно принудительно использовать распределитель malloc()
библиотеки C для всех выделений памяти Python с помощью
PYTHONMALLOC=malloc
. Это полезно при использовании отладчиков внешней
памяти, таких как Valgrind, для Python скомпилированном в режиме релиза.
В случае ошибки перехватчики отладки в распределителях памяти Python теперь
используют модуль tracemalloc
для получения трассировки, где был выделен
блок памяти.
Пример фатальной ошибки при переполнении буфера с использованием python3.6 -X
tracemalloc=5
(сохранение 5 фреймов в трассировках):
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
Поддержка датчиков DTrace и SystemTap
Python теперь может быть собран с --with-dtrace
,
который включает статические
маркеры для следующих событий в интерпретаторе:
- вызов/возвращение функции
- сборка мусора начата/завершена
- строка кода выполняется.
Это можно использовать для инструментария запуска интерпретаторов в рабочей среде без необходимости перекомпилировать определённые отладочные сборки или предоставлять код профилирования/отладки для приложения.
Подробнее в Инструментирование CPython с помощью DTrace и SystemTap.
Текущая реализация тестируется на Linux и macOS. Дополнительные маркеры могут быть добавлены в будущем.
(Предоставлено Лукашем Лангой в bpo-21590, на основе исправлений Хесуса Сеа Авиона, Дэвида Малкольма и Нихила Бенеша)
Другие языковые изменения
Некоторые небольшие изменения, внесенные в основной язык Python:
- Оператор
global
илиnonlocal
теперь должен отображаться в текстовом виде перед первым использованием затронутого имени в той же области. Раньше это былSyntaxWarning
. - Теперь можно установить специальный метод на
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
Основная цель нового модуля secrets
— предоставить очевидный способ
надежной генерации криптографически стойких псевдослучайных значений,
подходящих для управления секретами, такими как аутентификация учётной записи,
токены и т.п.
Предупреждение
Обратите внимание, что генераторы псевдослучайных чисел в модуле
random
НЕ следует использовать в целях безопасности. Используйте
secrets
в Python 3.6+ и os.urandom()
в Python 3.5 и более
ранних версиях.
См.также
- PEP 506 – Добавление модуля secrets в стандартную библиотеку
- PEP написан и реализован Стивеном Д’Апрано.
Улучшенные модули
array
Исчерпанные итераторы 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()
, теперь принимают все виды ожидаемых объектов. (Предоставил Юрий Селиванов.) - Новая функция
run_coroutine_threadsafe()
для отправки корутин в событийные циклы из других потоков. (Предоставлено Винсентом Мишелем.) - Новый метод
Transport.is_closing()
для проверки закрытия транспорта. (Предоставил Юрий Селиванов.) - Метод
loop.create_server()
теперь может принимать список хостов. (Предоставлено Янном Сионно) - Новый метод
loop.create_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, которая ускоряет асинхронный код до 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
для соответствия формату, используемому комплексом repr.
(Предоставлено Марком Дикинсоном в 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
теперь можно пиклить.
(Предоставил Сергей Сторчака в bpo-26482.)
concurrent.futures
Конструктор класса ThreadPoolExecutor
теперь принимает необязательный
аргумент thread_name_prefix, позволяющий настраивать имена потоков,
создаваемых пулом. (Предоставлено Грегори П. Смитом в bpo-27664.)
contextlib
Добавлен класс contextlib.AbstractContextManager
, предоставляющий
абстрактный базовый класс для менеджеров контекста. Он обеспечивает разумную
реализацию по умолчанию для абстрактного метода __enter__() который
возвращается self
и выходит __exit__(). Соответствующий класс был добавлен в модуль
typing
как typing.ContextManager
. (Предоставлено Бреттом
Кэнноном в bpo-25609.)
datetime
Классы datetime
и time
имеют новый
атрибут fold
, используемый для устранения неоднозначности
местного времени, когда это необходимо. Многие функции в datetime
были
обновлены для поддержки устранения неоднозначности местного времени.
Дополнительную информацию см. в разделе Значение местного времени. (Предоставлено Александром Белопольским в
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 для более подробной информации.
Новый API электронной почты, включенный с помощью ключевого слова policy для
различных конструкторов, больше не является временным. Документация
email
была реорганизована и переписана, чтобы сосредоточиться на новом
API, сохранив при этом старую документацию для устаревшего API. (Предоставлено
Р. Дэвидом Мюрреем в bpo-24277.)
Все классы email.mime
теперь принимают необязательное ключевой аргумент
policy. (Предоставлено Berker Peksag в bpo-27331.)
DecodedGenerator
теперь поддерживает ключевой
аргумент policy.
Существует новый атрибут policy
,
message_factory
, который определяет, какой класс
используется по умолчанию, когда парсер создаёт новые объекты сообщения. Для
политики email.policy.compat32
это Message
, для
новых политик — EmailMessage
. (Предоставлено Р. Дэвидом
Мюрреем в bpo-20476.)
encodings
В 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()
теперь поддерживают тела
запросов кодирования фрагментов. (Предоставлено Демианом Брехтом и Рольфом
Кралом в 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:
Браузер модулей (в меню «File», ранее называвшийся «Class Browser») теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Предоставлено Гильерме Поло, Шерил Сабелла и Терри Джен Риди в bpo-1612262.)
Функции IDLE, ранее реализованные в виде расширений, теперь реализованы как обычные функции. Их настройки были перенесены с табы «Extensions» на другие вкладки диалога. (Предоставлено Чарльзом Вольгангером и Терри Джен Риди в bpo-27099.)
Диалоговое окно «Settings» («Options», «Configure IDLE») было частично переписано для улучшения внешнего вида и функциональности. (Соавторы Шерил Сабелла и Терри Ян Риди в нескольких выпусках)
Новое в версии 3.6.4:
Образец шрифта теперь включает множество нелатинских символов, чтобы пользователи могли лучше видеть эффект выбора определённого шрифта. (Предоставлено Терри Яном Риди в bpo-13802.) Образец можно отредактировать, включив в него другие символы. (Предоставил Сергей Сторчака в bpo-31860.)
Новое в версии 3.6.6:
Параметр контекста кода редактора изменён. Box отображает все строки контекста до maxlines. Щелчок по строке контекста переводит редактор на эту строку. Контекстные цвета для пользовательских тем добавлены на вкладку Highlights диалогового окна Settings. (Предоставлено Шерил Сабелла и Терри Ян Риди в bpo-33642, bpo-33768 и bpo-33679.)
В Windows новый вызов API сообщает Windows, что tk масштабируется для DPI. В Windows 8.1+ или 10 с неизменными свойствами совместимости DPI двоичного файла Python и разрешением монитора выше 96 DPI это должно сделать текст и линии более четкими. В противном случае это не должно иметь никакого эффекта. (Предоставлено Терри Яном Риди в bpo-33656.)
Новое в версии 3.6.7:
Вывод в N строк (по умолчанию 50) сжимается до кнопки. N можно изменить в разделе PyShell на странице «General» диалогового окна «Settings». Меньшее количество, но, возможно, очень длинных строк можно сжать, щелкнув правой кнопкой мыши на выходе. Сжатый вывод можно развернуть на месте двойным нажатием кнопки или в буфер обмена или отдельное окно, нажав правой кнопкой мыши кнопку. (Предоставлено Талем Эйнатом в 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()
теперь принимают
путеподобный объект.
inspect
Функция inspect.signature()
теперь сообщает о
неявных параметрах .0
, сгенерированных компилятором для областей понимания
и выражений генератора, как если бы они были только позиционными параметрами с
именем implicit0
. (Предоставлено Йелле Зейлстра в 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.)
logging
Добавлен новый метод WatchedFileHandler.reopenIfNeeded()
, чтобы добавить
возможность проверить, нужно ли повторно открывать файл журнала. (Предоставлено
Мариан Хорбан в bpo-24884.)
math
В модули math
и cmath
добавлена константа тау (τ).
(Предоставлено Лизой Роуч в bpo-12345, подробности см. в PEP 628)
multiprocessing
Прокси-объекты, возвращённые
multiprocessing.Manager()
, теперь могут быть вложенным. (Предоставлено
Дэвином Поттсом в bpo-6766.)
os
См. сводку PEP 519 для получения подробной
информации о том, как модули os
и os.path
теперь поддерживают
путеподобный объект.
scandir()
теперь поддерживает пути bytes
в Windows.
Новый метод close()
позволяет явно закрывать итератор
scandir()
. Итератор scandir()
теперь поддерживает протокол
контекстного менеджера.
Если итератор scandir()
не исчерпан и не закрыт
явно, в его деструкторе будет выдано ResourceWarning
. (Предоставлено
Сергеем Сторчакой в bpo-25994.)
В Linux os.urandom()
теперь блокируется до тех пор, пока системный пул
случайной энтропии не будет инициализирован для повышения безопасности. См.
PEP 524 для обоснования.
Системный вызов Linux getrandom()
(получение случайных байтов) теперь
представлен как новая функция os.getrandom()
. (Предоставлено Виктором
Стиннером, часть PEP 524)
pathlib
pathlib
теперь поддерживает
путеподобные объекты. (Предоставлено Бреттом Кэнноном в bpo-27186.)
Подробнее см. в сводке PEP 519.
pdb
Конструктор класса Pdb
имеет новый необязательный аргумент
readrc для управления чтением файлов .pdbrc
.
pickle
Объекты, для которых требуется вызов __new__
с ключевыми аргументами,
теперь могут быть обработаны с использованием
pickle протоколов
старше версии протокола 4. Протокол версии 4 уже поддерживает
данный случай. (Предоставлено Сергеем Сторчакой в bpo-24164.)
pickletools
pickletools.dis()
теперь выводит неявный индекс мемо для кода операции
MEMOIZE
. (Предоставлено Сергеем Сторчакой в bpo-25382.)
pydoc
Модуль pydoc
научился учитывать переменную среды MANPAGER
.
(Предоставлено Матиасом Клозе в bpo-8637.)
help()
и pydoc
теперь могут перечислять именованные поля кортежа в
том порядке, в котором они были определены, а не в алфавитном порядке.
(Предоставлено Рэймондом Хеттингером в bpo-24879.)
random
Новая функция choices()
возвращает список элементов заданного
размера из данной совокупности с необязательными весами. (Предоставлено
Рэймондом Хеттингером в bpo-18844.)
re
Добавлена поддержка модификаторов span в регулярных выражениях. Примеры:
'(?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
теперь поддерживают индексподобные объекты
в качестве групповых индексов.
(Предоставлено Йерун Демейер и Сян Чжан в bpo-27177.)
readline
Добавлен set_auto_history()
для включения или отключения
автоматического добавления ввода в список истории. (Предоставлено Тайлером
Кромптоном в bpo-26870.)
rlcompleter
Имена частных и специальных атрибутов теперь опускаются, если префикс не начинается с подчеркивания. После некоторых завершенных ключевых добавляется пробел или двоеточие. (Предоставлено Сергеем Сторчакой в bpo-25011 и bpo-25209.)
shlex
shlex
имеет много
улучшений совместимости с оболочкой
благодаря новому аргументу punctuation_chars для
управления тем, какие символы обрабатываются как знаки препинания.
(Предоставлено Винаем Саджипом в bpo-1521950.)
site
При указании путей для добавления к sys.path
в файле .pth теперь вы
можете указывать пути к файлам поверх каталогов (например, zip-файлы).
(Предоставлено Вольфгангом Лангнером в bpo-26587).
sqlite3
sqlite3.Cursor.lastrowid
теперь поддерживает оператор REPLACE
.
(Предоставлено Алексом ЛордТорсеном в bpo-16864.)
socket
Функция 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.)
Модуль socket теперь поддерживает семейство адресов 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
, теперь
поддерживают протокол контекстного менеджера.
(Предоставлено Авивом Паливода в bpo-26404.)
Атрибут wfile
классов
StreamRequestHandler
теперь реализует перезаписываемый
интерфейс io.BufferedIOBase
. В частности, при вызове
write()
теперь гарантированно отправляются данные в
полном объеме. (Предоставлено Мартином Пантером в bpo-26721.)
ssl
ssl
поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия 1.0.2.
(Предоставлено Кристианом Хеймсом в bpo-26470.)
3DES был удалён из наборов шифров по умолчанию, и были добавлены множества шифров ChaCha20 Poly1305. (Предоставлено Кристианом Хеймсом в bpo-27850 и bpo-27766.)
SSLContext
имеет лучшую конфигурацию по умолчанию для параметров
и шифров. (Предоставлено Кристианом Хеймсом в bpo-28043.)
Сеанс SSL можно скопировать из одного подключения на стороне клиента в другое с
помощью нового класса SSLSession
. Возобновление TLS сеанса может
ускорить первоначальное рукопожатие, уменьшить задержку и повысить
производительность (предоставлено Кристианом Хеймсом в bpo-19500 на основе
черновика Алекса Уорхока.)
Новый метод get_ciphers()
можно использовать для
получения списка включенных шифров в порядке их приоритета.
Все константы и флаги преобразованы в IntEnum
и
IntFlags
. (Предоставлено Кристианом Хеймсом в bpo-28025.)
Были добавлены специфичные для сервера и клиента протоколы TLS для
SSLContext
. (Предоставлено Кристианом Хеймсом в bpo-28085.)
statistics
Добавлена новая функция harmonic_mean()
. (Предоставлено
Стивеном Д’Апрано в bpo-27181.)
struct
struct
теперь поддерживает числа с плавающей запятой половинной точности
IEEE 754 через спецификатор формата 'e'
. (Предоставлено Эли Стивенсом,
Марком Дикинсоном в bpo-11734.)
subprocess
Деструктор subprocess.Popen
теперь вызывает предупреждение
ResourceWarning
, если дочерний процесс все ещё выполняется. Используйте
протокол менеджера контекста (with proc: ...
) или явно вызвать метод
wait()
, чтобы прочитать статус выхода дочернего
процесса. (Предоставлено Виктором Стиннером в bpo-26741.)
Конструктор subprocess.Popen
и все функции, передающие ему аргументы,
теперь принимают аргументы encoding и errors. Указание любого из них
включит текстовый режим для потоков stdin, stdout и stderr.
(Предоставлено Стивом Дауэром в bpo-6135.)
sys
Новая функция getfilesystemencodeerrors()
возвращает имя режима
ошибки, используемого для преобразования между именами Юникод файлов
и байтовыми именами файлов. (Предоставлено Стивом Дауэром в bpo-27781.)
В Windows возвращаемое значение функции getwindowsversion()
теперь
включает поле platform_version, содержащее точную основную версию,
вспомогательную версию и номер сборки текущей операционной системы, а не
эмулируемую для процесса версию (предоставлено Стивом Дауэром в
bpo-27932).
telnetlib
Telnet
теперь является менеджером контекста (предоставлено
Стефаном Виртелем в bpo-25485).
time
Атрибуты 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
И модуль 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
Поскольку у модуля 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
теперь использует данные из Юникода 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-запроса есть файл или итерируемое тело (кроме байтового объекта),
но нет заголовка Content-Length
, а не выдается ошибка,
AbstractHTTPHandler
теперь возвращается к
использованию фрагментированного кодирования передачи. (Предоставлено Демианом
Брехтом и Рольфом Кралом в bpo-12319.)
urllib.robotparser
RobotFileParser
теперь поддерживает расширения
Crawl-delay
и Request-rate
. (Предоставлено Николаем Богойчевым в
bpo-16099.)
venv
venv
принимает новый параметр --prompt
. Данный параметр
предоставляет альтернативный префикс для виртуальной среды. (Предложено Лукашем
Бальцерзаком и перенесено в 3.6 Стефаном Виртелем в bpo-22829.)
warnings
В функцию 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 (most recent call first):» является новой и отображается только в том
случае, если tracemalloc
отслеживает выделение памяти Python и если
модуль warnings
уже был импортирован.
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-битный код слова вместо байт-кода, что сделало возможным ряд оптимизаций кода операции. (Предоставлено Демуром Румедом при участии и отзывах Сергея Сторчаки и Виктора Стиннера в bpo-26647 и bpo-28050.)
- У класса
asyncio.Future
теперь оптимизированная реализация C. (Предоставили Юрий Селиванов и Инада Наоки в bpo-26081.) - У класса
asyncio.Task
теперь оптимизированная реализация C. (Предоставил Юрий Селиванов в bpo-28544.) - Различные улучшения реализации в модуле
typing
(например, кэширование универсальных типов) позволяют повысить производительность до 30 раз и сократить объём памяти. - Декодер ASCII теперь работает до 60 раз быстрее для обработчиков ошибок
surrogateescape
,ignore
иreplace
(предоставлено Виктором Стиннером в bpo-24870). - Кодировщики ASCII и Latin1 теперь работают в 3 раза быстрее для обработчика
ошибок
surrogateescape
(предоставлено Виктором Стиннером в bpo-25227). - Кодировщик UTF-8 теперь работает в 75 раз быстрее для обработчиков ошибок
ignore
,replace
,surrogateescape
,surrogatepass
(предоставлено Виктором Стиннером в bpo-25267). - Декодер UTF-8 теперь работает до 15 раз быстрее для обработчиков ошибок
ignore
,replace
иsurrogateescape
(предоставлено Виктором Стиннером в bpo-25301). bytes % args
теперь до 2 раз быстрее. (Предоставлено Виктором Стиннером в bpo-25349).bytearray % args
теперь в 2,5-5 раз быстрее. (Предоставлено Виктором Стиннером в bpo-25399).- Оптимизированы
bytes.fromhex()
иbytearray.fromhex()
: теперь они в 2–3,5 раза быстрее. (Предоставлено Виктором Стиннером в bpo-25401). - Оптимизированы
bytes.replace(b'', b'.')
иbytearray.replace(b'', b'.')
: до 80 % быстрее. (Предоставлено Джошем Снайдером в bpo-26574). - Функции распределителя домена
PyMem_Malloc()
(PYMEM_DOMAIN_MEM
) теперь используют функцию распределителя памяти pymalloc вместо функцииmalloc()
библиотеки C. Распределитель pymalloc оптимизирован для объектов, меньших или равных 512 байтам с коротким временем жизни, и используетmalloc()
для больших блоков памяти. (Предоставлено Виктором Стиннером в bpo-26249). pickle.load()
иpickle.loads()
теперь работают до 10% быстрее при десериализации множества небольших объектов (предоставлено Виктором Стиннером в bpo-27056).- Передача ключевых аргументов в функцию имеет накладные расходы по сравнению с передачей позиционных аргументов. Теперь в функциях расширения, реализованных с помощью Клиники Споров, данные накладные расходы значительно снижены. (Предоставил Сергей Сторчака в 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.)
Изменения сборки и C API
- Python теперь требует некоторой поддержки C99 в цепочке инструментов для
сборки. В частности, Python теперь использует стандартные целочисленные типы
и макросы вместо пользовательских макросов, таких как
PY_LONG_LONG
. Дополнительные сведения см. в статьях PEP 7 и bpo-17884. - Кросс-компиляция CPython с Android NDK и уровнем Android API, установленным на 21 (Android 5.0 Lollipop) или выше, выполняется успешно. Хотя Android ещё не является поддерживаемой платформой, множество тестов Python работает на эмуляторе Android с ошибкой всего около 16 тестов. См. метапроблему Android bpo-26865.
- Добавлен флаг конфигурации
--enable-optimizations
. Его включение активирует дорогостоящие PGO оптимизации. (Исходный патч Александру Патраску из Intel в bpo-26359.) - GIL теперь должна удерживаться при вызове
функций распределителя доменов
PYMEM_DOMAIN_OBJ
(например,PyObject_Malloc()
) иPYMEM_DOMAIN_MEM
(например,PyMem_Malloc()
). - Новый API
Py_FinalizeEx()
, который указывает, не удалось ли очистить буферизованные данные. (Предоставлено Мартином Пантером в bpo-5319.) PyArg_ParseTupleAndKeywords()
теперь поддерживает только позиционные параметры. Позиционные параметры определяются пустыми именами. (Предоставлено Сергеем Сторчакой в bpo-26282).- Метод
PyTraceback_Print
теперь сокращает длинные последовательности повторяющихся строк как"[Previous line repeated {count} more times]"
. (Предоставлено Эмануэлем Барри в bpo-26823.) - Новая функция
PyErr_SetImportErrorSubclass()
позволяет указать подклассImportError
для вызова. (Предоставлено Эриком Сноу в bpo-15767.) - Новую функцию
PyErr_ResourceWarning()
можно использовать для созданияResourceWarning
, предоставляющего источник распределения ресурсов. (Предоставлено Виктором Стиннером в bpo-26567.) - Новая функция
PyOS_FSPath()
возвращает представление файловой системы путеподобный объект. (Предоставлено Бреттом Кэнноном в bpo-27186.) - Функции
PyUnicode_FSConverter()
иPyUnicode_FSDecoder()
теперь будут принимать путеподобные объекты.
Другие улучшения
Когда
--version
(краткая форма:-V
) указан дважды, Python печатаетsys.version
для получения подробной информации.$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
Устарело
Новые ключевые слова
async
и await
не рекомендуется использовать в качестве имён переменных,
классов, функций или модулей. Представленные PEP 492 в Python 3.5, они
станут правильными ключевыми словами в Python 3.7. Начиная с Python 3.6,
использование async
или await
в качестве имён будет генерировать
DeprecationWarning
.
Устаревшее поведение Python
Вызов исключения StopIteration
внутри генератора теперь будет
генерировать DeprecationWarning
и вызывать RuntimeError
в Python
3.7. Подробности см. в PEP 479: изменение обработки StopIteration внутри генераторов.
Теперь ожидается, что метод __aiter__()
будет возвращать асинхронный
итератор напрямую, а не ожидаемый объект, как раньше. Выполнение первого
вызовет DeprecationWarning
. Обратная совместимость будет удалена в
Python 3.7. (Предоставлено Юрием Селивановым в bpo-27243.)
Пара символов обратной косой черты, которая не является допустимой escape-
последовательностью, теперь генерирует код DeprecationWarning
. Хотя в
конечном итоге он станет SyntaxError
, этого не будет для нескольких
релизов Python. (Предоставлено Эмануэлем Барри в bpo-27364.)
При выполнении относительного импорта возвращение к __name__
и __path__
из
вызывающего модуля, когда __spec__
или __package__
не определены,
теперь вызывает ImportWarning
. (Предоставлено Роуз Эймс в
bpo-25791.)
Устаревшие модули, функции и методы Python
dbm
В отличие от других реализаций dbm
, модуль dbm.dumb
создаёт базы
данных в режиме 'rw'
и позволяет модифицировать базу данных, открытую в
режиме 'r'
. Это поведение устарело и будет удалено в версии 3.8.
(Предоставил Сергей Сторчака в bpo-21708.)
distutils
Недокументированный аргумент extra_path
для конструктора
Distribution
теперь считается устаревшим и вызывает
предупреждение, если он задан. Поддержка этого параметра будет удалена в
будущем выпуске Python. Подробности см. в bpo-27919.
grp
Поддержка нецелочисленных аргументов в 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
Недокументированная поддержка общих
байтоподобных объектов в качестве путей в функциях 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
.
pyvenv
Сценарий pyvenv
устарел в пользу python3 -m venv
. Это предотвращает
путаницу в отношении того, к чему подключен интерпретатор Python pyvenv
и,
следовательно, какой интерпретатор Python будет использоваться виртуальной
средой. (Предоставлено Бреттом Кэнноном в bpo-25154.)
Устаревшие функции и типы C API
Недокументированные функции PyUnicode_AsEncodedObject()
,
PyUnicode_AsDecodedObject()
, PyUnicode_AsEncodedUnicode()
и
PyUnicode_AsDecodedUnicode()
устарели. Вместо этого используйте
универсальный API на основе codec.
Устаревшие параметры сборки
Флаг конфигурации --with-system-ffi
теперь включён по умолчанию на
платформах UNIX, отличных от macOS. Его можно отключить с помощью --without-
system-ffi
, но использование флага устарело и не будет принято в Python 3.7.
macOS это изменение не затронет. Обратите внимание, что многие дистрибьюторы ОС
уже используют флаг --with-system-ffi
при сборке своей системы Python.
Удалённое
Удаление API и функций
- Неизвестные escape-последовательности, состоящие из
'\'
и буквы 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
для чтения сжатых текстовых файлов в режиме универсальный символ новой строки. - Недокументированные модули
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()
теперь блокируется до тех пор, пока системный пул случайной энтропии не будет инициализирован для повышения безопасности.Когда
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
.В следующие модули были добавлены отсутствующие API
__all__
атрибуты для соответствия задокументированным 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
теперь имеют вид только ключевые. (Предоставлено Сергеем Сторчакой в 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-файла, сжатый с помощью gzip, и выбор для платформы не производится. В средах, где дистрибутивы созданы для 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
для закрытого Zip-файла или вызов методаwrite()
для Zip- файла, созданного в режиме'r'
, вызовет ошибкуValueError
. Ранее в данных сценариях вызывалсяRuntimeError
.Когда пользовательские метаклассы сочетаются с
super()
без аргументов или прямыми ссылками из методов на неявную переменную закрытия__class__
, неявная запись пространства имён__classcell__
теперь должна передаваться доtype.__new__
для инициализации. В противном случае это приведёт кDeprecationWarning
в Python 3.6 иRuntimeError
в Python 3.8.С введением
ModuleNotFoundError
потребители системы импорта могут начать ожидать, что замена системы импорта вызовет более точное исключение, а не менее точноеImportError
. Чтобы обеспечить будущую совместимость с такими потребителями, разработчикам альтернативных систем импорта, полностью заменяющих__import__()
, потребуется обновить свои реализации, чтобы вызывать новый подкласс, когда модуль вообще не может быть найден. Разработчикам подключаемых модулей, совместимых с системой импорта по умолчанию, не нужно вносить никаких изменений, т. к. система импорта по умолчанию создаст новый подкласс, когда это необходимо.
Изменения в C API
- Семейство распределителей
PyMem_Malloc()
теперь использует распределитель pymalloc, а не системныйmalloc()
. Приложения, вызывающиеPyMem_Malloc()
без удержания GIL, теперь могут аварийно завершать работу. Устанавливает для переменной средыPYTHONMALLOC
значениеdebug
, чтобы проверить использование распределителей памяти в вашем приложении. См. bpo-26249. Py_Exit()
(и главный интерпретатор) теперь переопределяют статус выхода на 120, если сброс буферизованных данных не удался. См. bpo-5319.
Изменения байт-кода CPython
В Python 3.6 было внесено несколько серьезных изменений в байт-код.
- Интерпретатор Python теперь использует 16-битный код слова вместо байт-кода. (Предоставлено Демуром Румедом при участии и отзывах Сергея Сторчаки и Виктора Стиннера в bpo-26647 и bpo-28050.)
- Новые коды операций
FORMAT_VALUE
иBUILD_STRING
как часть реализации форматированного строкового литерала. (Предоставлено Эриком Смитом в 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
для поддержки нового синтаксиса аннотация переменной. (Предоставлено Иваном Левкивским в bpo-27985.)
Заметные изменения в Python 3.6.2
Новая цель сборки make regen-all
Чтобы упростить кросс-компиляцию и обеспечить надежную компиляцию CPython без необходимости наличия существующей версии Python, система сборки на основе автоматических инструментов больше не пытается неявно перекомпилировать сгенерированные файлы на основе времени модификации файлов.
Вместо этого была добавлена новая команда 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
Являющийся частью общедоступного API синглтон PyExc_RecursionErrorInst
был удалён, т. к. его никогда не очищаются элементы, могут вызвать
segfault во время финализации интерпретатора. (Предоставлено Ксавье де Гэем в
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.)