Что нового в Python 3.6¶
- Редакция:
Элвис Пранскевичус <elvis@magic.io>, Юрий Селиванов <yury@magic.io>
В этой статье рассказывается о новых возможностях Python 3.6 по сравнению с 3.5. Python 3.6 был выпущен 23 декабря 2016 года. Полный список изменений смотрите в changelog.
См.также
PEP 494 - График выхода Python 3.6
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 498, форматированные строковые литералы.
PEP 515, подчеркивания в числовых литералах.
PEP 526, синтаксис для аннотаций переменных.
PEP 525, асинхронные генераторы.
PEP 530: асинхронные постижения.
Новые библиотечные модули:
Улучшения в реализации CPython:
Тип dict был переделан для использования more compact representation, основанного на a proposal by Raymond Hettinger и похожего на PyPy dict implementation. Это привело к тому, что словари стали использовать на 20-25 % меньше памяти по сравнению с Python 3.5.
Настройка создания классов была упрощена с помощью new protocol.
Порядок определения атрибутов класса - now preserved.
Порядок элементов в
**kwargs
теперь corresponds to the order, в котором ключевые слова-аргументы были переданы в функцию.Добавлены DTrace и SystemTap probing support.
Новая переменная окружения PYTHONMALLOC теперь может быть использована для отладки ошибок выделения и доступа к памяти интерпретатора.
Значительные улучшения в стандартной библиотеке:
Модуль
asyncio
получил новые возможности, значительные улучшения удобства использования и производительности, а также большое количество исправлений ошибок. Начиная с Python 3.6 модульasyncio
больше не является временным, а его API считается стабильным.Для поддержки path-like objects был реализован новый file system path protocol. Все стандартные библиотечные функции, работающие с путями, были обновлены для работы с новым протоколом.
Модуль
datetime
получил поддержку Local Time Disambiguation.Модуль
typing
получил номер improvements.Модуль
tracemalloc
был значительно переработан и теперь используется для обеспечения лучшего вывода данных дляResourceWarning
, а также для лучшей диагностики ошибок выделения памяти. Дополнительную информацию см. в разделе PYTHONMALLOC section.
Улучшения в системе безопасности:
Новый модуль
secrets
был добавлен для упрощения генерации криптографически сильных псевдослучайных чисел, подходящих для управления секретами, такими как аутентификация аккаунта, токены и т.п.В Linux
os.urandom()
теперь блокируется до тех пор, пока не будет инициализирован системный пул энтропии urandom, чтобы повысить безопасность. Обоснование см. в PEP 524.Настройки по умолчанию и набор функций модуля
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 написан и реализован Эриком В. Смитом.
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 515: Подчеркивания в числовых литералах¶
PEP 515 добавляет возможность использовать подчеркивание в числовых литералах для улучшения читабельности. Например:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
Одиночные символы подчеркивания допускаются между цифрами и после любого базового спецификатора. Ведущие, последующие или несколько подчеркиваний подряд не допускаются.
В языке string formatting также появилась поддержка опции '_'
, сигнализирующей об использовании подчеркивания в качестве разделителя тысяч для типов представления с плавающей запятой и для целочисленных типов представления 'd'
. Для целочисленных типов представления 'b'
, 'o'
, 'x'
и 'X'
подчеркивание будет вставляться через каждые 4 цифры:
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
См.также
- PEP 515 – Подчеркивания в числовых литералах
PEP написан Георгом Брандлом и Сергеем Сторчакой.
PEP 525: Асинхронные генераторы¶
В PEP 492 появилась поддержка собственных корутинов и async
/ await
синтаксиса в Python 3.5. Заметным ограничением реализации Python 3.5 было то, что нельзя было использовать await
и yield
в одном теле функции. В Python 3.6 это ограничение было снято, что позволило определять асинхронные генераторы:
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
Новый синтаксис позволяет создавать более быстрый и лаконичный код.
См.также
- PEP 525 – Асинхронные генераторы
PEP написан и реализован Юрием Селивановым.
PEP 530: Асинхронные постижения¶
PEP 530 добавляет поддержку использования async for
в выражениях для понимания списков, множеств, диктов и генераторов:
result = [i async for i in aiter() if i % 2]
Кроме того, выражения await
поддерживаются во всех видах осмысления:
result = [await fun() for fun in funcs if await condition()]
См.также
- PEP 530 – Асинхронные постижения
PEP написан и реализован Юрием Селивановым.
PEP 487: Более простая настройка создания классов¶
Теперь можно настроить создание подклассов без использования метакласса. Новый метод класса __init_subclass__
будет вызываться в базовом классе всякий раз, когда создается новый подкласс:
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
Чтобы вызовы с нулевым аргументом super()
корректно работали из реализаций __init_subclass__()
, пользовательские метаклассы должны обеспечить распространение новой записи пространства имен __classcell__
в type.__new__
(как описано в Создание объекта класса).
См.также
- PEP 487 – Более простая настройка создания классов
PEP написан и реализован Мартином Тайхманом.
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 написан и реализован Мартином Тайхманом.
PEP 519: Добавление протокола путей к файловой системе¶
Исторически сложилось так, что пути файловой системы представляются как объекты str
или bytes
. Это привело к тому, что люди, которые пишут код, оперирующий путями файловой системы, предполагают, что такие объекты бывают только одного из этих двух типов (int
, представляющий дескриптор файла, не считается, так как это не путь к файлу). К сожалению, это предположение не позволяет альтернативным объектным представлениям путей файловой системы, таким как pathlib
, работать с уже существующим кодом, включая стандартную библиотеку Python.
Чтобы исправить эту ситуацию, был определен новый интерфейс, представленный os.PathLike
. Реализуя метод __fspath__()
, объект сигнализирует, что он представляет путь. Затем объект может предоставить низкоуровневое представление пути файловой системы в виде объекта str
или bytes
. Это означает, что объект считается path-like, если он реализует os.PathLike
или является str
или bytes
объектом, представляющим путь к файловой системе. Код может использовать os.fspath()
, os.fsdecode()
или os.fsencode()
для явного получения str
и/или bytes
представления объекта, похожего на путь.
Встроенная функция open()
была обновлена для приема объектов os.PathLike
, как и все соответствующие функции в модулях os
и os.path
, а также большинство других функций и классов в стандартной библиотеке. Класс os.DirEntry
и соответствующие классы в pathlib
также были обновлены для реализации os.PathLike
.
Мы надеемся, что обновление фундаментальных функций для работы с путями файловой системы приведет к тому, что код сторонних разработчиков будет неявно поддерживать все path-like objects без каких-либо изменений в коде или хотя бы с минимальными изменениями (например, вызов os.fspath()
в начале кода перед работой с объектом, похожим на путь).
Вот несколько примеров того, как новый интерфейс позволяет использовать pathlib.Path
более легко и прозрачно в уже существующем коде:
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(Выполнено Бреттом Кэнноном, Итаном Фурманом, Дасти Филлипсом и Джеллом Зилстра).
См.также
- PEP 519 – Добавление протокола пути к файловой системе
Авторы PEP - Бретт Кэннон и Коос Зевенховен.
PEP 495: Определение местного времени¶
В большинстве стран мира были и будут времена, когда местные часы переводятся назад. В это время появляются интервалы, когда местные часы показывают одно и то же время дважды за один день. В таких ситуациях информации, отображаемой на местных часах (или хранящейся в экземпляре Python datetime), недостаточно для определения конкретного момента времени.
PEP 495 добавляет новый атрибут fold к экземплярам классов datetime.datetime
и datetime.time
, чтобы различать два момента времени, для которых местное время одинаково:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
Значения атрибута fold
имеют значение 0
для всех экземпляров, кроме тех, которые представляют второй (хронологически) момент времени в неоднозначном случае.
См.также
- PEP 495 – Рассекречивание местного времени
PEP написан Александром Белопольским и Тимом Питерсом, реализация - Александром Белопольским.
PEP 529: Изменение кодировки файловой системы Windows на UTF-8¶
Для представления путей к файловой системе лучше всего использовать str (Unicode), а не байты. Однако есть ситуации, когда использование байтов является достаточным и корректным.
До версии Python 3.6 при использовании байтовых путей в Windows могла произойти потеря данных. С этим изменением использование байтов для представления путей теперь поддерживается в Windows, при условии, что эти байты закодированы с помощью кодировки, возвращаемой sys.getfilesystemencoding()
, которая теперь по умолчанию равна 'utf-8'
.
Приложения, не использующие str для представления путей, должны использовать os.fsencode()
и os.fsdecode()
, чтобы убедиться, что их байты правильно закодированы. Чтобы вернуться к предыдущему поведению, установите PYTHONLEGACYWINDOWSFSENCODING
или вызовите sys._enablelegacywindowsfsencoding()
.
Дополнительную информацию и обсуждение изменений в коде, которые могут потребоваться, см. в разделе PEP 529.
PEP 528: Изменение кодировки консоли Windows на UTF-8¶
Консоль по умолчанию в Windows теперь принимает все символы Unicode и обеспечивает корректное чтение объектов str в коде Python. sys.stdin
, sys.stdout
и sys.stderr
теперь по умолчанию используют кодировку utf-8.
Это изменение применяется только при использовании интерактивной консоли, но не при перенаправлении файлов или труб. Чтобы вернуться к прежнему поведению при использовании интерактивной консоли, установите значение PYTHONLEGACYWINDOWSSTDIO
.
См.также
- PEP 528 – Изменение кодировки консоли Windows на UTF-8
PEP написан и реализован Стивом Дауэром.
PEP 520: Сохранение порядка определения атрибутов класса¶
Атрибуты в теле определения класса имеют естественный порядок: тот же, в котором имена появляются в источнике. Теперь этот порядок сохраняется в атрибуте __dict__
нового класса.
Кроме того, эффективное пространство имен класса execution по умолчанию (возвращаемое из type.__prepare__()) теперь является отображением, сохраняющим порядок вставки.
См.также
- PEP 520 – Сохранение порядка определения атрибутов класса
PEP написан и реализован Эриком Сноу.
PEP 468: Сохранение порядка аргументов ключевых слов¶
**kwargs
в сигнатуре функции теперь гарантированно является отображением, сохраняющим порядок вставки.
См.также
- PEP 468 – Сохранение порядка аргументов ключевых слов
PEP написан и реализован Эриком Сноу.
Новая реализация dict¶
Тип dict теперь использует «компактное» представление, основанное на a proposal by Raymond Hettinger, который был first implemented by PyPy. По сравнению с Python 3.5 использование памяти новым dict()
уменьшилось на 20-25 %.
Аспект сохранения порядка в этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно иметь эту новую реализацию dict в языке в течение нескольких релизов, прежде чем изменить спецификацию языка, чтобы обязать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость с более старыми версиями языка, где случайный порядок итераций все еще действует, например, Python 3.5).
(Внесено INADA Naoki в bpo-27350. Идея originally suggested by Raymond Hettinger).
PEP 523: Добавление API для оценки кадров в CPython¶
Хотя Python предоставляет широкую поддержку для настройки выполнения кода, одно место, где он этого не сделал, - это оценка объектов фрейма. Если вам нужен какой-то способ перехватить оценку фрейма в Python, то без прямого манипулирования указателями функций для определенных функций не обойтись.
PEP 523 меняет эту ситуацию, предоставляя API, чтобы сделать оценку фреймов подключаемой на уровне C. Это позволит таким инструментам, как отладчики и JIT, перехватывать оценку кадров до начала выполнения кода Python. Это позволит использовать альтернативные реализации оценки для кода Python, отслеживать оценку кадров и т. д.
Этот API не является частью ограниченного C API и помечен как частный, чтобы показать, что его использование ожидается ограниченным и применимым только к очень избранным, низкоуровневым случаям использования. Семантика API будет меняться вместе с Python по мере необходимости.
См.также
- PEP 523 – Добавление API для оценки кадров в CPython
PEP написан Бреттом Кэнноном и Дино Вьеландом.
Переменная среды PYTHONMALLOC¶
Новая переменная окружения PYTHONMALLOC
позволяет настроить распределители памяти Python и установить отладочные крючки.
Теперь можно установить отладочные крючки на распределители памяти Python на Python, скомпилированный в режиме релиза с использованием PYTHONMALLOC=debug
. Эффекты отладочных крючков:
Вновь выделенная память заполняется байтом
0xCB
.Освобожденная память заполняется байтом
0xDB
.Обнаружение нарушений API распределителя памяти Python. Например,
PyObject_Free()
вызывается на блоке памяти, выделенномPyMem_Malloc()
.Обнаружение записи до начала буфера (неполное заполнение буфера)
Обнаружение записи после конца буфера (переполнения буфера)
Проверьте, удерживается ли значение GIL при вызове функций-распределителей доменов
PYMEM_DOMAIN_OBJ
(например,PyObject_Malloc()
) иPYMEM_DOMAIN_MEM
(например,PyMem_Malloc()
).
Проверка наличия GIL также является новой функцией Python 3.6.
См. функцию PyMem_SetupDebugHooks()
для отладочных крючков на распределителях памяти Python.
Теперь также можно принудительно использовать аллокатор malloc()
из библиотеки C для всех выделений памяти Python, использующих PYTHONMALLOC=malloc
. Это полезно при использовании внешних отладчиков памяти, таких как Valgrind, на Python, скомпилированном в режиме релиза.
При ошибке отладочные крючки для аллокаторов памяти Python теперь используют модуль tracemalloc
для получения трассировки, где был выделен блок памяти.
Пример фатальной ошибки при переполнении буфера с использованием python3.6 -X tracemalloc=5
(хранение 5 кадров в трассах):
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
Поддержка зондирования DTrace и SystemTap¶
Теперь Python может быть построен --with-dtrace
, что позволяет использовать статические маркеры для следующих событий в интерпретаторе:
вызов/возврат функции
сборка мусора начата/закончена
строка выполненного кода.
Это может быть использовано для инструментирования работающих интерпретаторов в производстве, без необходимости перекомпиляции конкретных debug builds или предоставления специфического для приложения кода профилирования/отладки.
Более подробная информация в Инструментирование CPython с помощью DTrace и SystemTap.
Текущая реализация протестирована на Linux и macOS. В будущем могут быть добавлены дополнительные маркеры.
(Внесено Лукашем Ланга в bpo-21590, основано на исправлениях Хесуса Сеа Авиона, Дэвида Малкольма и Нихила Бенеша).
Другие языковые изменения¶
Некоторые более мелкие изменения, внесенные в ядро языка Python:
Утверждение
global
илиnonlocal
теперь должно текстуально появляться перед первым использованием затрагиваемого имени в той же области видимости. Ранее для этого использовался символSyntaxWarning
.Теперь можно установить special method в
None
, чтобы указать, что соответствующая операция недоступна. Например, если для класса установить__iter__()
вNone
, то класс не является итерируемым. (Внесено Эндрю Барнертом и Иваном Левкивским в bpo-25958).Длинные последовательности повторяющихся строк трассировки теперь сокращаются как
"[Previous line repeated {count} more times]"
(пример см. в traceback). (Внесено Эмануэлем Барри в bpo-26823).Импорт теперь вызывает новое исключение
ModuleNotFoundError
(подклассImportError
), когда не может найти модуль. Код, который в настоящее время проверяет наличие ImportError (в try-except), по-прежнему будет работать. (Внесено Эриком Сноу в bpo-15767).Методы классов, полагающиеся на нулевой аргумент
super()
, теперь будут корректно работать при вызове из методов метакласса во время создания класса. (Внесено Мартином Тайхманом в bpo-23722).
Новые модули¶
секреты¶
Основная цель нового модуля secrets
- предоставить очевидный способ надежной генерации криптографически сильных псевдослучайных значений, подходящих для управления секретами, такими как аутентификация учетных записей, токены и тому подобное.
Предупреждение
Обратите внимание, что генераторы псевдослучайных чисел в модуле random
НЕ должны использоваться в целях безопасности. Используйте secrets
на Python 3.6+ и os.urandom()
на Python 3.5 и более ранних версиях.
См.также
- PEP 506 – Добавление модуля Secrets в стандартную библиотеку
PEP написан и реализован Стивеном Д’Апрано.
Улучшенные модули¶
массив¶
Исчерпанные итераторы array.array
теперь будут оставаться исчерпанными, даже если итерируемый массив будет расширен. Это соответствует поведению других изменяемых последовательностей.
Вклад Сергея Сторчака в bpo-26492.
ast¶
Новый ast.Constant
Был добавлен новый узел AST. Он может быть использован внешними AST-оптимизаторами для целей сворачивания констант.
Вклад Виктора Стиннера в bpo-26146.
asyncio¶
Начиная с Python 3.6 модуль asyncio
больше не является временным, а его API считается стабильным.
Заметные изменения в модуле asyncio
с Python 3.5.0 (все перенесены на 3.5.x из-за временного статуса):
Функция
get_event_loop()
была изменена таким образом, чтобы при вызове из корутин и обратных вызовов всегда возвращался текущий запущенный цикл. (Внесено Юрием Селивановым в bpo-28613).Функция
ensure_future()
и все использующие ее функции, такие какloop.run_until_complete()
, теперь принимают все виды awaitable objects. (Внесено Юрием Селивановым.)Новая функция
run_coroutine_threadsafe()
для передачи корутинов в циклы событий из других потоков. (Внесено Винсентом Мишелем).Новый метод
Transport.is_closing()
для проверки того, закрывается ли транспорт или нет. (Внесено Юрием Селивановым).Метод
loop.create_server()
теперь может принимать список хостов. (Внесено Янном Сионно).Новый метод
loop.create_future()
для создания объектов Future. Это позволяет альтернативным реализациям циклов событий, таким как uvloop, обеспечить более быструю реализациюasyncio.Future
. (Внесено Юрием Селивановым в bpo-27041).Новый метод
loop.get_exception_handler()
для получения текущего обработчика исключений. (Внесено Юрием Селивановым в bpo-27040).Новый метод
StreamReader.readuntil()
для чтения данных из потока до появления последовательности байтов-разделителей. (Внесено Марком Коренбергом.)Производительность
StreamReader.readexactly()
была улучшена. (Внесено Марком Коренбергом в bpo-28370).Метод
loop.getaddrinfo()
оптимизирован, чтобы избежать вызова системной функцииgetaddrinfo
, если адрес уже разрешен. (Внесено А. Джесси Джирю Дэвисом).Метод
loop.stop()
был изменен таким образом, чтобы останавливать цикл сразу после текущей итерации. Все новые обратные вызовы, запланированные в результате последней итерации, будут отброшены. (Внесено Гвидо ван Россумом в bpo-25593).Future.set_exception
теперь будет подниматьTypeError
при передаче экземпляра исключенияStopIteration
. (Внесено Крисом Анджелико в bpo-26221).Новый метод
loop.connect_accepted_socket()
для использования серверами, которые принимают соединения вне asyncio, но используют asyncio для их обработки. (Внесено Джимом Фултоном в bpo-27392).Флаг
TCP_NODELAY
теперь устанавливается по умолчанию для всех TCP-транспортов. (Внесено Юрием Селивановым в bpo-27456).Новый
loop.shutdown_asyncgens()
для корректного закрытия ожидающих асинхронных генераторов перед закрытием цикла. (Внесено Юрием Селивановым в bpo-28003).Классы
Future
иTask
теперь имеют оптимизированную реализацию на языке C, что делает код asyncio на 30% быстрее. (Вклад Юрия Селиванова и Наоки Инады в bpo-26081 и bpo-28544).
binascii¶
Функция b2a_base64()
теперь принимает необязательный ключевой аргумент newline, чтобы определить, будет ли символ новой строки добавляться к возвращаемому значению. (Внесено Виктором Стиннером в bpo-25357).
cmath¶
Добавлена новая константа cmath.tau
(τ). (Внесена Лизой Роуч в bpo-12345, подробности см. в PEP 628).
Новые константы: cmath.inf
и cmath.nan
для соответствия math.inf
и math.nan
, а также cmath.infj
и cmath.nanj
для соответствия формату, используемому в complex repr. (Внесено Марком Дикинсоном в bpo-23229).
коллекции¶
Новый абстрактный базовый класс Collection
был добавлен для представления классов итерируемых контейнеров большого размера. (Вклад Ивана Левкивского, док-ты Нила Гирдхара в bpo-27598).
Новый абстрактный базовый класс Reversible
представляет классы итерируемых, которые также предоставляют метод __reversed__()
. (Внесено Иваном Левкивским в bpo-25987).
Новый абстрактный базовый класс AsyncGenerator
представляет асинхронные генераторы. (Внесен Юрием Селивановым в bpo-28720).
Функция namedtuple()
теперь принимает необязательный ключевой аргумент module, который, если указан, используется для атрибута __module__
возвращаемого класса именованных кортежей. (Внесено Раймондом Хеттингером в bpo-17941).
Аргументы verbose и rename для namedtuple()
теперь работают только по ключевому слову. (Внесено Раймондом Хеттингером в bpo-25628).
Рекурсивные экземпляры collections.deque
теперь можно мариновать. (Внесено Сергеем Сторчакой в bpo-26482).
concurrent.futures¶
Конструктор класса ThreadPoolExecutor
теперь принимает необязательный аргумент thread_name_prefix, чтобы сделать возможным настраивать имена потоков, создаваемых пулом. (Внесено Грегори П. Смитом в bpo-27664).
contextlib¶
Класс contextlib.AbstractContextManager
был добавлен, чтобы предоставить абстрактный базовый класс для менеджеров контекста. Он предоставляет разумную реализацию по умолчанию для __enter__()
, которая возвращает self
и оставляет __exit__()
абстрактным методом. Соответствующий класс был добавлен в модуль typing
в качестве typing.ContextManager
. (Внесено Бреттом Кэнноном в bpo-25609).
datetime¶
В классах datetime
и time
появился новый атрибут fold
, используемый при необходимости для определения местного времени. Многие функции в классе datetime
были обновлены для поддержки определения местного времени. Дополнительную информацию см. в разделе Local Time Disambiguation. (Внесено Александром Белопольским в bpo-24773).
Методы datetime.strftime()
и date.strftime()
теперь поддерживают директивы даты ISO 8601 %G
, %u
и %V
. (Внесено Эшли Андерсоном в bpo-12006).
Функция datetime.isoformat()
теперь принимает необязательный аргумент timespec, задающий количество дополнительных компонентов значения времени, которые необходимо включить. (Внесено Алессандро Куччи и Александром Белопольским в bpo-19475).
Теперь datetime.combine()
принимает необязательный аргумент tzinfo. (Внесено Александром Белопольским в bpo-27661).
десятичная¶
Новый метод Decimal.as_integer_ratio()
, возвращающий пару (n, d)
целых чисел, которые представляют данный экземпляр Decimal
в виде дроби, в наименьших числах и с положительным знаменателем:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(Вклад Стефана Краха и Марка Дикинсона в bpo-25928).
distutils¶
Атрибут default_format
был удален из distutils.command.sdist.sdist
, а атрибут formats
по умолчанию принимает значение ['gztar']
. Хотя это и не предвидится, любой код, полагающийся на наличие default_format
, возможно, придется адаптировать. Более подробную информацию см. в разделе bpo-27819.
e-mail¶
Новый почтовый API, включаемый с помощью ключевого слова policy в различных конструкторах, больше не является предварительным. Документация email
была реорганизована и переписана, чтобы сосредоточиться на новом API, сохранив при этом старую документацию по устаревшему API. (Внесено Р. Дэвидом Мюрреем в bpo-24277).
Все классы email.mime
теперь принимают необязательное ключевое слово policy. (Внесено Беркером Пексагом в bpo-27331).
В DecodedGenerator
теперь поддерживается ключевое слово policy.
Существует новый атрибут policy
, message_factory
, который управляет тем, какой класс используется по умолчанию при создании парсером новых объектов сообщений. Для политики email.policy.compat32
это Message
, для новых политик - EmailMessage
. (Внесено Р. Дэвидом Мюрреем в bpo-20476).
кодировки¶
В Windows добавлена кодировка 'oem'
для использования CP_OEMCP
, а также псевдоним 'ansi'
для существующей кодировки 'mbcs'
, которая использует кодовую страницу CP_ACP
. (Внесено Стивом Дауэром в bpo-27959).
enum¶
В модуль enum
были добавлены два новых базовых класса перечислений: Flag
и IntFlags
. Оба используются для определения констант, которые можно комбинировать с помощью побитовых операторов. (Внесено Итаном Фурманом в bpo-23591).
Многие модули стандартной библиотеки были обновлены, чтобы использовать класс IntFlags
для своих констант.
Новое значение enum.auto
можно использовать для автоматического присвоения значений членам перечисления:
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
faulthandler¶
В Windows модуль faulthandler
теперь устанавливает обработчик для исключений Windows: см. faulthandler.enable()
. (Внесено Виктором Стиннером в bpo-23848).
fileinput¶
hook_encoded()
теперь поддерживает аргумент errors. (Внесено Джозефом Хакманом в bpo-25788).
hashlib¶
hashlib
поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия - 1.0.2. (Внесено Кристианом Хаймсом в bpo-26470).
В модуль были добавлены хэш-функции BLAKE2. blake2b()
и blake2s()
всегда доступны и поддерживают полный набор функций BLAKE2. (Внесено Кристианом Хаймсом в bpo-26798 на основе кода Дмитрия Честных и Самуэля Невеса. Документация написана Дмитрием Честных).
Добавлены хэш-функции SHA-3 sha3_224()
, sha3_256()
, sha3_384()
, sha3_512()
и хэш-функции SHAKE shake_128()
и shake_256()
. (Внесено Кристианом Хаймсом в bpo-16113. Пакет кодов Keccak, подготовленный Гвидо Бертони, Джоан Демен, Михаэлем Пеетерсом, Жилем Ван Аше и Ронни Ван Кеером).
Функция получения ключей на основе пароля scrypt()
теперь доступна в OpenSSL 1.1.0 и более новых версиях. (Внесено Кристианом Хаймсом в bpo-27928).
http.client¶
HTTPConnection.request()
и endheaders()
теперь поддерживают тела запросов в кодировке chunked. (Вклад Демиана Брехта и Рольфа Краля в bpo-12319).
idlelib и IDLE¶
Пакет idlelib модернизируется и рефакторизируется, чтобы IDLE выглядела и работала лучше, а код было легче понимать, тестировать и улучшать. Частью улучшения внешнего вида IDLE, особенно на Linux и Mac, является использование виджетов ttk, в основном в диалогах. В результате IDLE больше не работает с tcl/tk 8.4. Теперь ей требуется tcl/tk 8.5 или 8.6. Мы рекомендуем использовать последнюю версию любого из них.
Модернизация» включает переименование и объединение модулей idlelib. Переименование файлов с неполными именами в верхнем регистре аналогично переименованию, например, Tkinter и TkFont в tkinter и tkinter.font в версии 3.0. В результате импорт файлов idlelib, работавший в 3.5, как правило, не будет работать в 3.6. Потребуется как минимум изменение имени модуля (см. idlelib/README.txt), а иногда и больше. (Изменения имен были внесены Элом Свигартом и Терри Риди в bpo-24225. Большинство исправлений idlelib с тех пор были и будут частью этого процесса).
В качестве компенсации, в конечном счете, некоторые классы idlelib станут проще в использовании, с лучшими API и документацией, объясняющей их. Дополнительная полезная информация будет добавляться в idlelib по мере поступления.
Новое в версии 3.6.2:
Многочисленные исправления автозаполнения. (Внесено Луи Лу в bpo-15786).
Новое в версии 3.6.3:
Модуль Browser (меню File, ранее назывался Class Browser) теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Вклад внесли Гильерме Поло, Шерил Сабелла и Терри Ян Риди в bpo-1612262).
Функции IDLE, ранее реализованные как расширения, теперь реализованы как обычные функции. Их настройки были перенесены с вкладки «Расширения» на другие вкладки диалога. (Вклад внесли Чарльз Вольгангер и Терри Ян Риди в bpo-27099).
Диалог настроек (Options, Configure IDLE) был частично переписан для улучшения внешнего вида и функциональности. (Внесено Шерил Сабелла и Терри Джен Риди в нескольких выпусках).
Новое в версии 3.6.4:
Образец шрифта теперь включает в себя выборку нелатинских символов, чтобы пользователи могли лучше увидеть эффект от выбора конкретного шрифта. (Внесено Терри Яном Риди в bpo-13802) Образец можно редактировать, чтобы включить в него другие символы. (Внесено Сергеем Сторчакой в bpo-31860).
Новое в версии 3.6.6:
Изменена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до maxlines. Щелчок по контекстной строке переводит редактор на эту строку. Цвета контекста для пользовательских тем добавлены на вкладку Highlights диалога Settings. (Вклад Шерил Сабеллы и Терри Джен Риди в bpo-33642, bpo-33768 и bpo-33679).
В Windows новый вызов API сообщает Windows, что tk масштабируется с учетом DPI. В Windows 8.1+ или 10 при неизменных свойствах DPI-совместимости бинарного файла Python и разрешении монитора более 96 DPI это должно сделать текст и линии более четкими. В остальных случаях это не должно иметь никакого эффекта. (Внесено Терри Яном Риди в bpo-33656).
Новое в версии 3.6.7:
Вывод более N строк (по умолчанию 50) сжимается до кнопки. N можно изменить в разделе PyShell на странице Общие в диалоге Настройки. Меньшее количество строк, но, возможно, очень длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод может быть развернут на месте двойным щелчком по кнопке или в буфер обмена или отдельное окно правым щелчком по кнопке. (Внесено Тал Эйнат в bpo-1529353).
importlib¶
Импорт теперь вызывает новое исключение ModuleNotFoundError
(подкласс ImportError
), когда не может найти модуль. Код, который в настоящее время проверяет наличие ImportError
(в try-except), по-прежнему будет работать. (Внесено Эриком Сноу в bpo-15767).
importlib.util.LazyLoader
теперь вызывает create_module()
на обернутом загрузчике, снимая ограничение, из-за которого importlib.machinery.BuiltinImporter
и importlib.machinery.ExtensionFileLoader
не могли использоваться с importlib.util.LazyLoader
.
importlib.util.cache_from_source()
, importlib.util.source_from_cache()
и importlib.util.spec_from_file_location()
теперь принимают path-like object.
осмотреть¶
Функция inspect.signature()
теперь сообщает о неявных параметрах .0
, сгенерированных компилятором для областей понимания и генератора выражений, как если бы это были только позиционные параметры, называемые implicit0
. (Внесено Jelle Zijlstra в bpo-19611).
Чтобы сократить количество ошибок в коде при переходе с Python 2.7 и устаревшего inspect.getargspec()
API, ранее документированная депривация inspect.getfullargspec()
была отменена. Хотя эта функция удобна для кодовых баз Python 2/3 с одним источником, более богатый интерфейс inspect.signature()
остается рекомендуемым подходом для нового кода. (Внесено Ником Когланом в bpo-27172)
json¶
json.load()
и json.loads()
теперь поддерживают двоичный ввод. Закодированный JSON должен быть представлен с использованием UTF-8, UTF-16 или UTF-32. (Внесено Сергеем Сторчакой в bpo-17909).
ведение журнала¶
Новый метод WatchedFileHandler.reopenIfNeeded()
был добавлен для проверки необходимости повторного открытия файла журнала. (Внесено Мариан Хорбан в bpo-24884).
математика¶
В модули math
и cmath
добавлена константа тау (τ). (Внесена Лизой Роуч в bpo-12345, подробности см. в PEP 628).
многопроцессорная обработка¶
Proxy Objects, возвращаемые multiprocessing.Manager()
, теперь могут быть вложенными. (Внесено Дэвином Поттсом в bpo-6766).
os¶
Подробности о том, как модули os
и os.path
теперь поддерживают path-like objects, см. в кратком обзоре PEP 519.
scandir()
теперь поддерживает пути bytes
в Windows.
Новый метод close()
позволяет явно закрыть итератор scandir()
. Итератор scandir()
теперь поддерживает протокол context manager. Если итератор scandir()
не исчерпан и не закрыт явным образом, в его деструкторе будет выдан ResourceWarning
. (Внесено Сергеем Сторчакой в bpo-25994).
В Linux os.urandom()
теперь блокируется до тех пор, пока не будет инициализирован системный пул энтропии urandom, чтобы повысить безопасность. Обоснование см. в PEP 524.
Системный вызов Linux getrandom()
(получение случайных байтов) теперь доступен в виде новой функции os.getrandom()
. (Внесено Виктором Стиннером, часть PEP 524)
pathlib¶
pathlib
теперь поддерживает path-like objects. (Внесено Бреттом Кэнноном в bpo-27186).
Подробности см. в кратком описании PEP 519.
pdb¶
В конструкторе класса Pdb
появился новый необязательный аргумент readrc для управления чтением файлов .pdbrc
.
маринованный огурец¶
Объекты, которым требуется __new__
, вызываемые с аргументами в виде ключевых слов, теперь можно травить с помощью pickle protocols старше версии протокола 4. Протокол версии 4 уже поддерживает этот случай. (Внесено Сергеем Сторчакой в bpo-24164).
pickletools¶
pickletools.dis()
теперь выводит неявный индекс мемо для опкода MEMOIZE
. (Внесено Сергеем Сторчакой в bpo-25382).
pydoc¶
Модуль pydoc
научился уважать переменную окружения MANPAGER
. (Внесено Маттиасом Клозе в bpo-8637).
help()
и pydoc
теперь могут перечислять именованные поля кортежей в порядке их определения, а не в алфавитном порядке. (Внесено Раймондом Хеттингером в bpo-24879).
случайно¶
Новая функция choices()
возвращает список элементов заданного размера из заданной популяции с необязательными весами. (Внесена Раймондом Хеттингером в bpo-18844).
re¶
Добавлена поддержка размахов модификаторов в регулярных выражениях. Примеры: '(?i:p)ython'
соответствует 'python'
и 'Python'
, но не 'PYTHON'
; '(?i)g(?-i:v)r'
соответствует 'GvR'
и 'gvr'
, но не 'GVR'
. (Внесено Сергеем Сторчакой в bpo-433028).
Доступ к группам совпадающих объектов можно получить с помощью __getitem__
, что эквивалентно group()
. Таким образом, mo['name']
теперь эквивалентен mo.group('name')
. (Внесено Эриком Смитом в bpo-24454).
Объекты Match
теперь поддерживают index-like objects
в качестве групповых индексов. (Внесено Йеруном Демейером и Сяном Чжаном в bpo-27177).
readline¶
Добавлена функция set_auto_history()
для включения или отключения автоматического добавления ввода в список истории. (Внесено Тайлером Кромптоном в bpo-26870).
rlcompleter¶
Имена частных и специальных атрибутов теперь опускаются, если префикс не начинается с подчеркивания. После некоторых завершенных ключевых слов добавляется пробел или двоеточие. (Внесено Сергеем Сторчакой в bpo-25011 и bpo-25209).
shlex¶
В shlex
появилось много improved shell compatibility через новый аргумент punctuation_chars для управления тем, какие символы будут рассматриваться как знаки препинания. (Внесено Винаем Саджипом в bpo-1521950).
сайт¶
При указании путей для добавления к sys.path
в файле .pth
теперь можно указывать пути к файлам поверх каталогов (например, к zip-файлам). (Внесено Вольфгангом Лангнером в bpo-26587).
sqlite3¶
sqlite3.Cursor.lastrowid
теперь поддерживает оператор REPLACE
. (Внесено Алексом ЛордТорсеном в bpo-16864).
сокет¶
Функция ioctl()
теперь поддерживает управляющий код SIO_LOOPBACK_FAST_PATH
. (Внесено Дэниелом Стоуксом в bpo-26536).
Теперь поддерживаются константы getsockopt()
SO_DOMAIN
, SO_PROTOCOL
, SO_PEERSEC
и SO_PASSSEC
. (Внесено Кристианом Хаймсом в bpo-26907).
Теперь setsockopt()
поддерживает форму setsockopt(level, optname, None, optlen: int)
. (Внесено Кристианом Хаймсом в bpo-27744).
Модуль сокетов теперь поддерживает семейство адресов AF_ALG
для взаимодействия с криптографическим API ядра Linux. Были добавлены ALG_*
, SOL_ALG
и sendmsg_afalg()
. (Внесено Кристианом Хаймсом в bpo-27744 при поддержке Виктора Стиннера).
Добавлены новые константы Linux TCP_USER_TIMEOUT
и TCP_CONGESTION
. (Вклад Омара Сандовала, bpo-26273).
сокетсервер¶
Серверы, основанные на модуле socketserver
, включая те, что определены в http.server
, xmlrpc.server
и wsgiref.simple_server
, теперь поддерживают протокол context manager. (Внесено Авивом Паливодой в bpo-26404).
Атрибут wfile
классов StreamRequestHandler
теперь реализует интерфейс io.BufferedIOBase
с возможностью записи. В частности, вызов write()
теперь гарантированно передает данные в полном объеме. (Внесено Мартином Пантером в bpo-26721).
ssl¶
ssl
поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия - 1.0.2. (Внесено Кристианом Хаймсом в bpo-26470).
Из наборов шифров по умолчанию удален 3DES и добавлен набор шифров ChaCha20 Poly1305. (Внесено Кристианом Хаймсом в bpo-27850 и bpo-27766).
SSLContext
имеет лучшую конфигурацию по умолчанию для опций и шифров. (Внесено Кристианом Хаймсом в bpo-28043).
Сессия SSL может быть скопирована с одного клиентского соединения на другое с помощью нового класса SSLSession
. Возобновление сеанса TLS может ускорить начальное рукопожатие, уменьшить задержку и повысить производительность (Внесено Кристианом Хаймсом в bpo-19500 на основе проекта Алекса Вархока).
Новый метод get_ciphers()
можно использовать для получения списка включенных шифров в порядке их приоритета.
Все константы и флаги были преобразованы в IntEnum
и IntFlags
. (Внесено Кристианом Хаймсом в bpo-28025).
Добавлены специфические для сервера и клиента протоколы TLS для SSLContext
. (Внесено Кристианом Хаймсом в bpo-28085).
Добавлены ssl.SSLContext.post_handshake_auth
для включения и ssl.SSLSocket.verify_client_post_handshake()
для инициирования аутентификации TLS 1.3 после рукопожатия. (Внесено Кристианом Хаймсом в gh-78851).
статистика¶
Была добавлена новая функция harmonic_mean()
. (Внесено Стивеном Д’Апрано в bpo-27181).
struct¶
struct
теперь поддерживает плавающие числа половинной точности IEEE 754 через спецификатор формата 'e'
. (Вклад Илая Стивенса, Марка Дикинсона в bpo-11734).
подпроцесс¶
Деструктор subprocess.Popen
теперь выдает предупреждение ResourceWarning
, если дочерний процесс все еще запущен. Используйте протокол контекстного менеджера (with proc: ...
) или явно вызовите метод wait()
, чтобы прочитать статус выхода дочернего процесса. (Внесено Виктором Стиннером в bpo-26741).
Конструктор subprocess.Popen
и все функции, передающие ему аргументы, теперь принимают аргументы encoding и errors. Указание любого из них включает текстовый режим для потоков stdin, stdout и stderr. (Внесено Стивом Дауэром в bpo-6135).
sys¶
Новая функция getfilesystemencodeerrors()
возвращает имя режима ошибок, используемого для преобразования между именами файлов в кодировке Unicode и именами байтов. (Внесена Стивом Дауэром в bpo-27781).
В Windows возвращаемое значение функции getwindowsversion()
теперь включает поле platform_version, которое содержит точную мажорную, минорную версию и номер сборки текущей операционной системы, а не той версии, которая эмулируется для процесса (Внесено Стивом Дауэром в bpo-27932).
telnetlib¶
telnetlib.Telnet
теперь является менеджером контекста (внесен Стефаном Виртелом в bpo-25485).
время¶
Атрибуты struct_time
tm_gmtoff
и tm_zone
теперь доступны на всех платформах.
timeit¶
Новый метод удобства Timer.autorange()
был добавлен для многократного вызова Timer.timeit()
, чтобы общее время выполнения было больше или равно 200 миллисекундам. (Внесено Стивеном Д’Апрано в bpo-6422).
timeit
теперь предупреждает о существенном (4-кратном) расхождении между лучшим и худшим временем. (Внесено Сергеем Сторчакой в bpo-23552).
tkinter¶
Добавлены методы trace_add()
, trace_remove()
и trace_info()
в класс tkinter.Variable
. Они заменяют старые методы trace_variable()
, trace()
, trace_vdelete()
и trace_vinfo()
, которые используют устаревшие команды Tcl и могут не работать в будущих версиях Tcl. (Внесено Сергеем Сторчакой в bpo-22115).
traceback¶
Как модуль трассировки, так и встроенный в интерпретатор дисплей исключений теперь сокращают длинные последовательности повторяющихся строк в трассировках, как показано в следующем примере:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(Внесено Эмануэлем Барри в bpo-26823).
tracemalloc¶
Модуль tracemalloc
теперь поддерживает отслеживание выделения памяти в нескольких различных адресных пространствах.
Новый класс фильтров DomainFilter
был добавлен для фильтрации трасс блоков по их адресному пространству (домену).
(Внесено Виктором Стиннером в bpo-26588).
набор текста¶
Поскольку модуль typing
стал provisional, все изменения, внесенные в Python 3.6, также были перенесены в Python 3.5.x.
В модуле typing
значительно улучшена поддержка общих псевдонимов типов. Например, Dict[str, Tuple[S, T]]
теперь является допустимой аннотацией типа. (Внесено Гвидо ван Россумом в Github #195).
Класс typing.ContextManager
был добавлен для представления contextlib.AbstractContextManager
. (Внесено Бреттом Кэнноном в bpo-25609).
Класс typing.Collection
был добавлен для представления collections.abc.Collection
. (Внесено Иваном Левкивским в bpo-27598).
Конструкция типа typing.ClassVar
была добавлена для обозначения переменных класса. Как было представлено в PEP 526, аннотация переменной, обернутая в ClassVar, указывает, что данный атрибут предназначен для использования в качестве переменной класса и не должен устанавливаться для экземпляров этого класса. (Внесено Иваном Левкивским в Github #280).
Новая константа TYPE_CHECKING
, которая предполагается как True
статическими средствами проверки типов, но во время выполнения становится False
. (Внесено Гвидо ван Россумом в Github #230).
Новая вспомогательная функция NewType()
была добавлена для создания легких отдельных типов аннотаций:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
Программа проверки статических типов будет относиться к новому типу так, как если бы он был подклассом исходного типа. (Внесено Иваном Левкивским в Github #189).
unicodedata¶
Модуль unicodedata
теперь использует данные из Unicode 9.0.0. (Внесено Бенджамином Петерсоном.)
unittest.mock¶
Класс Mock
имеет следующие улучшения:
Два новых метода,
Mock.assert_called()
иMock.assert_called_once()
, для проверки того, был ли вызван объект mock. (Внесено Амитом Саха в bpo-26323).Метод
Mock.reset_mock()
теперь имеет два необязательных аргумента, ограничивающихся ключевыми словами: возвращаемое_значение и боковой_эффект. (Внесено Кушалом Дасом в bpo-21271).
urllib.request¶
Если HTTP-запрос содержит тело файла или итерируемого файла (кроме объекта bytes), но не содержит заголовка Content-Length
, то вместо того, чтобы выдать ошибку, AbstractHTTPHandler
теперь возвращается к использованию кодировки передачи данных chunked. (Вклад Демиана Брехта и Рольфа Краля в bpo-12319).
urllib.robotparser¶
RobotFileParser
теперь поддерживает расширения Crawl-delay
и Request-rate
. (Внесено Николаем Богойчевым в bpo-16099).
venv¶
venv
принимает новый параметр --prompt
. Этот параметр предоставляет альтернативный префикс для виртуальной среды. (Предложено Лукашем Бальцерзаком и перенесено в 3.6 Стефаном Виртелом в bpo-22829).
предупреждения¶
В функцию warnings.warn_explicit()
добавлен новый необязательный параметр source: уничтоженный объект, испустивший ResourceWarning
. Атрибут source также был добавлен в warnings.WarningMessage
(внесен Виктором Стиннером в bpo-26568 и bpo-26567).
Когда регистрируется предупреждение ResourceWarning
, теперь используется модуль tracemalloc
, чтобы попытаться получить трассировку, где был выделен уничтоженный объект.
Пример со скриптом example.py
:
import warnings
def func():
return open(__file__)
f = func()
f = None
Вывод команды python3.6 -Wd -X tracemalloc=5 example.py
:
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
Отслеживание «Object allocated at» является новым и отображается только в том случае, если tracemalloc
отслеживает выделение памяти Python и если модуль warnings
уже был импортирован.
winreg¶
Добавлен 64-битный целочисленный тип REG_QWORD
. (Внесено Клеманом Руо в bpo-23026).
winsound¶
Позволяет передавать аргументы с ключевыми словами в Beep
, MessageBeep
и PlaySound
(bpo-27982).
xmlrpc.client¶
Модуль xmlrpc.client
теперь поддерживает отмаршаллинг дополнительных типов данных, используемых в реализации Apache XML-RPC для чисел и None
. (Внесено Сергеем Сторчакой в bpo-26885).
zip-файл¶
Новый метод класса ZipInfo.from_file()
позволяет создать экземпляр ZipInfo
из файла файловой системы. Новый метод ZipInfo.is_dir()
может использоваться для проверки того, представляет ли экземпляр ZipInfo
каталог. (Внесено Томасом Клюйвером в bpo-26039).
Метод ZipFile.open()
теперь можно использовать для записи данных в ZIP-файл, а также для извлечения данных. (Внесено Томасом Клюйвером в bpo-26039).
zlib¶
Функции compress()
и decompress()
теперь принимают аргументы в виде ключевых слов. (Вклад внесли Авив Паливода в bpo-26243 и Сян Чжан в bpo-16764 соответственно).
Оптимизации¶
Интерпретатор Python теперь использует 16-битный wordcode вместо bytecode, что позволило оптимизировать ряд опкодов. (Вклад Демура Румеда при участии и рецензиях Сергея Сторчака и Виктора Стиннера в bpo-26647 и bpo-28050).
Класс
asyncio.Future
теперь имеет оптимизированную реализацию на языке C. (Вклад Юрия Селиванова и Наоки Инады в bpo-26081).Класс
asyncio.Task
теперь имеет оптимизированную реализацию на языке C. (Внесено Юрием Селивановым в bpo-28544).Различные улучшения в реализации модуля
typing
(например, кэширование общих типов) позволяют повысить производительность до 30 раз и уменьшить занимаемую память.Декодер ASCII теперь работает в 60 раз быстрее для обработчиков ошибок
surrogateescape
,ignore
иreplace
(Внесено Виктором Стиннером в bpo-24870).Кодировщики ASCII и Latin1 теперь работают в 3 раза быстрее для обработчика ошибок
surrogateescape
(внесено Виктором Стиннером в bpo-25227).Кодировщик UTF-8 теперь в 75 раз быстрее для обработчиков ошибок
ignore
,replace
,surrogateescape
,surrogatepass
(Внесено Виктором Стиннером в bpo-25267).Декодер UTF-8 теперь работает в 15 раз быстрее для обработчиков ошибок
ignore
,replace
иsurrogateescape
(Внесено Виктором Стиннером в bpo-25301).bytes % args
теперь работает в 2 раза быстрее. (Внесено Виктором Стиннером в bpo-25349).bytearray % args
теперь работает в 2,5-5 раз быстрее. (Внесено Виктором Стиннером в bpo-25399).Оптимизируйте
bytes.fromhex()
иbytearray.fromhex()
: теперь они работают в 2 - 3,5 раза быстрее. (Внесено Виктором Стиннером в bpo-25401).Оптимизация
bytes.replace(b'', b'.')
иbytearray.replace(b'', b'.')
: до 80 % быстрее. (Внесено Джошем Снайдером в bpo-26574).Функции аллокатора домена
PyMem_Malloc()
(PYMEM_DOMAIN_MEM
) теперь используют функцию pymalloc memory allocator вместоmalloc()
библиотеки C. Аллокатор pymalloc оптимизирован для объектов размером меньше или равным 512 байт с коротким временем жизни, а для больших блоков памяти используетсяmalloc()
. (Внесено Виктором Стиннером в bpo-26249).pickle.load()
иpickle.loads()
теперь работают на 10 % быстрее при десериализации множества мелких объектов (вклад Виктора Стиннера в bpo-27056).Передача keyword arguments в функцию имеет накладные расходы по сравнению с передачей positional arguments. Теперь в функциях расширения, реализованных с использованием Argument Clinic, эти накладные расходы значительно снижены. (Внесено Сергеем Сторчакой в bpo-27574).
Оптимизированы функции
glob()
иiglob()
в модулеglob
; теперь они работают примерно в 3–6 раз быстрее. (Внесено Сергеем Сторчакой в bpo-25596).Оптимизирована работа globbing в
pathlib
с помощьюos.scandir()
; теперь она работает примерно в 1,5–4 раза быстрее. (Внесено Сергеем Сторчакой в bpo-26032).Значительно улучшена производительность парсинга, итерации и глубокого копирования
xml.etree.ElementTree
. (Вклад Сергея Сторчака в bpo-25638, bpo-25873 и bpo-25869).Создание экземпляров
fractions.Fraction
из плавающих и десятичных чисел теперь происходит в 2-3 раза быстрее. (Внесено Сергеем Сторчакой в bpo-25971).
Изменения в сборке и C API¶
Для сборки Python теперь требуется поддержка C99 в цепочке инструментов. В частности, Python теперь использует стандартные целочисленные типы и макросы вместо пользовательских макросов типа
PY_LONG_LONG
. Для получения дополнительной информации смотрите PEP 7 и bpo-17884.Кросс-компиляция CPython с Android NDK и уровнем Android API, установленным на 21 (Android 5.0 Lollipop) или выше, проходит успешно. Хотя Android еще не является поддерживаемой платформой, тестовый набор Python работает на эмуляторе Android с ошибками только в 16 тестах. См. мета-выпуск bpo-26865, посвященный Android.
Был добавлен флаг конфигурации
--enable-optimizations
. Его включение активирует дорогостоящие оптимизации, такие как PGO. (Оригинальное исправление Алешандру Патраску из Intel в bpo-26359).Теперь при вызове функций аллокаторов доменов
PYMEM_DOMAIN_OBJ
(например,PyObject_Malloc()
) иPYMEM_DOMAIN_MEM
(например,PyMem_Malloc()
) необходимо удерживать значение GIL.Новый
Py_FinalizeEx()
API, который указывает, не удалось ли выполнить промывку буферизованных данных. (Внесено Мартином Пантером в bpo-5319).PyArg_ParseTupleAndKeywords()
теперь поддерживает positional-only parameters. Параметры, задаваемые только позициями, определяются пустыми именами. (Внесено Сергеем Сторчакой в bpo-26282).Метод
PyTraceback_Print
теперь сокращает длинные последовательности повторяющихся строк как"[Previous line repeated {count} more times]"
. (Внесено Эмануэлем Барри в bpo-26823).Новая функция
PyErr_SetImportErrorSubclass()
позволяет указать подклассImportError
для повышения уровня. (Внесено Эриком Сноу в bpo-15767).Новая функция
PyErr_ResourceWarning()
может быть использована для генерацииResourceWarning
, указывающей источник распределения ресурсов. (Внесено Виктором Стиннером в bpo-26567).Новая функция
PyOS_FSPath()
возвращает представление файловой системы в виде path-like object. (Внесено Бреттом Кэнноном в bpo-27186).Функции
PyUnicode_FSConverter()
иPyUnicode_FSDecoder()
теперь будут принимать path-like objects.
Прочие улучшения¶
Когда
--version
(краткая форма:-V
) передается дважды, Python выводитsys.version
для получения подробной информации.$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
Утратившие актуальность¶
Новые ключевые слова¶
async
и await
не рекомендуется использовать в качестве имен переменных, классов, функций или модулей. Введенные в качестве PEP 492 в Python 3.5, они станут правильными ключевыми словами в Python 3.7. Начиная с Python 3.6, использование async
или await
в качестве имен будет приводить к появлению DeprecationWarning
.
Устаревшее поведение Python¶
Возбуждение исключения StopIteration
внутри генератора теперь будет генерировать DeprecationWarning
и вызывать RuntimeError
в Python 3.7. Подробности см. в разделе PEP 479: Изменение обработки StopIteration внутри генераторов.
Теперь ожидается, что метод __aiter__()
будет возвращать асинхронный итератор напрямую, а не возвращать awaitable, как раньше. В первом случае будет срабатывать DeprecationWarning
. Обратная совместимость будет устранена в Python 3.7. (Внесено Юрием Селивановым в bpo-27243).
Пара обратный слеш-символ, не являющаяся допустимой последовательностью символов, теперь генерирует DeprecationWarning
. Хотя со временем это станет SyntaxError
, это произойдет не раньше нескольких выпусков Python. (Внесено Эмануэлем Барри в bpo-27364).
При выполнении относительного импорта возврат к __name__
и __path__
из вызывающего модуля, когда __spec__
или __package__
не определены, теперь вызывает ошибку ImportWarning
. (Внесено Роуз Эймс в bpo-25791).
Утратившие актуальность модули, функции и методы Python¶
asynchat¶
В настоящее время asynchat
упразднен в пользу asyncio
. (Внесено Mariatta в bpo-25002).
asyncore¶
В настоящее время asyncore
упразднен в пользу asyncio
. (Внесено Mariatta в bpo-25002).
dbm¶
В отличие от других реализаций dbm
, модуль dbm.dumb
создает базы данных в режиме 'rw'
и позволяет изменять открытые базы данных в режиме 'r'
. Сейчас это поведение устарело и будет удалено в 3.8. (Внесено Сергеем Сторчакой в bpo-21708).
distutils¶
Недокументированный аргумент extra_path
в конструкторе distutils.Distribution
теперь считается устаревшим и при его установке будет выдаваться предупреждение. Поддержка этого параметра будет удалена в одном из будущих выпусков Python. Подробности см. в разделе bpo-27919.
группа¶
Поддержка нецелых аргументов в getgrgid()
была отменена. (Внесено Сергеем Сторчакой в bpo-26129).
importlib¶
Методы importlib.machinery.SourceFileLoader.load_module()
и importlib.machinery.SourcelessFileLoader.load_module()
теперь устарели. Они были единственными оставшимися реализациями importlib.abc.Loader.load_module()
в importlib
, которые не были отменены в предыдущих версиях Python в пользу importlib.abc.Loader.exec_module()
.
Класс importlib.machinery.WindowsRegistryFinder
теперь устарел. Начиная с версии 3.6.0, он по-прежнему добавляется в sys.meta_path
по умолчанию (в Windows), но это может измениться в будущих выпусках.
os¶
Недокументированная поддержка общего bytes-like objects в качестве путей в функциях os
, compile()
и аналогичных функциях теперь не поддерживается. (Внесено Сергеем Сторчакой в bpo-25791 и bpo-26754).
re¶
Поддержка встроенных флагов (?letters)
в середине регулярного выражения была устаревшей и будет удалена в одной из следующих версий Python. Флаги в начале регулярного выражения по-прежнему разрешены. (Внесено Сергеем Сторчакой в bpo-22493).
ssl¶
OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль ssl
будет требовать как минимум OpenSSL 1.0.2 или 1.1.0.
Связанные с SSL аргументы, такие как certfile
, keyfile
и check_hostname
в ftplib
, http.client
, imaplib
, poplib
и smtplib
, были отменены в пользу context
. (Внесено Кристианом Хаймсом в bpo-28022).
Несколько протоколов и функций модуля ssl
теперь устарели. Некоторые функции больше не будут доступны в будущих версиях OpenSSL. Другие функции устарели в пользу другого API. (Внесено Кристианом Хаймсом в bpo-28022 и bpo-26470).
tkinter¶
Модуль tkinter.tix
теперь устарел. Пользователи tkinter
должны использовать tkinter.ttk
вместо него.
venv¶
Скрипт pyvenv
был упразднен в пользу python3 -m venv
. Это позволяет избежать путаницы в вопросе о том, к какому интерпретатору Python подключен pyvenv
и, соответственно, какой интерпретатор Python будет использоваться виртуальным окружением. (Внесено Бреттом Кэнноном в bpo-25154).
xml¶
xml
xml¶
xml
xml¶
xml
Удалено¶
Удалено¶
Удалено
Удалено
Класс
traceback.Ignore
и методыtraceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
,traceback.find_strings
,traceback.find_executable_lines
были удалены из модуляtraceback
. Это были недокументированные методы, устаревшие с Python 3.2, и эквивалентная функциональность доступна в приватных методах.Удалены фиктивные методы
tk_menuBar()
иtk_bindForTraversal()
в классах виджетовtkinter
(соответствующие команды Tk были устаревшими с Tk 4.0).Метод
open()
классаzipfile.ZipFile
больше не поддерживает режим'U'
(был устаревшим с Python 3.4). Используйтеio.TextIOWrapper
для чтения сжатых текстовых файлов в режиме universal newlines.Недокументированные модули
IN
,CDROM
,DLFCN
,TYPES
,CDIO
иSTROPTS
были удалены. Они были доступны в каталогахLib/plat-*/
, но были хронически устаревшими, непостоянно доступными на разных платформах и не поддерживались. Скрипт, создавший эти модули, по-прежнему доступен в исходном дистрибутиве по адресу Tools/scripts/h2py.py.Устаревший класс
asynchat.fifo
был удален.
Переход на Python 3.6¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении команды „python“¶
Вывод специальной сборки Python с определенными макросами
COUNT_ALLOCS
,SHOW_ALLOC_COUNT
илиSHOW_TRACK_COUNT
теперь отключен по умолчанию. Его можно снова включить с помощью опции-X showalloccount
. Теперь он выводится вstderr
вместоstdout
. (Внесено Сергеем Сторчакой в bpo-23034).
Изменения в API Python¶
open()
больше не позволит сочетать флаг режима'U'
с'+'
. (Внесено Джеффом Балогом и Джоном О’Коннором из bpo-2091).sqlite3
больше не фиксирует неявно открытую транзакцию перед DDL-запросами.В Linux
os.urandom()
теперь блокируется до тех пор, пока не будет инициализирован системный пул энтропии urandom, чтобы повысить безопасность.Если задан
importlib.abc.Loader.exec_module()
, то должен быть задан иimportlib.abc.Loader.create_module()
.PyErr_SetImportError()
теперь возвращаетTypeError
, когда его аргумент msg не установлен. Ранее возвращалось толькоNULL
.Формат атрибута
co_lnotab
объектов кода изменен для поддержки отрицательной дельты номера строки. По умолчанию Python не выдает байткод с отрицательной дельтой номера строки. Функции, использующиеframe.f_lineno
,PyFrame_GetLineNumber()
илиPyCode_Addr2Line()
, не затронуты. Функции, напрямую декодирующиеco_lnotab
, должны быть обновлены для использования знакового 8-битного целого типа для дельты номера строки, но это требуется только для поддержки приложений, использующих отрицательную дельту номера строки. Форматco_lnotab
и способы его декодирования см. вObjects/lnotab_notes.txt
, а обоснование - в PEP 511.Функции в модуле
compileall
теперь возвращают булевы числа вместо1
или0
для обозначения успеха или неудачи, соответственно. Благодаря тому, что булевы являются подклассом целых чисел, это должно быть проблемой только в том случае, если вы выполняете проверку идентичности для1
или0
. См. bpo-25768.Чтение атрибута
port
из результатовurllib.parse.urlsplit()
иurlparse()
теперь возвращаетValueError
для значений, выходящих за пределы диапазона, вместо того, чтобы возвращатьNone
. См. bpo-20059.Модуль
imp
теперь вызываетDeprecationWarning
вместоPendingDeprecationWarning
.В атрибуты
__all__
следующих модулей были добавлены недостающие API, чтобы они соответствовали документированным API:calendar
,cgi
,csv
,ElementTree
,enum
,fileinput
,ftplib
,logging
,mailbox
,mimetypes
,optparse
,plistlib
,smtpd
,subprocess
,tarfile
,threading
иwave
. Это означает, что они будут экспортировать новые символы при использованииimport *
. (Внесено Джоэлем Таддеем и Яцеком Колодзеем в bpo-23883).При выполнении относительного импорта, если
__package__
не сравнивается с__spec__.parent
, выдается сообщениеImportWarning
. (Внесено Бреттом Кэнноном в bpo-25791).Если выполняется относительный импорт, а родительский пакет не известен, то будет выдано сообщение
ImportError
. Ранее можно было вызватьSystemError
. (Внесено Бреттом Кэнноном в bpo-18018).Серверы, основанные на модуле
socketserver
, включая те, что определены вhttp.server
,xmlrpc.server
иwsgiref.simple_server
, теперь перехватывают только исключения, вытекающие изException
. Таким образом, если обработчик запроса поднимает исключение типаSystemExit
илиKeyboardInterrupt
,handle_error()
больше не вызывается, и исключение остановит однопоточный сервер. (Внесено Мартином Пантером в bpo-23430).spwd.getspnam()
теперь выдаетPermissionError
вместоKeyError
, если у пользователя нет привилегий.Метод
socket.socket.close()
теперь вызывает исключение, если базовый системный вызов сообщил об ошибке (например,EBADF
). (Внесено Мартином Пантером в bpo-26685).Аргументом decode_data для конструкторов
smtpd.SMTPChannel
иsmtpd.SMTPServer
теперь по умолчанию являетсяFalse
. Это означает, что аргументом, передаваемым вprocess_message()
, теперь по умолчанию является объект bytes, а вprocess_message()
будут передаваться аргументы с ключевым словом. Код, который уже был обновлен в соответствии с предупреждением об устаревании, выпущенным в версии 3.5, не будет затронут.Все необязательные аргументы функций
dump()
,dumps()
,load()
иloads()
, а также конструкторов классовJSONEncoder
иJSONDecoder
в модулеjson
теперь равны keyword-only. (Внесено Сергеем Сторчакой в bpo-18726).Подклассы
type
, не переопределившиеtype.__new__
, больше не могут использовать одноаргументную форму для получения типа объекта.В рамках PEP 487 обработка аргументов ключевых слов, передаваемых в
type
(кроме подсказки метакласса,metaclass
), теперь последовательно делегируетсяobject.__init_subclass__()
. Это означает, чтоtype.__new__()
иtype.__init__()
теперь принимают произвольные аргументы ключевых слов, ноobject.__init_subclass__()
(который вызывается изtype.__new__()
) по умолчанию будет их отклонять. Пользовательские метаклассы, принимающие дополнительные аргументы в виде ключевых слов, должны будут соответствующим образом скорректировать свои вызовыtype.__new__()
(напрямую или черезsuper
).В
distutils.command.sdist.sdist
атрибутdefault_format
был удален и больше не используется. Вместо этого формат gzipped tarfile используется по умолчанию на всех платформах, и выбор для конкретной платформы не делается. В средах, где дистрибутивы собираются под Windows и требуются zip-дистрибутивы, сконфигурируйте проект с файломsetup.cfg
, содержащим следующее:[sdist] formats=zip
Это поведение также было перенесено в более ранние версии Python в Setuptools 26.0.0.
В модуле
urllib.request
и методеhttp.client.HTTPConnection.request()
, если не указано поле заголовка Content-Length и тело запроса представляет собой файловый объект, он теперь отправляется с кодировкой HTTP 1.1 chunked. Если файловый объект должен быть отправлен на сервер HTTP 1.0, значение Content-Length теперь должно быть указано вызывающей стороной. (Внесено Демианом Брехтом и Рольфом Кралем с поправками Мартина Пантера в bpo-12319).Теперь
DictReader
возвращает строки типаOrderedDict
. (Внесено Стивом Холденом в bpo-27842).Значение
crypt.METHOD_CRYPT
больше не будет добавляться кcrypt.methods
, если оно не поддерживается платформой. (Внесено Виктором Стиннером в bpo-25287).Аргументы verbose и rename для
namedtuple()
теперь работают только по ключевому слову. (Внесено Раймондом Хеттингером в bpo-25628).В Linux
ctypes.util.find_library()
теперь ищет общие библиотеки вLD_LIBRARY_PATH
. (Внесено Винаем Саджипом в bpo-9998).Класс
imaplib.IMAP4
теперь обрабатывает флаги, содержащие символ']'
в сообщениях, отправляемых с сервера, для улучшения совместимости с реальным миром. (Внесено Литой Чо в bpo-21815).Функция
mmap.write()
теперь возвращает количество записанных байт, как и другие методы записи. (Внесено Якубом Стасяком в bpo-26335).Функции
pkgutil.iter_modules()
иpkgutil.walk_packages()
теперь возвращают именованные кортежиModuleInfo
. (Внесено Рамчандрой Апте в bpo-17211).re.sub()
теперь выдает ошибку при недопустимых ссылках на числовые группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых групповых ссылок теперь включает индекс группы и позицию ссылки. (Вклад SilentGhost, Serhiy Storchaka в bpo-25953).zipfile.ZipFile
теперь будет вызыватьNotImplementedError
для нераспознанных значений сжатия. Ранее выдавалась обычная ошибкаRuntimeError
. Кроме того, вызов методовZipFile
на закрытом ZipFile или вызов методаwrite()
на ZipFile, созданном в режиме'r'
, приведет к появлению сообщенияValueError
. Ранее в этих сценариях возникала ошибкаRuntimeError
.когда пользовательские метаклассы сочетаются с нулевым аргументом
super()
или прямыми ссылками из методов на неявную переменную закрытия__class__
, неявный элемент пространства имен__classcell__
теперь должен передаваться вtype.__new__
для инициализации. Невыполнение этого требования приведет кDeprecationWarning
в Python 3.6 иRuntimeError
в Python 3.8.С введением
ModuleNotFoundError
потребители систем импорта могут начать ожидать, что заменители систем импорта будут при необходимости вызывать это более конкретное исключение, а не менее конкретноеImportError
. Чтобы обеспечить совместимость с такими потребителями в будущем, разработчики альтернативных систем импорта, полностью заменяющих__import__()
, должны будут обновить свои реализации, чтобы они поднимали новый подкласс, когда модуль вообще не может быть найден. Реализаторам совместимых плагинов к системе импорта по умолчанию не нужно вносить никаких изменений, так как система импорта по умолчанию будет поднимать новый подкласс, когда это необходимо.
Изменения в API языка C¶
Семейство аллокаторов
PyMem_Malloc()
теперь использует pymalloc allocator, а не системныйmalloc()
. Приложения, вызывающиеPyMem_Malloc()
без удержания GIL, теперь могут аварийно завершить работу. Установите переменную окруженияPYTHONMALLOC
в значениеdebug
, чтобы подтвердить использование аллокаторов памяти в вашем приложении. Смотрите bpo-26249.Py_Exit()
(и основной интерпретатор) теперь переопределяют статус выхода на 120, если промывка буферизованных данных не удалась. См. bpo-5319.
Изменения байткода CPython¶
В Python 3.6 произошло несколько серьезных изменений в bytecode.
Интерпретатор Python теперь использует 16-битный wordcode вместо bytecode. (Внесено Демуром Румедом при участии и рецензиях Сергея Сторчака и Виктора Стиннера в bpo-26647 и bpo-28050).
Новые опкоды
FORMAT_VALUE
иBUILD_STRING
как часть реализации formatted string literal. (Вклад Эрика Смита в bpo-25483 и Сергея Сторчака в bpo-27078).Новый опкод
BUILD_CONST_KEY_MAP
для оптимизации создания словарей с постоянными ключами. (Внесено Сергеем Сторчакой в bpo-27140).Опкоды вызова функций были сильно переработаны для повышения производительности и упрощения реализации. Опкоды
MAKE_FUNCTION
,CALL_FUNCTION
,CALL_FUNCTION_KW
иBUILD_MAP_UNPACK_WITH_CALL
были изменены, новыеCALL_FUNCTION_EX
иBUILD_TUPLE_UNPACK_WITH_CALL
были добавлены, а опкодыCALL_FUNCTION_VAR
,CALL_FUNCTION_VAR_KW
иMAKE_CLOSURE
были удалены. (Вклад Демура Румеда в bpo-27095 и Сергея Сторчака в bpo-27213, bpo-28257).Новые опкоды
SETUP_ANNOTATIONS
иSTORE_ANNOTATION
были добавлены для поддержки нового синтаксиса variable annotation. (Внесено Иваном Левкивским в bpo-27985).
Заметные изменения в Python 3.6.2¶
Новая цель сборки make regen-all
¶
Чтобы упростить кросс-компиляцию и обеспечить надежную компиляцию CPython, не требующую наличия существующей версии Python, система сборки на основе autotools больше не пытается неявно перекомпилировать сгенерированные файлы на основе времени модификации файлов.
Вместо этого была добавлена новая команда make regen-all
для принудительной регенерации этих файлов, когда это необходимо (например, после того, как начальная версия Python уже была собрана на основе предварительно сгенерированных версий).
Также определяются более избирательные цели регенерации - подробности см. в разделе Makefile.pre.in.
(Внесено Виктором Стиннером в bpo-23404).
Added in version 3.6.2.
Удаление цели сборки make touch
¶
Цель сборки make touch
, ранее использовавшаяся для запроса неявной регенерации сгенерированных файлов путем обновления времени их модификации, была удалена.
Она была заменена новой целью make regen-all
.
(Внесено Виктором Стиннером в bpo-23404).
Изменено в версии 3.6.2.
Заметные изменения в Python 3.6.4¶
Синглтон PyExc_RecursionErrorInst
, который был частью общедоступного API, был удален, так как его члены, никогда не очищаемые, могут вызвать segfault при завершении работы интерпретатора. (Внесено Ксавье де Гаем в bpo-22898 и bpo-30697).
Заметные изменения в Python 3.6.5¶
Функция locale.localeconv()
теперь временно устанавливает локаль LC_CTYPE
на локаль LC_NUMERIC
в некоторых случаях. (Внесено Виктором Стиннером в bpo-31900).
Заметные изменения в Python 3.6.7¶
Модули xml.dom.minidom
и xml.sax
больше не обрабатывают внешние сущности по умолчанию. См. также gh-61441.
В версии 3.6.7 модуль tokenize
теперь неявно выдает токен NEWLINE
, когда на вход подается информация, не содержащая новой строки в конце. Такое поведение теперь соответствует тому, что делает внутренний токенизатор языка C. (Внесено Аммаром Аскаром в bpo-33899).
Заметные изменения в Python 3.6.10¶
По соображениям безопасности параметр reuse_address asyncio.loop.create_datagram_endpoint()
больше не поддерживается. Это связано с поведением параметра сокета SO_REUSEADDR
в UDP. Для получения более подробной информации см. документацию по loop.create_datagram_endpoint()
. (Внесено Кайлом Стэнли, Антуаном Питру и Юрием Селивановым в bpo-37228).
Заметные изменения в Python 3.6.13¶
В предыдущих версиях Python в качестве разделителей параметров запроса можно было использовать и ;
, и &
в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, а по умолчанию используется &
. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют затронутые функции внутри. Более подробную информацию можно найти в соответствующей документации. (Внесено Адамом Голдшмидтом, Сентхилом Кумараном и Кеном Джином в bpo-42967).
Заметные изменения в Python 3.6.14¶
Исправление безопасности изменяет поведение ftplib.FTP
, чтобы не доверять IPv4-адресу, отправленному с удаленного сервера при установке пассивного канала передачи данных. Вместо этого мы используем IP-адрес ftp-сервера. Для необычного кода, требующего старого поведения, установите для атрибута trust_server_pasv_ipv4_address
экземпляра FTP значение True
(см. gh-87451).
Наличие символов новой строки или табуляции в части URL позволяет осуществлять некоторые виды атак. Согласно спецификации WHATWG, обновляющей RFC 3986, символы ASCII новой строки \n
, \r
и табуляции \t
удаляются из URL парсером urllib.parse()
, предотвращая такие атаки. Удаление символов контролируется новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
(см. gh-88048).