Содержание страницы
Что нового в Python 3.6¶What’s New In Python 3.6
- Редакторы:
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
Эта статья описывает новые возможности Python 3.6 по сравнению с 3.5. Python 3.6 был выпущен 23 декабря 2016. См. журнал изменений для полного списка изменений.
См. также
PEP 494 – График выпуска Python 3.6
Итоги – основные изменения¶Summary – Release highlights
Новые синтаксические возможности:
PEP 498, форматированные строковые литералы.
PEP 515, символы подчёркивания в числовых литералах.
PEP 526, синтаксис аннотаций переменных.
PEP 525, асинхронные генераторы.
PEP 530: асинхронные включения.
Новые модули библиотеки:
Улучшения реализации CPython:
Тип dict был переработан для использования более компактного представления, основанного на предложении Рэймонда Хеттингера и аналогичного реализации dict в PyPy. Это привело к тому, что словари потребляют на 20–25% меньше памяти по сравнению с Python 3.5.
Настройка создания классов упрощена с помощью нового протокола.
Порядок определения атрибутов класса теперь сохраняется.
Порядок элементов в
**kwargsтеперь соответствует порядку, в котором именованные аргументы были переданы функции.Добавлена поддержка зондирования DTrace и SystemTap.
Новая переменная окружения PYTHONMALLOC теперь может использоваться для отладки распределения памяти интерпретатора и ошибок доступа.
Значительные улучшения в стандартной библиотеке:
Модуль
asyncioполучил новые возможности, значительные улучшения удобства использования и производительности, а также изрядное количество исправлений ошибок. Начиная с Python 3.6 модульasyncioбольше не является экспериментальным и его API считается стабильным.Новый протокол путей файловой системы был реализован для поддержки путеподобных объектов. Все функции стандартной библиотеки, работающие с путями, были обновлены для работы с новым протоколом.
Модуль
datetimeполучил поддержку устранения неоднозначности местного времени.Модуль
tracemallocбыл значительно переработан и теперь используется для обеспечения лучшего вывода дляResourceWarning, а также для обеспечения лучшей диагностики ошибок выделения памяти. Смотрите раздел PYTHONMALLOC для получения дополнительной информации.
Улучшения в области безопасности:
Новый модуль
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 символов на путь может больше не применяться. Смотрите снятие ограничения MAX_PATH для получения подробной информации.Файл
._pthможно добавить, чтобы принудительно включить изолированный режим и полностью задать все пути поиска, избегая поиска в реестре и окружении. Смотрите документацию для получения дополнительной информации.Файл
python36.zipтеперь служит ориентиром для определенияPYTHONHOME. Смотрите документацию для получения дополнительной информации.
Новые возможности¶New Features
PEP 498: Форматированные строковые литералы¶PEP 498: Formatted string literals
PEP 498 вводит новый вид строковых литералов: f-строки, или форматированные строковые литералы.
Форматированные строковые литералы имеют префикс 'f' и аналогичны
строкам формата, принимаемым str.format(). Они содержат поля замены,
заключённые в фигурные скобки. Поля замены – это выражения,
которые вычисляются во время выполнения, а затем форматируются с использованием
протокола format():
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # вложенные поля
'result: 12.35'
См. также
- PEP 498 – Интерполяция строковых литералов.
PEP написан и реализован Eric V. Smith.
PEP 526: Синтаксис аннотаций переменных¶PEP 526: Syntax for variable annotations
PEP 484 ввёл стандарт для аннотаций типов параметров функций, также известных как подсказки типов. Этот PEP добавляет в Python синтаксис для аннотации типов переменных, включая переменные классов и экземпляров:
primes: List[int] = []
captain: str # Примечание: нет начального значения!
class Starship:
stats: Dict[str, int] = {}
Как и в случае аннотаций функций, интерпретатор Python не придаёт
никакого особого значения аннотациям переменных и просто хранит их в атрибуте
__annotations__ класса или модуля.
В отличие от объявлений переменных в статически типизированных языках,
цель синтаксиса аннотаций – предоставить простой способ задания структурированных
метаданных типов для сторонних инструментов и библиотек через абстрактное синтаксическое дерево
и атрибут __annotations__.
PEP 515: Подчёркивания в числовых литералах¶PEP 515: Underscores in Numeric Literals
PEP 515 добавляет возможность использовать подчёркивания в числовых литералах для улучшения читаемости. Например:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
Одиночные подчёркивания допускаются между цифрами и после указателя основания. Ведущие, завершающие или несколько подряд идущих подчёркиваний не допускаются.
Язык строкового форматирования теперь также поддерживает
опцию '_' для обозначения использования подчёркивания в качестве разделителя тысяч
для типов представления с плавающей запятой и для целочисленного
типа представления 'd'. Для целочисленных типов представления 'b',
'o', 'x' и 'X' подчёркивания будут вставляться каждые 4
цифры:
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
См. также
- PEP 515 – Подчёркивания в числовых литералах
PEP написан Георгом Брандлем и Сергием Сторчакой.
PEP 525: Асинхронные генераторы¶PEP 525: Asynchronous Generators
PEP 492 ввёл поддержку нативных корутин и синтаксиса async / await
в Python 3.5. Заметным ограничением реализации Python 3.5
было то, что нельзя было использовать await и yield в одном
теле функции. В Python 3.6 это ограничение было снято, что позволило
определять асинхронные генераторы:
async def ticker(delay, to):
"""Генерирует числа от 0 до *to* каждые *delay* секунд."""
for i in range(to):
yield i
await asyncio.sleep(delay)
Новый синтаксис позволяет писать более быстрый и лаконичный код.
См. также
- PEP 525 – Асинхронные генераторы
PEP написан и реализован Юрием Селивановым.
PEP 530: Асинхронные включения¶PEP 530: Asynchronous Comprehensions
PEP 530 добавляет поддержку использования async for в списочных, множественных, словарных
включениях и генераторных выражениях:
result = [i async for i in aiter() if i % 2]
Кроме того, выражения await поддерживаются во всех видах
включений:
result = [await fun() for fun in funcs if await condition()]
См. также
- PEP 530 – Асинхронные включения
PEP написан и реализован Юрием Селивановым.
PEP 487: Упрощённая настройка создания классов¶PEP 487: Simpler customization of class creation
Теперь можно настраивать создание подклассов без использования метакласса.
Новый метод класса __init_subclass__ будет вызываться на базовом классе
при создании каждого нового подкласса:
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
Чтобы вызовы super() без аргументов корректно работали в
реализациях __init_subclass__(), пользовательские метаклассы должны
гарантировать, что новая запись пространства имён __classcell__ передаётся в
type.__new__ (как описано в Создание объекта класса).
См. также
- PEP 487 – Упрощённая настройка создания классов
PEP написан и реализован Мартином Тайхманом.
PEP 487: Улучшения протокола дескрипторов¶PEP 487: Descriptor Protocol Enhancements
PEP 487 расширяет протокол дескрипторов, добавляя новый необязательный
метод __set_name__(). При каждом определении нового класса этот новый
метод будет вызываться на всех дескрипторах, включённых в определение, предоставляя
им ссылку на определяемый класс и имя, данное дескриптору в пространстве имён класса.
Другими словами, экземпляры дескрипторов теперь могут знать имя атрибута дескриптора в
классе-владельце:
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# это новый инициализатор:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
См. также
- PEP 487 – Упрощённая настройка создания классов
PEP написан и реализован Мартином Тайхманом.
PEP 519: Добавление протокола путей файловой системы¶PEP 519: Adding a file system path protocol
Пути файловой системы исторически представлялись как объекты str
или bytes. Это привело к тому, что разработчики кода, работающего с путями файловой системы,
предполагают, что такие объекты относятся только к одному из этих двух типов (int,
представляющий файловый дескриптор, не считается, так как это не путь к файлу).
К сожалению, такое предположение мешает альтернативным объектным представлениям путей
файловой системы, таким как pathlib, работать с существующим кодом,
включая стандартную библиотеку Python.
Чтобы исправить эту ситуацию, был определён новый интерфейс, представленный
os.PathLike. Реализуя метод __fspath__(), объект сигнализирует, что он
представляет путь. Затем объект может предоставить низкоуровневое
представление пути файловой системы в виде объекта str или
bytes. Это означает, что объект считается
путеподобным, если он реализует
os.PathLike или является объектом str или bytes,
который представляет путь файловой системы. Код может использовать os.fspath(),
os.fsdecode() или os.fsencode() для явного получения
представления str и/или bytes путеподобного объекта.
Встроенная функция open() была обновлена для принятия
объектов os.PathLike, как и все соответствующие функции в модулях
os и os.path, а также большинство других функций и
классов в стандартной библиотеке. Класс os.DirEntry
и соответствующие классы в pathlib также были обновлены для
реализации os.PathLike.
Надеемся, что обновление фундаментальных функций для работы
с путями файловой системы приведёт к тому, что сторонний код будет неявно
поддерживать все путеподобные объекты без каких-либо
изменений кода или, по крайней мере, с минимальными (например, вызов
os.fspath() в начале кода перед работой с путеподобным объектом).
Вот несколько примеров того, как новый интерфейс позволяет использовать pathlib.Path проще и прозрачнее с существующим кодом:
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(Реализовано Бреттом Кэнноном, Итаном Фурманом, Дасти Филлипсом и Йелле Зейлстрой.)
См. также
- PEP 519 – Добавление протокола путей файловой системы
PEP написан Бреттом Кэнноном и Кусом Зевенховеном.
PEP 495: Устранение неоднозначности местного времени¶PEP 495: Local Time Disambiguation
В большинстве регионов мира были и будут моменты, когда местные часы переводятся назад. В такие моменты возникают интервалы, в течение которых местные часы показывают одно и то же время дважды за день. В этих ситуациях информации, отображаемой на местных часах (или хранящейся в экземпляре Python datetime), недостаточно для идентификации конкретного момента времени.
PEP 495 добавляет новый атрибут fold к экземплярам классов datetime.datetime и datetime.time, чтобы различать два момента времени, для которых местные времена одинаковы:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
Значения атрибута fold имеют значение 0 для всех экземпляров, кроме тех, которые представляют второй (хронологически) момент времени в неоднозначном случае.
См. также
- PEP 495 – Устранение неоднозначности местного времени
PEP написан Александром Белопольским и Тимом Питерсом, реализация – Александром Белопольским.
PEP 529: Изменение кодировки файловой системы Windows на UTF-8¶PEP 529: Change Windows filesystem encoding to UTF-8
Представление путей файловой системы лучше всего выполнять с помощью str (Unicode), а не bytes. Однако есть ситуации, когда использование bytes достаточно и корректно.
До Python 3.6 использование путей в виде bytes в Windows могло приводить к потере данных. Благодаря этому изменению использование bytes для представления путей теперь поддерживается в Windows при условии, что эти bytes закодированы с помощью кодировки, возвращаемой sys.getfilesystemencoding(), которая теперь по умолчанию равна 'utf-8'.
Приложения, не использующие str для представления путей, должны использовать os.fsencode() и os.fsdecode(), чтобы гарантировать правильную кодировку их bytes. Чтобы вернуть предыдущее поведение, установите PYTHONLEGACYWINDOWSFSENCODING или вызовите sys._enablelegacywindowsfsencoding().
См. PEP 529 для получения дополнительной информации и обсуждения возможных изменений кода.
PEP 528: Изменение кодировки консоли Windows на UTF-8¶PEP 528: Change Windows console encoding to UTF-8
Консоль по умолчанию в Windows теперь принимает все символы Unicode и предоставляет корректно прочитанные объекты str для кода Python. sys.stdin, sys.stdout и sys.stderr теперь по умолчанию используют кодировку utf-8.
Это изменение применяется только при использовании интерактивной консоли, а не при перенаправлении файлов или каналов. Чтобы вернуть предыдущее поведение для интерактивной консоли, установите PYTHONLEGACYWINDOWSSTDIO.
См. также
- PEP 528 – Изменение кодировки консоли Windows на UTF-8
PEP написан и реализован Стивом Дауэром.
PEP 520: Сохранение порядка определения атрибутов класса¶PEP 520: Preserving Class Attribute Definition Order
Атрибуты в теле определения класса имеют естественный порядок: тот же порядок, в котором имена появляются в исходном коде. Этот порядок теперь сохраняется в атрибуте __dict__ нового класса.
Кроме того, действующее пространство имён execution класса по умолчанию (возвращаемое из type.__prepare__()) теперь является отображением, сохраняющим порядок вставки.
См. также
- PEP 520 – Сохранение порядка определения атрибутов класса
PEP написан и реализован Эриком Сноу.
PEP 468: Сохранение порядка именованных аргументов¶PEP 468: Preserving Keyword Argument Order
**kwargs в сигнатуре функции теперь гарантированно является отображением, сохраняющим порядок вставки.
См. также
- PEP 468 – Сохранение порядка именованных аргументов
PEP написан и реализован Эриком Сноу.
Новая dict реализация¶New dict implementation
Тип dict теперь использует «компактное» представление, основанное на предложении Рэймонда Хеттингера, которое было впервые реализовано в PyPy. Потребление памяти нового dict() на 20–25% меньше по сравнению с Python 3.5.
Аспект сохранения порядка в этой новой реализации считается деталью реализации, и на него не следует полагаться (это может измениться в будущем, но желательно, чтобы эта новая реализация dict побыла в языке несколько релизов, прежде чем менять спецификацию языка, чтобы требовать семантику сохранения порядка для всех текущих и будущих реализаций Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где всё ещё действует случайный порядок итерации, например, Python 3.5).
(Автор: INADA Naoki в bpo-27350. Идея изначально предложена Рэймондом Хеттингером.)
PEP 523: Добавление API для оценки фреймов в CPython¶PEP 523: Adding a frame evaluation API to CPython
Хотя Python предоставляет широкие возможности для настройки выполнения кода, одним из мест, где этого не было, является оценка объектов фреймов. Если требовался способ перехвата оценки фреймов в Python, то без прямого манипулирования указателями на функции для определённых функций его не было.
PEP 523 меняет это, предоставляя API для подключения оценки фреймов на уровне C. Это позволит таким инструментам, как отладчики и JIT-компиляторы, перехватывать оценку фреймов до начала выполнения кода Python. Это даёт возможность использовать альтернативные реализации оценки для кода Python, отслеживание оценки фреймов и т.д.
Это API не является частью ограниченного C API и помечено как приватное, чтобы указать, что его использование предполагается ограниченным и применимым только к очень специфическим низкоуровневым сценариям. Семантика API будет меняться по мере необходимости вместе с Python.
См. также
- PEP 523 – Добавление API оценки фреймов в CPython
PEP написан Бреттом Кэнноном и Дино Вилендом.
Переменная окружения PYTHONMALLOC¶PYTHONMALLOC environment variable
Новая переменная окружения PYTHONMALLOC позволяет настраивать распределители памяти Python и устанавливать отладочные перехватчики.
Теперь можно устанавливать отладочные перехватчики на распределители памяти Python в Python, скомпилированном в режиме выпуска, с помощью PYTHONMALLOC=debug. Эффекты отладочных перехватчиков:
Вновь выделенная память заполняется байтом
0xCBОсвобождённая память заполняется байтом
0xDBОбнаружение нарушений API распределителя памяти Python. Например,
PyObject_Free()вызывается для блока памяти, выделенного черезPyMem_Malloc().Обнаружение записи до начала буфера (недополнение буфера)
Обнаружение записи после конца буфера (переполнение буфера)
Проверка, удерживается ли GIL при вызове функций распределителя доменов
PYMEM_DOMAIN_OBJ(например,PyObject_Malloc()) иPYMEM_DOMAIN_MEM(например,PyMem_Malloc()).
Проверка удержания GIL – также новая возможность Python 3.6.
Смотрите функцию PyMem_SetupDebugHooks() для отладочных перехватчиков на распределителях памяти Python.
Теперь также можно принудительно использовать распределитель malloc() библиотеки C для всех выделений памяти Python с помощью PYTHONMALLOC=malloc. Это полезно при использовании внешних отладчиков памяти, таких как Valgrind, для Python, скомпилированного в режиме выпуска.
При ошибке отладочные перехватчики на распределителях памяти Python теперь используют модуль tracemalloc для получения трассировки стека, где был выделен блок памяти.
Пример фатальной ошибки при переполнении буфера с использованием python3.6 -X tracemalloc=5 (сохранять 5 фреймов в трассировках):
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 для отладки malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
Поддержка зондов DTrace и SystemTap¶DTrace and SystemTap probing support
Python теперь может быть собран с --with-dtrace, что включает статические маркеры для следующих событий в интерпретаторе:
вызов/возврат функции
начало/завершение сборки мусора
выполнение строки кода.
Это можно использовать для инструментирования работающих интерпретаторов в производственной среде без необходимости перекомпиляции отладочных сборок или написания прикладного кода профилирования/отладки.
Подробнее в Инструментирование CPython с помощью DTrace и SystemTap.
Текущая реализация протестирована на Linux и macOS. В будущем могут быть добавлены дополнительные маркеры.
(Автор: Łukasz Langa в bpo-21590, на основе патчей Jesús Cea Avión, David Malcolm и Nikhil Benesch.)
Прочие изменения языка ¶Other Language Changes
Некоторые небольшие изменения, внесённые в ядро языка Python:
Оператор
globalилиnonlocalтеперь должен текстуально располагаться до первого использования затрагиваемого имени в той же области видимости. Ранее это былоSyntaxWarning.Теперь можно задать специальный метод как
None, чтобы указать, что соответствующая операция недоступна. Например, если в классе установить__iter__()вNone, класс не будет итерируемым. (Авторы: Andrew Barnert и Ivan Levkivskyi в bpo-25958.)Длинные последовательности повторяющихся строк трассировки теперь сокращаются как
"[Previous line repeated {count} more times]"(пример см. в traceback). (Автор: Emanuel Barry в bpo-26823.)Теперь при импорте, если модуль не найден, вызывается новое исключение
ModuleNotFoundError(подклассImportError). Код, который сейчас проверяет ImportError (в try-except), по-прежнему будет работать. (Автор: Eric Snow в bpo-15767.)Методы класса, которые полагаются на вызов
super()без аргументов, теперь будут работать корректно при вызове из методов метакласса во время создания класса. (Автор: Martin Teichmann в bpo-23722.)
Новые модули¶New Modules
secrets¶
Основная цель нового модуля secrets – предоставить очевидный способ
надёжной генерации криптостойких псевдослучайных значений, подходящих
для управления секретами, такими как аутентификация учётных записей, токены и т.п.
Предупреждение
Обратите внимание, что псевдослучайные генераторы в модуле random
НЕ должны использоваться для целей безопасности. Используйте secrets
на Python 3.6+ и os.urandom() на Python 3.5 и более ранних версиях.
См. также
- PEP 506 – Добавление модуля Secrets в стандартную библиотеку
PEP написан и реализован Steven D’Aprano.
Улучшенные модули¶Improved Modules
array¶
Исчерпанные итераторы array.array теперь остаются исчерпанными, даже
если итерируемый массив расширен. Это соответствует поведению
других изменяемых последовательностей.
Автор: Serhiy Storchaka в bpo-26492.
ast¶
Добавлен новый узел AST ast.Constant. Он может использоваться
внешними оптимизаторами AST для целей свёртывания констант.
Автор: Victor Stinner в bpo-26146.
asyncio¶
Начиная с Python 3.6, модуль asyncio больше не является временным, и его
API считается стабильным.
Заметные изменения в модуле asyncio, начиная с Python 3.5.0
(все перенесены в 3.5.x из-за временного статуса):
Функция
get_event_loop()изменена так, чтобы всегда возвращать текущий выполняющийся цикл событий при вызове из корутин и колбэков. (Автор: Yury Selivanov в bpo-28613.)Функция
ensure_future()и все функции, которые её используют, такие какloop.run_until_complete(), теперь принимают все виды ожидаемых объектов. (Автор: Yury Selivanov.)Новая функция
run_coroutine_threadsafe()для отправки корутин в циклы событий из других потоков. (Автор: Vincent Michel.)Новый метод
Transport.is_closing()для проверки, закрывается ли транспорт или уже закрыт. (Автор: Yury Selivanov.)Метод
loop.create_server()теперь может принимать список хостов. (Автор: Yann Sionneau.)Новый метод
loop.create_future()для создания объектов Future. Это позволяет альтернативным реализациям цикла событий, таким как uvloop, предоставлять более быструю реализациюasyncio.Future. (Автор: Yury Selivanov в bpo-27041.)Новый метод
loop.get_exception_handler()для получения текущего обработчика исключений. (Автор: Yury Selivanov в bpo-27040.)Новый метод
StreamReader.readuntil()для чтения данных из потока до появления последовательности байтов-разделителей. (Автор: Mark Korenberg.)Производительность
StreamReader.readexactly()улучшена. (Автор: Mark Korenberg в bpo-28370.)Метод
loop.getaddrinfo()оптимизирован, чтобы избегать вызова системной функцииgetaddrinfo, если адрес уже разрешён. (Автор: A. Jesse Jiryu Davis.)Метод
loop.stop()изменён: теперь он останавливает цикл сразу после текущей итерации. Любые новые колбэки, запланированные в результате последней итерации, будут отброшены. (Автор: Guido van Rossum в bpo-25593.)Future.set_exceptionтеперь будет вызыватьTypeError, если ему передать экземпляр исключенияStopIteration. (Автор: Chris Angelico в bpo-26221.)Новый метод
loop.connect_accepted_socket()предназначен для серверов, которые принимают соединения вне asyncio, но используют asyncio для их обработки. (Предложено Джимом Фултоном в bpo-27392.)Флаг
TCP_NODELAYтеперь по умолчанию устанавливается для всех TCP-транспортов. (Предложено Юрием Селивановым в bpo-27456.)Новый
loop.shutdown_asyncgens()для корректного закрытия ожидающих асинхронных генераторов перед закрытием цикла. (Предложено Юрием Селивановым в bpo-28003.)Классы
FutureиTaskтеперь имеют оптимизированную реализацию на C, что ускоряет код asyncio до 30%. (Предложено Юрием Селивановым и Инадой Наоки в bpo-26081 и bpo-28544.)
binascii¶
Функция b2a_base64() теперь принимает необязательный именованный аргумент newline, управляющий добавлением символа новой строки к возвращаемому значению. (Предложено Виктором Стиннером в bpo-25357.)
cmath¶
Добавлена новая константа cmath.tau (τ). (Предложено Лизой Роуч в bpo-12345; подробнее см. PEP 628.)
Новые константы: cmath.inf и cmath.nan, соответствующие math.inf и math.nan, а также cmath.infj и cmath.nanj, соответствующие формату представления complex. (Предложено Марком Дикинсоном в bpo-23229.)
collections¶
Добавлен новый абстрактный базовый класс Collection для представления размерных итерируемых классов-контейнеров. (Предложено Иваном Левкивским, документация – Нил Гирдхар в bpo-27598.)
Новый абстрактный базовый класс Reversible представляет итерируемые классы, которые также предоставляют метод __reversed__(). (Предложено Иваном Левкивским в bpo-25987.)
Новый абстрактный базовый класс AsyncGenerator представляет асинхронные генераторы. (Предложено Юрием Селивановым в bpo-28720.)
Функция namedtuple() теперь принимает необязательный именованный аргумент module, который при указании используется для атрибута __module__ возвращаемого класса именованного кортежа. (Предложено Рэймондом Хеттингером в bpo-17941.)
Аргументы verbose и rename для namedtuple() теперь являются только именованными. (Вклад Рэймонда Хеттингера в bpo-25628.)
Рекурсивные экземпляры collections.deque теперь можно сериализовать с помощью модуля pickle. (Предложено Сергеем Сторчакой в bpo-26482.)
concurrent.futures¶
Конструктор класса ThreadPoolExecutor теперь принимает необязательный аргумент thread_name_prefix, позволяющий настраивать имена потоков, создаваемых пулом. (Предложено Грегори П. Смитом в bpo-27664.)
contextlib¶
Добавлен класс contextlib.AbstractContextManager, предоставляющий абстрактный базовый класс для контекстных менеджеров. Он содержит разумную реализацию по умолчанию для __enter__(), которая возвращает self и оставляет __exit__() абстрактным методом. Соответствующий класс добавлен в модуль typing как typing.ContextManager. (Предложено Бреттом Кэнноном в bpo-25609.)
datetime¶
Классы datetime и time получили новый атрибут fold, используемый для устранения неоднозначности местного времени при необходимости. Многие функции в datetime были обновлены для поддержки разрешения неоднозначности местного времени. Подробнее см. раздел Local Time Disambiguation. (Предложено Александром Белопольским в bpo-24773.)
Методы datetime.strftime() и date.strftime() теперь поддерживают директивы даты ISO 8601 %G, %u и %V. (Предложено Эшли Андерсоном в bpo-12006.)
Функция datetime.isoformat() теперь принимает необязательный аргумент timespec, указывающий количество дополнительных компонентов значения времени для включения. (Предложено Алессандро Куччи и Александром Белопольским в bpo-19475.)
datetime.combine() теперь принимает необязательный аргумент tzinfo. (Предложено Александром Белопольским в bpo-27661.)
decimal¶
Новый метод Decimal.as_integer_ratio(), возвращающий пару (n, d) целых чисел, представляющих заданный экземпляр Decimal в виде дроби, сокращенной до несократимых членов и с положительным знаменателем:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(Предложено Стефаном Кра и Марком Дикинсоном в bpo-25928.)
distutils¶
Атрибут default_format удалён из distutils.command.sdist.sdist, а атрибут formats по умолчанию равен ['gztar']. Хотя это не ожидалось, любой код, полагающийся на наличие default_format, возможно, потребуется адаптировать. Подробнее см. bpo-27819.
email¶
Новый почтовый API, включаемый с помощью ключевого слова policy в различных конструкторах, больше не является предварительным. Документация email была реорганизована и переписана с упором на новый API, при этом сохранена старая документация для устаревшего API. (Предложено Р. Дэвидом Мюрреем в bpo-24277.)
Все классы email.mime теперь принимают необязательный параметр policy.
(Автор: Berker Peksag в bpo-27331.)
Теперь DecodedGenerator поддерживает ключевой аргумент policy.
Появился новый атрибут policy, message_factory, который определяет, какой класс используется
по умолчанию, когда парсер создаёт новые объекты сообщений. Для
политики email.policy.compat32 это Message,
для новых политик – EmailMessage.
(Автор: R. David Murray в bpo-20476.)
encodings¶
В Windows добавлена кодировка 'oem', использующая CP_OEMCP, а также псевдоним 'ansi'
для существующей кодировки 'mbcs', которая использует кодовую страницу CP_ACP.
(Автор: Steve Dower в bpo-27959.)
enum¶
В модуль enum добавлены два новых базовых класса перечислений:
Flag и IntFlag. Оба используются для определения
констант, которые можно комбинировать с помощью побитовых операторов.
(Автор: Ethan Furman в bpo-23591.)
Многие модули стандартной библиотеки были обновлены: теперь они используют
класс IntFlag для своих констант.
Новое значение enum.auto можно использовать для автоматического присвоения значений элементам перечисления:
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
faulthandler ¶
В Windows модуль faulthandler теперь устанавливает обработчик для исключений Windows:
см. faulthandler.enable(). (Автор: Victor Stinner в bpo-23848.)
fileinput¶
hook_encoded() теперь поддерживает аргумент errors.
(Автор: Joseph Hackman в bpo-25788.)
hashlib¶
hashlib поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2.
(Автор: Christian Heimes в bpo-26470.)
В модуль добавлены хеш-функции BLAKE2. blake2b()
и blake2s() всегда доступны и поддерживают полный
набор возможностей BLAKE2.
(Автор: Christian Heimes в bpo-26798 на основе кода
Dmitry Chestnykh и Samuel Neves. Документация написана Dmitry Chestnykh.)
Добавлены хеш-функции SHA-3 sha3_224(), sha3_256(),
sha3_384(), sha3_512() и хеш-функции SHAKE
shake_128() и shake_256().
(Автор: Christian Heimes в bpo-16113. Пакет кода Keccak
от Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche и
Ronny Van Keer.)
Функция получения ключа на основе пароля scrypt() теперь
доступна в OpenSSL 1.1.0 и новее.
(Автор: Christian Heimes в bpo-27928.)
http.client¶
HTTPConnection.request() и
endheaders() теперь оба поддерживают
кодирование передаваемых частями (chunked encoding) тел запросов.
(Авторы: Demian Brecht и Rolf Krahl в bpo-12319.)
idlelib и IDLE¶idlelib and IDLE
Пакет idlelib модернизируется и рефакторится, чтобы улучшить внешний вид и работу IDLE, а также сделать код более понятным, тестируемым и улучшаемым. Часть улучшений внешнего вида, особенно на Linux и Mac, заключается в использовании виджетов ttk, в основном в диалоговых окнах. В результате IDLE больше не работает с tcl/tk 8.4. Теперь требуется tcl/tk 8.5 или 8.6. Рекомендуется использовать последнюю версию любого из них.
«Модернизация» включает переименование и консолидацию модулей idlelib. Переименование файлов с частично заглавными именами похоже на переименование, например, Tkinter и TkFont в tkinter и tkinter.font в версии 3.0. В результате импорты файлов idlelib, которые работали в 3.5, обычно не будут работать в 3.6. Как минимум потребуется изменить имя модуля (см. idlelib/README.txt), иногда и больше. (Изменения имён выполнены Al Swiegart и Terry Reedy в bpo-24225. Большинство последующих и будущих патчей idlelib являются частью этого процесса.)
В качестве компенсации, конечным результатом станет то, что некоторые классы idlelib будут проще в использовании, с лучшими API и поясняющими их docstrings. Дополнительная полезная информация будет добавлена в idlelib, когда станет доступна.
Новое в версии 3.6.2:
Множество исправлений для автодополнения. (Вклад Луи Лу в bpo-15786.)
Новое в версии 3.6.3:
Module Browser (в меню File, ранее назывался Class Browser), теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Вклад Гильерме Поло, Шерил Сабеллы и Терри Джан Риди в bpo-1612262.)
Функции IDLE, ранее реализованные как расширения, теперь реализованы как обычные функции. Их настройки перенесены с вкладки «Расширения» на другие вкладки диалоговых окон. (Предложено Charles Wohlganger и Terry Jan Reedy в bpo-27099.)
Диалог Settings (Options, Configure IDLE) был частично переписан для улучшения как внешнего вида, так и функциональности. (Вклад Шерил Сабеллы и Терри Джан Риди в нескольких тикетах.)
Новое в версии 3.6.4:
Образец шрифта теперь включает подборку нелатинских символов, чтобы пользователи могли лучше оценить эффект выбора конкретного шрифта. (Предложено Terry Jan Reedy в bpo-13802.) Образец можно редактировать, добавляя другие символы. (Предложено Serhiy Storchaka в bpo-31860.)
Новое в версии 3.6.6:
Обновлена опция контекста кода редактора. Окно отображает все строки контекста до maxlines. Нажатие на строку контекста перемещает редактор к этой строке. Цвета контекста для пользовательских тем добавлены на вкладку «Подсветка» диалогового окна настроек. (Предложено Cheryl Sabella и Terry Jan Reedy в bpo-33642, bpo-33768 и bpo-33679.)
В Windows новый вызов API сообщает Windows, что tk масштабируется под DPI. На Windows 8.1+ или 10, при неизменённых свойствах совместимости DPI двоичного файла Python и разрешении монитора более 96 DPI, это должно сделать текст и линии более чёткими. В остальных случаях это не должно оказывать эффекта. (Предложено Terry Jan Reedy в bpo-33656.)
Новое в версии 3.6.7:
Вывод длиннее N строк (по умолчанию 50) сворачивается в кнопку. N можно изменить в разделе PyShell на вкладке General диалогового окна Settings. Меньшее количество строк, но возможно очень длинных, можно свернуть, щелкнув правой кнопкой по выводу. Свёрнутый вывод можно развернуть на месте двойным щелчком по кнопке, либо в буфер обмена или отдельное окно щелчком правой кнопки по кнопке. (Предложено Tal Einat в bpo-1529353.)
importlib¶
Импорт теперь вызывает новое исключение ModuleNotFoundError (подкласс ImportError), когда не может найти модуль. Код, который сейчас проверяет ImportError (в try-except), продолжит работать. (Автор: Eric Snow в bpo-15767.)
importlib.util.LazyLoader теперь вызывает create_module() для обёрнутого загрузчика, снимая ограничение, что importlib.machinery.BuiltinImporter и importlib.machinery.ExtensionFileLoader нельзя было использовать с importlib.util.LazyLoader.
importlib.util.cache_from_source(), importlib.util.source_from_cache() и importlib.util.spec_from_file_location() теперь принимают объект, подобный пути.
inspect¶
Функция inspect.signature() теперь сообщает о неявных параметрах .0, которые компилятор создаёт для областей видимости включений и выражений генераторов, так, как если бы это были позиционные параметры с именем implicit0. (Автор: Jelle Zijlstra в bpo-19611.)
Чтобы уменьшить объём изменений в коде при обновлении с Python 2.7 и устаревшего API inspect.getargspec(), ранее задокументированное объявление устаревшим inspect.getfullargspec() было отменено. Хотя эта функция удобна для единой кодовой базы Python 2/3, более богатый интерфейс inspect.signature() остаётся рекомендуемым подходом для нового кода. (Автор: Nick Coghlan в bpo-27172)
json¶
json.load() и json.loads() теперь поддерживают двоичный ввод. Закодированный JSON должен быть представлен в UTF-8, UTF-16 или UTF-32. (Автор: Serhiy Storchaka в bpo-17909.)
logging¶
Добавлен новый метод WatchedFileHandler.reopenIfNeeded(), предоставляющий возможность проверить, нужно ли переоткрыть файл журнала. (Автор: Marian Horban в bpo-24884.)
math¶
Константа тау (τ) добавлена в модули math и cmath. (Автор: Lisa Roach в bpo-12345; подробности см. в PEP 628.)
multiprocessing¶
Объекты-прокси, возвращаемые multiprocessing.Manager(), теперь могут быть вложенными. (Автор: Davin Potts в bpo-6766.)
os¶
Подробности о том, как модули os и os.path теперь поддерживают объекты, подобные пути, см. в описании PEP 519.
scandir() теперь поддерживает пути bytes в Windows.
Новый метод close() позволяет явно закрыть итератор scandir(). Итератор scandir() теперь поддерживает протокол менеджера контекста. Если итератор scandir() не исчерпан и не закрыт явно, в его деструкторе будет сгенерировано предупреждение ResourceWarning. (Автор: Serhiy Storchaka в bpo-25994.)
В Linux os.urandom() теперь блокируется до инициализации системного пула энтропии urandom для повышения безопасности. Обоснование см. в PEP 524.
Системный вызов Linux getrandom() (получить случайные байты) теперь доступен как новая функция os.getrandom(). (Автор: Victor Stinner, часть PEP 524)
pathlib¶
pathlib теперь поддерживает объекты, подобные пути. (Автор: Brett Cannon в bpo-27186.)
Подробности см. в описании PEP 519.
pdb¶
Конструктор класса Pdb получил новый необязательный аргумент readrc для управления тем, следует ли читать файлы .pdbrc.
pickle¶
Объекты, которым требуется __new__ с именованными аргументами, теперь можно сериализовать с помощью протоколов pickle старше версии 4 протокола.
Версия 4 протокола уже поддерживает такой случай. (Вклад Serhiy Storchaka в bpo-24164.)
pickletools¶
pickletools.dis() теперь выводит неявный индекс memo для опкода MEMOIZE.
(Вклад Serhiy Storchaka в bpo-25382.)
pydoc¶
Модуль pydoc научился учитывать переменную окружения MANPAGER.
(Вклад Matthias Klose в bpo-8637.)
help() и pydoc теперь могут выводить поля именованных кортежей в порядке их определения, а не в алфавитном.
(Вклад Raymond Hettinger в bpo-24879.)
random¶
Новая функция choices() возвращает список элементов заданного размера из указанной совокупности с возможностью указания весов.
(Вклад Raymond Hettinger в bpo-18844.)
re¶
Добавлена поддержка модификаторов диапазонов в регулярных выражениях. Примеры:
'(?i:p)ython' соответствует 'python' и 'Python', но не 'PYTHON';
'(?i)g(?-i:v)r' соответствует 'GvR' и 'gvr', но не 'GVR'.
(Вклад Serhiy Storchaka в bpo-433028.)
К группам объекта сопоставления можно обращаться по __getitem__, что эквивалентно group(). Теперь mo['name'] эквивалентно mo.group('name'). (Вклад Eric Smith в bpo-24454.)
Объекты Match теперь поддерживают index-like objects в качестве индексов групп.
(Вклад Jeroen Demeyer и Xiang Zhang в bpo-27177.)
readline¶
Добавлено set_auto_history() для включения или отключения автоматического добавления ввода в список истории. (Вклад Tyler Crompton в bpo-26870.)
rlcompleter¶
Закрытые и специальные имена атрибутов теперь опускаются, если только префикс не начинается с подчёркиваний. Пробел или двоеточие добавляется после некоторых завершённых ключевых слов. (Вклад Serhiy Storchaka в bpo-25011 и bpo-25209.)
shlex¶
Класс shlex получил значительно улучшенную совместимость с оболочкой благодаря новому аргументу punctuation_chars, который управляет тем, какие символы считаются знаками пунктуации.
(Вклад Vinay Sajip в bpo-1521950.)
site¶
При указании путей для добавления в sys.path в файле .pth теперь можно указывать пути к файлам наряду с каталогами (например, zip-файлы).
(Вклад Wolfgang Langner в bpo-26587).
sqlite3¶
sqlite3.Cursor.lastrowid теперь поддерживает оператор REPLACE.
(Вклад Alex LordThorsen в bpo-16864.)
socket¶
Функция ioctl() теперь поддерживает управляющий код SIO_LOOPBACK_FAST_PATH.
(Вклад Daniel Stokes в bpo-26536.)
Константы getsockopt(): SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC и SO_PASSSEC теперь поддерживаются.
(Вклад Christian Heimes в bpo-26907.)
Функция setsockopt() теперь поддерживает форму setsockopt(level, optname, None, optlen: int).
(Вклад Christian Heimes в bpo-27744.)
Модуль socket теперь поддерживает семейство адресов AF_ALG для взаимодействия с криптографическим API ядра Linux. Были добавлены ALG_*, SOL_ALG и sendmsg_afalg().
(Вклад Christian Heimes в bpo-27744 при поддержке Victor Stinner.)
Добавлены новые константы Linux TCP_USER_TIMEOUT и TCP_CONGESTION.
(Вклад Omar Sandoval, bpo-26273).
socketserver¶
Серверы на основе модуля socketserver, включая определённые в http.server, xmlrpc.server и wsgiref.simple_server, теперь поддерживают протокол контекстного менеджера.
(Вклад Aviv Palivoda в bpo-26404.)
Атрибут wfile классов StreamRequestHandler теперь реализует интерфейс io.BufferedIOBase для записи. В частности, вызов write() теперь гарантированно отправляет данные полностью.
(Вклад Martin Panter в bpo-26721.)
ssl¶
ssl поддерживает OpenSSL 1.1.0. Минимальная рекомендуемая версия – 1.0.2.
(Автор: Christian Heimes в bpo-26470.)
3DES удалён из набора шифров по умолчанию, добавлены наборы шифров ChaCha20 Poly1305. (Автор: Christian Heimes в bpo-27850 и bpo-27766.)
SSLContext имеет более качественную конфигурацию по умолчанию для опций и шифров.
(Автор: Christian Heimes в bpo-28043.)
SSL-сессию можно скопировать из одного клиентского соединения в другое с помощью нового класса SSLSession. Возобновление TLS-сессии может ускорить начальное рукопожатие, уменьшить задержку и повысить производительность.
(Автор: Christian Heimes в bpo-19500 на основе черновика Alex Warhawk.)
Новый метод get_ciphers() можно использовать для получения списка включённых шифров в порядке их приоритета.
Все константы и флаги преобразованы в IntEnum и IntFlag.
(Автор: Christian Heimes в bpo-28025.)
Добавлены серверные и клиентские протоколы TLS для SSLContext.
(Автор: Christian Heimes в bpo-28085.)
Добавлены ssl.SSLContext.post_handshake_auth для включения и ssl.SSLSocket.verify_client_post_handshake() для инициации аутентификации после рукопожатия TLS 1.3.
(Автор: Christian Heimes, gh-78851.)
statistics¶
Добавлена новая функция harmonic_mean().
(Автор: Steven D'Aprano в bpo-27181.)
struct¶
struct теперь поддерживает числа с плавающей запятой половинной точности IEEE 754 через спецификатор формата 'e'.
(Авторы: Eli Stevens, Mark Dickinson в bpo-11734.)
подпроцесс¶subprocess
Деструктор subprocess.Popen теперь выдаёт предупреждение ResourceWarning, если дочерний процесс всё ещё выполняется. Используйте протокол контекстного менеджера (with
proc: ...) или явно вызывайте метод wait() для чтения кода завершения дочернего процесса. (Автор: Victor Stinner в bpo-26741.)
Конструктор subprocess.Popen и все функции, передающие ему аргументы, теперь принимают аргументы encoding и errors. Указание любого из них включает текстовый режим для потоков stdin, stdout и stderr.
(Автор: Steve Dower в bpo-6135.)
sys¶
Новая функция getfilesystemencodeerrors() возвращает имя режима ошибок, используемого для преобразования между именами файлов в Unicode и байтах.
(Автор: Steve Dower в bpo-27781.)
В Windows возвращаемое значение функции getwindowsversion() теперь включает поле platform_version, которое содержит точные номера основной, дополнительной версии и сборки текущей операционной системы, а не версию, эмулируемую для процесса.
(Автор: Steve Dower в bpo-27932.)
telnetlib¶
telnetlib.Telnet теперь является контекстным менеджером (автор: Stéphane Wirtel в bpo-25485).
time¶
Атрибуты struct_time, tm_gmtoff и tm_zone теперь доступны на всех платформах.
timeit¶
Добавлен новый удобный метод Timer.autorange() для многократного вызова Timer.timeit() таким образом, чтобы общее время выполнения было не меньше 200 миллисекунд.
(Автор: Steven D'Aprano в bpo-6422.)
timeit теперь предупреждает, когда есть существенное (в 4 раза) различие между лучшим и худшим временем.
(Автор: Serhiy Storchaka в bpo-23552.)
tkinter¶
Добавлены методы Variable.trace_add(), Variable.trace_remove() и trace_info() в классе tkinter.Variable. Они заменяют старые методы trace_variable(), trace(), trace_vdelete() и trace_vinfo(), которые используют устаревшие команды Tcl и могут не работать в будущих версиях Tcl.
(Автор: Serhiy Storchaka в bpo-22115).
traceback¶
Как модуль traceback, так и встроенное отображение исключений интерпретатора теперь сокращают длинные последовательности повторяющихся строк в трассировках, как показано в следующем примере:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(Автор: Emanuel Barry в bpo-26823.)
tracemalloc¶
Модуль tracemalloc теперь поддерживает трассировку выделений памяти в нескольких различных адресных пространствах.
Добавлен новый класс фильтра DomainFilter для фильтрации следов блоков по их адресному пространству (домену).
(Предложено Виктором Штиннером в bpo-26588.)
typing¶
Поскольку модуль typing является временным,
все изменения, внесённые в Python 3.6, также были
перенесены в Python 3.5.x.
Модуль typing получил значительно улучшенную поддержку обобщённых псевдонимов типов. Например, Dict[str, Tuple[S, T]] теперь является допустимой
аннотацией типа.
(Предложено Гвидо ван Россумом в Github #195.)
Добавлен класс typing.ContextManager для
представления contextlib.AbstractContextManager.
(Предложено Бреттом Кэнноном в bpo-25609.)
Добавлен класс typing.Collection для
представления collections.abc.Collection.
(Предложено Иваном Левкивским в bpo-27598.)
Добавлена конструкция типа typing.ClassVar для
обозначения переменных класса. Как представлено в PEP 526, аннотация переменной,
обёрнутая в ClassVar, указывает, что данный атрибут предназначен для использования в качестве
переменной класса и не должен устанавливаться на экземплярах этого класса.
(Предложено Иваном Левкивским в Github #280.)
Новая константа TYPE_CHECKING, которая статическими проверяющими типами считается
True, но во время выполнения является False.
(Предложено Гвидо ван Россумом в Github #230.)
Добавлена новая вспомогательная функция NewType() для создания
облегчённых отдельных типов для аннотаций:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
Статический проверяющий типов будет обрабатывать новый тип так, как если бы он был подклассом исходного типа. (Предложено Иваном Левкивским в Github #189.)
unicodedata¶
Модуль unicodedata теперь использует данные из Unicode 9.0.0.
(Предложено Бенджамином Петерсоном.)
unittest.mock¶
Класс Mock получил следующие улучшения:
Два новых метода:
Mock.assert_called()иMock.assert_called_once()для проверки, был ли вызван объект-заглушка. (Предложено Амит Саха в bpo-26323.)Метод
Mock.reset_mock()теперь имеет два необязательных аргумента, передаваемых только по ключу: return_value и side_effect. (Предложено Кушалом Дасом в bpo-21271.)
urllib.request¶
Если HTTP-запрос имеет тело в виде файла или итерируемого объекта (не являющегося
объектом bytes), но не имеет заголовка Content-Length, то теперь вместо
возникновения ошибки AbstractHTTPHandler
переключается на использование фрагментированной передачи (chunked transfer encoding).
(Предложено Демианом Брехтом и Рольфом Кралем в bpo-12319.)
urllib.robotparser¶
RobotFileParser теперь поддерживает расширения Crawl-delay и
Request-rate.
(Предложено Николаем Богоячевым в bpo-16099.)
venv¶
venv принимает новый параметр --prompt. Этот параметр предоставляет
альтернативный префикс для виртуального окружения. (Предложено Лукашем Бальцержаком
и портировано на 3.6 Стефаном Виртелем в bpo-22829.)
warnings¶
Новый необязательный параметр source добавлен в функцию
warnings.warn_explicit(): уничтоженный объект, породивший предупреждение
ResourceWarning. Атрибут source также добавлен в
warnings.WarningMessage (предложено Виктором Штиннером в
bpo-26568 и bpo-26567).
При регистрации предупреждения ResourceWarning теперь используется модуль tracemalloc,
чтобы попытаться получить трассировку того места, где был размещён уничтоженный объект.
Пример со скриптом example.py:
import warnings
def func():
return open(__file__)
f = func()
f = None
Вывод команды python3.6 -Wd -X tracemalloc=5 example.py:
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
Трассировка «Объект размещён по адресу» является новой и отображается только в том случае, если
tracemalloc отслеживает выделения памяти Python и если
модуль warnings уже был импортирован.
winreg¶
Добавлен 64-битный целочисленный тип REG_QWORD.
(Предложено Клементом Руо в bpo-23026.)
winsound¶
Разрешена передача именованных аргументов в Beep,
MessageBeep и PlaySound (bpo-27982).
xmlrpc.client¶
Модуль xmlrpc.client теперь поддерживает распаковку (unmarshalling)
дополнительных типов данных, используемых реализацией Apache XML-RPC
для числовых значений и None.
(Автор: Serhiy Storchaka в bpo-26885.)
zipfile¶
Новый метод класса ZipInfo.from_file()
позволяет создать экземпляр ZipInfo из файла файловой системы.
Новый метод ZipInfo.is_dir() можно использовать
для проверки, представляет ли экземпляр ZipInfo каталог.
(Автор: Thomas Kluyver в bpo-26039.)
Метод ZipFile.open() теперь можно использовать для
записи данных в ZIP-файл, а также для извлечения данных.
(Автор: Thomas Kluyver в bpo-26039.)
zlib¶
Функции compress() и decompress() теперь принимают
именованные аргументы.
(Авторы: Aviv Palivoda в bpo-26243 и
Xiang Zhang в bpo-16764 соответственно.)
Оптимизации¶Optimizations
Интерпретатор Python теперь использует 16-битный wordcode вместо байткода, что позволило провести ряд оптимизаций opcode. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в bpo-26647 и bpo-28050.)
Класс
asyncio.Futureтеперь имеет оптимизированную реализацию на C. (Авторы: Yury Selivanov и INADA Naoki в bpo-26081.)Класс
asyncio.Taskтеперь имеет оптимизированную реализацию на C. (Автор: Yury Selivanov в bpo-28544.)Различные улучшения реализации в модуле
typing(например, кэширование обобщённых типов) позволяют добиться повышения производительности до 30 раз и уменьшения потребления памяти.ASCII-декодер теперь работает до 60 раз быстрее для обработчиков ошибок
surrogateescape,ignoreиreplace(Автор: Victor Stinner в bpo-24870).ASCII- и Latin1-кодеры теперь работают до 3 раз быстрее для обработчика ошибок
surrogateescape(Автор: Victor Stinner в bpo-25227).UTF-8-кодер теперь работает до 75 раз быстрее для обработчиков ошибок
ignore,replace,surrogateescape,surrogatepass(Автор: Victor Stinner в bpo-25267).UTF-8-декодер теперь работает до 15 раз быстрее для обработчиков ошибок
ignore,replaceиsurrogateescape(Автор: Victor Stinner в bpo-25301).bytes % argsтеперь работает до 2 раз быстрее. (Автор: Victor Stinner в bpo-25349).bytearray % argsтеперь работает в 2,5–5 раз быстрее. (Автор: Victor Stinner в bpo-25399).Оптимизированы
bytes.fromhex()иbytearray.fromhex(): теперь они работают в 2–3,5 раза быстрее. (Автор: Victor Stinner в bpo-25401).Оптимизированы
bytes.replace(b'', b'.')иbytearray.replace(b'', b'.'): до 80% быстрее. (Автор: Josh Snider в bpo-26574).Функции распределителя памяти домена
PyMem_Malloc()(PYMEM_DOMAIN_MEM) теперь используют распределитель памяти pymalloc вместо функцииmalloc()библиотеки C. Распределитель pymalloc оптимизирован для объектов размером не более 512 байт с коротким временем жизни и используетmalloc()для больших блоков памяти. (Автор: Victor Stinner в bpo-26249).pickle.load()иpickle.loads()теперь работают до 10% быстрее при десериализации множества мелких объектов (Автор: Victor Stinner в bpo-27056).Передача именованных аргументов в функцию требует дополнительных затрат по сравнению с передачей позиционных аргументов. Теперь в функциях расширения, реализованных с помощью Argument Clinic, эти затраты значительно снижены. (Автор: Serhiy Storchaka в bpo-27574).
Оптимизированы функции
glob()иiglob()в модулеglob; теперь они работают примерно в 3–6 раз быстрее. (Автор: Serhiy Storchaka в bpo-25596).Оптимизирована глоббинг (globbing) в
pathlibс помощьюos.scandir(); теперь она работает примерно в 1,5–4 раза быстрее. (Автор: Serhiy Storchaka в bpo-26032).Производительность разбора (parsing), итерации и deepcopy для
xml.etree.ElementTreeзначительно улучшена. (Автор: Serhiy Storchaka в bpo-25638, bpo-25873 и bpo-25869.)Создание экземпляров
fractions.Fractionиз чисел с плавающей точкой и десятичных чисел теперь в 2–3 раза быстрее. (Автор: Serhiy Storchaka в bpo-25971.)
Изменения в сборке и C API¶Build and C API Changes
Для сборки Python теперь требуется поддержка некоторых возможностей C99 в инструментальной цепочке. В частности, Python теперь использует стандартные целочисленные типы и макросы вместо пользовательских макросов, таких как
PY_LONG_LONG. Дополнительную информацию см. в PEP 7 и bpo-17884.Кросс-компиляция CPython с Android NDK и уровнем API Android, установленным на 21 (Android 5.0 Lollipop) или выше, выполняется успешно. Хотя Android пока не является поддерживаемой платформой, тестовый набор Python запускается на эмуляторе Android всего с примерно 16 неудачными тестами. См. мета-задачу Android bpo-26865.
Добавлен флаг конфигурации
--enable-optimizations. Его включение активирует дорогостоящие оптимизации, такие как PGO. (Оригинальный патч от Alecsandru Patrascu из Intel в bpo-26359.)GIL теперь должен удерживаться при вызове функций распределителя памяти доменов
PYMEM_DOMAIN_OBJ(например,PyObject_Malloc()) иPYMEM_DOMAIN_MEM(например,PyMem_Malloc()).Новый API
Py_FinalizeEx(), который сообщает, не удалась ли сброс буферизованных данных. (Автор: Martin Panter в bpo-5319.)PyArg_ParseTupleAndKeywords()теперь поддерживает только позиционные параметры. Только позиционные параметры определяются пустыми именами. (Предложено Serhiy Storchaka в bpo-26282).Метод
PyTraceback_Printтеперь сокращает длинные последовательности повторяющихся строк как"[Previous line repeated {count} more times]". (Предложено Emanuel Barry в bpo-26823.)Новая функция
PyErr_SetImportErrorSubclass()позволяет указать подклассImportErrorдля возбуждения. (Предложено Eric Snow в bpo-15767.)Новую функцию
PyErr_ResourceWarning()можно использовать для генерацииResourceWarning, предоставляющего источник выделения ресурсов. (Предложено Victor Stinner в bpo-26567.)Новая функция
PyOS_FSPath()возвращает файловое системное представление путеподобного объекта. (Предложено Brett Cannon в bpo-27186.)Функции
PyUnicode_FSConverter()иPyUnicode_FSDecoder()теперь принимают путеподобные объекты.
Другие улучшения¶Other Improvements
Если
--version(краткая форма:-V) указывается дважды, Python выводитsys.versionдля подробной информации.$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
Устарело¶Deprecated
Новые ключевые слова¶New Keywords
async и await не рекомендуется использовать в качестве имен переменных, классов,
функций или модулей. Введенные PEP 492 в Python 3.5, они станут
полноценными ключевыми словами в Python 3.7. Начиная с Python 3.6, использование
async или await в качестве имен будет вызывать DeprecationWarning.
Устаревшее поведение Python¶Deprecated Python behavior
Возбуждение исключения StopIteration внутри генератора теперь будет
генерировать DeprecationWarning и вызовет RuntimeError
в Python 3.7. Подробнее см. PEP 479: Изменение обработки StopIteration внутри генераторов.
Метод __aiter__() теперь должен возвращать асинхронный
итератор напрямую, а не ожидаемый объект, как раньше.
При возврате итератора будет вызвано DeprecationWarning. Обратная
совместимость будет удалена в Python 3.7.
(Предложено Yury Selivanov в bpo-27243.)
Пара символов обратной косой черты, не являющаяся допустимой управляющей последовательностью, теперь генерирует
DeprecationWarning. Хотя со временем это станет
SyntaxError, этого не произойдет в течение нескольких выпусков Python.
(Предложено Emanuel Barry в bpo-27364.)
При выполнении относительного импорта обращение к __name__ и
__path__ из вызывающего модуля, если __spec__ или
__package__ не определены, теперь вызывает ImportWarning.
(Предложено Rose Ames в bpo-25791.)
Устаревшие модули, функции и методы Python¶Deprecated Python modules, functions and methods
asynchat¶
asynchat устарел в пользу asyncio.
(Предложено Mariatta в bpo-25002.)
asyncore¶
asyncore устарел в пользу asyncio.
(Предложено Mariatta в bpo-25002.)
dbm¶
В отличие от других реализаций dbm, модуль dbm.dumb
создает базы данных в режиме 'rw' и позволяет изменять базу данных,
открытую в режиме 'r'. Такое поведение теперь устарело и будет
удалено в версии 3.8.
(Предложено Serhiy Storchaka в bpo-21708.)
distutils¶
Незадокументированный аргумент extra_path конструктора
distutils.Distribution теперь считается устаревшим
и будет вызывать предупреждение при его установке. Поддержка этого параметра будет
удалена в одном из будущих выпусков Python. Подробнее см. bpo-27919.
grp¶
Поддержка нецелочисленных аргументов в getgrgid() устарела.
(Предложено Serhiy Storchaka в bpo-26129.)
importlib¶
Методы importlib.machinery.SourceFileLoader.load_module() и
importlib.machinery.SourcelessFileLoader.load_module() теперь устарели. Они были единственными оставшимися реализациями
importlib.abc.Loader.load_module() в importlib, которые не были
объявлены устаревшими в предыдущих версиях Python в пользу
importlib.abc.Loader.exec_module().
Класс importlib.machinery.WindowsRegistryFinder теперь устарел. Начиная с версии 3.6.0, он все еще добавляется в sys.meta_path по
умолчанию (на Windows), но это может измениться в будущих выпусках.
os¶
Незадокументированная поддержка байтоподобных объектов общего вида
в качестве путей в функциях os, compile() и подобных функциях теперь
устарела.
(Предложено Serhiy Storchaka в bpo-25791 и bpo-26754.)
re¶
Поддержка встроенных флагов (?letters) в середине регулярного выражения устарела и будет удалена в будущей версии Python. Флаги в начале регулярного выражения по-прежнему разрешены. (Внёс Serhiy Storchaka в bpo-22493.)
ssl¶
OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль ssl будет требовать как минимум OpenSSL 1.0.2 или 1.1.0.
Аргументы, связанные с SSL, такие как certfile, keyfile и check_hostname, в ftplib, http.client, imaplib, poplib и smtplib устарели в пользу context. (Внёс Christian Heimes в bpo-28022.)
Некоторые протоколы и функции модуля ssl теперь устарели. Некоторые возможности будут недоступны в будущих версиях OpenSSL. Другие возможности устарели в пользу другого API. (Внёс Christian Heimes в bpo-28022 и bpo-26470.)
tkinter¶
Модуль tkinter.tix теперь устарел. Пользователям tkinter следует использовать tkinter.ttk вместо него.
venv¶
Скрипт pyvenv устарел в пользу python3 -m venv. Это предотвращает путаницу в том, к какому интерпретатору Python подключён pyvenv и, следовательно, какой интерпретатор Python будет использоваться виртуальным окружением. (Внёс Brett Cannon в bpo-25154.)
xml¶
В качестве меры защиты от DTD и получения внешних сущностей модули
xml.dom.minidomиxml.saxбольше не обрабатывают внешние сущности по умолчанию. (Автор: Christian Heimes в gh-61441.)
Устаревшие функции и типы C API¶Deprecated functions and types of the C API
Undocumented functions PyUnicode_AsEncodedObject(),
PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode()
and PyUnicode_AsDecodedUnicode() are deprecated now.
Use the generic codec based API instead.
Устаревшие параметры сборки¶Deprecated Build Options
Флаг конфигурации --with-system-ffi теперь включён по умолчанию на UNIX-платформах, отличных от macOS. Его можно отключить с помощью --without-system-ffi, но использование флага устарело и не будет приниматься в Python 3.7. macOS это изменение не затрагивает. Обратите внимание, что многие распространители ОС уже используют флаг --with-system-ffi при сборке своего системного Python.
Удалено¶Removed
Удаление API и функций¶API and Feature Removals
Неизвестные экранирующие последовательности, состоящие из
'\'и буквы ASCII в регулярных выражениях, теперь будут вызывать ошибку. В шаблонах замены дляre.sub()они по-прежнему разрешены, но устарели. Флагre.LOCALEтеперь может использоваться только с двоичными шаблонами.inspect.getmoduleinfo()был удалён (устарел начиная с CPython 3.3). Для получения имени модуля по заданному пути следует использоватьinspect.getmodulename(). (Внёс Yury Selivanov в bpo-13248.)Класс
traceback.Ignoreи методыtraceback.usage,traceback.modname,traceback.fullmodname,traceback.find_lines_from_code,traceback.find_lines,traceback.find_strings,traceback.find_executable_linesбыли удалены из модуляtraceback. Это были недокументированные методы, устаревшие с Python 3.2; эквивалентная функциональность доступна через приватные методы.Фиктивные методы
tk_menuBar()иtk_bindForTraversal()в классах виджетовtkinterбыли удалены (соответствующие команды Tk устарели начиная с Tk 4.0).Метод
open()классаzipfile.ZipFileбольше не поддерживает режим'U'(устарел с Python 3.4). Используйтеio.TextIOWrapperдля чтения сжатых текстовых файлов в режиме универсальных новых строк.Незадокументированные модули
IN,CDROM,DLFCN,TYPES,CDIOиSTROPTSбыли удалены. Они были доступны в каталогах, специфичных для платформыLib/plat-*/, но хронически устаревали, были непоследовательно доступны на разных платформах и не поддерживались. Скрипт, создававший эти модули, по-прежнему доступен в дистрибутиве исходного кода по адресу Tools/scripts/h2py.py.Устаревший класс
asynchat.fifoбыл удалён.
Перенос на Python 3.6¶Porting to Python 3.6
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в поведении команды ‘python’¶Changes in ‘python’ Command Behavior
Вывод специальной сборки Python с определёнными макросами
COUNT_ALLOCS,SHOW_ALLOC_COUNTилиSHOW_TRACK_COUNTтеперь по умолчанию отключён. Его можно снова включить с помощью опции-X showalloccount. Теперь он выводит вstderrвместоstdout. (Внёс Serhiy Storchaka в bpo-23034.)
Изменения в Python API¶Changes in the Python API
open()больше не будет разрешать комбинировать флаг режима'U'с'+'. (Внесли Jeff Balogh и John O’Connor в bpo-2091.)sqlite3больше не выполняет неявную фиксацию открытой транзакции перед операторами DDL.На Linux
os.urandom()теперь блокируется до инициализации пула энтропии системного urandom для повышения безопасности.Если определён
importlib.abc.Loader.exec_module(),importlib.abc.Loader.create_module()тоже должен быть определён.PyErr_SetImportError()теперь устанавливаетTypeError, если его аргумент msg не задан. Ранее возвращался толькоNULL.Формат атрибута
co_lnotabобъектов кода был изменён для поддержки отрицательного смещения номера строки. По умолчанию Python не генерирует байт-код с отрицательным смещением номера строки. Функции, использующиеframe.f_lineno,PyFrame_GetLineNumber()илиPyCode_Addr2Line(), не затрагиваются. Функции, напрямую декодирующиеco_lnotab, следует обновить для использования знакового 8-битного целого типа для смещения номера строки, но это требуется только для поддержки приложений, использующих отрицательное смещение. См.Objects/lnotab_notes.txtдля описания форматаco_lnotabи способов его декодирования, а также PEP 511 для обоснования.Функции модуля
compileallтеперь возвращают булевы значения вместо1или0для обозначения успеха или неудачи соответственно. Поскольку булевы значения являются подклассом целых чисел, это может быть проблемой только если вы использовали проверки идентичности с1или0. См. bpo-25768.Чтение атрибута
portуurllib.parse.urlsplit()иurlparse()теперь вызываетValueErrorдля значений вне диапазона, вместо возвратаNone. См. bpo-20059.Модуль
impтеперь вызываетDeprecationWarningвместоPendingDeprecationWarning.У следующих модулей в атрибут
__all__были добавлены недостающие API для соответствия документированным API:calendar,cgi,csv,ElementTree,enum,fileinput,ftplib,logging,mailbox,mimetypes,optparse,plistlib,smtpd,subprocess,tarfile,threadingиwave. Это означает, что они будут экспортировать новые символы при использованииimport *. (Вклад Джоэла Таддеи и Яцека Колодзея в bpo-23883.)При выполнении относительного импорта, если
__package__не равно__spec__.parent, то вызываетсяImportWarning. (Вклад Бретта Кэннона в bpo-25791.)Когда выполняется относительный импорт и родительский пакет неизвестен, будет вызвано
ImportError. Ранее могло вызыватьсяSystemError. (Вклад Бретта Кэннона в bpo-18018.)Серверы на основе модуля
socketserver, включая определённые вhttp.server,xmlrpc.serverиwsgiref.simple_server, теперь перехватывают только исключения, производные отException. Поэтому если обработчик запроса вызывает исключение типаSystemExitилиKeyboardInterrupt,handle_error()больше не вызывается, и исключение остановит однопоточный сервер. (Вклад Мартина Пантера в bpo-23430.)spwd.getspnam()теперь вызываетPermissionErrorвместоKeyError, если у пользователя нет прав.Метод
socket.socket.close()теперь вызывает исключение, если базовый системный вызов сообщил об ошибке (например,EBADF). (Вклад Мартина Пантера в bpo-26685.)Аргумент decode_data конструкторов
smtpd.SMTPChannelиsmtpd.SMTPServerтеперь по умолчанию равенFalse. Это означает, что аргумент, передаваемый вprocess_message(), теперь по умолчанию является объектом bytes, а вprocess_message()будут передаваться именованные аргументы. Код, который уже был обновлён в соответствии с предупреждением об устаревании, сгенерированным 3.5, не будет затронут.Все необязательные аргументы функций
dump(),dumps(),load()иloads()и конструкторов классовJSONEncoderиJSONDecoderв модулеjsonтеперь являются только именованными. (Вклад Сергея Сторчаки в bpo-18726.)Подклассы
type, которые не переопределяютtype.__new__, больше не могут использовать форму с одним аргументом для получения типа объекта.В рамках PEP 487 обработка именованных аргументов, передаваемых в
type(кроме подсказки метаклассаmetaclass), теперь последовательно делегируетсяobject.__init_subclass__(). Это означает, чтоtype.__new__иtype.__init__теперь принимают произвольные именованные аргументы, ноobject.__init_subclass__()(который вызывается изtype.__new__) будет отклонять их по умолчанию. Пользовательским метаклассам, принимающим дополнительные именованные аргументы, потребуется соответствующим образом скорректировать свои вызовыtype.__new__(непосредственно или черезsuper).В
distutils.command.sdist.sdistатрибутdefault_formatбыл удалён и больше не учитывается. Вместо него по умолчанию на всех платформах используется формат сжатого tar-файла, и никакого выбора в зависимости от платформы не производится. В средах, где сборки создаются в Windows и требуются дистрибутивы в формате ZIP, настройте проект с помощью файлаsetup.cfg, содержащего следующее:[sdist] formats=zip
Это поведение также было портировано в более ранние версии Python в составе Setuptools 26.0.0.
В модуле
urllib.requestи методеhttp.client.HTTPConnection.request(), если не указан заголовок Content-Length и тело запроса является файловым объектом, оно теперь отправляется с кодированием фрагментов HTTP 1.1. Если файловый объект должен быть отправлен на сервер HTTP 1.0, значение Content-Length теперь должно указываться вызывающей стороной. (Вклад Демиана Брехта и Рольфа Краля с доработками Мартина Пантера в bpo-12319.)DictReaderтеперь возвращает строки типаOrderedDict. (Вклад Стива Холдена в bpo-27842.)crypt.METHOD_CRYPTбольше не будет добавляться вcrypt.methods, если это не поддерживается платформой. (Вклад Виктора Стиннера в bpo-25287.)Аргументы verbose и rename для
namedtuple()теперь являются только именованными. (Вклад Рэймонда Хеттингера в bpo-25628.)На Linux
ctypes.util.find_library()теперь ищет общие библиотеки вLD_LIBRARY_PATH. (Вклад Виная Саджипа в bpo-9998.)Класс
imaplib.IMAP4теперь обрабатывает флаги, содержащие символ']', в сообщениях, отправляемых с сервера, для улучшения совместимости в реальных условиях. (Вклад Литы Чо в bpo-21815.)Функция
mmap.mmap.write()теперь возвращает количество записанных байтов, как и другие методы записи. (Вклад Якуба Стасяка в bpo-26335.)Функции
pkgutil.iter_modules()иpkgutil.walk_packages()теперь возвращаютModuleInfoименованные кортежи. (Вклад Рамчандры Апте в bpo-17211.)re.sub()теперь вызывает ошибку для недопустимых числовых ссылок на группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых ссылок на группы теперь включает индекс группы и позицию ссылки. (Вклад SilentGhost, Сергея Сторчаки в bpo-25953.)zipfile.ZipFileтеперь будет вызыватьNotImplementedErrorдля нераспознанных значений сжатия. Ранее вызывалось простоRuntimeError. Кроме того, вызов методовZipFileна закрытом ZipFile или вызов методаwrite()на ZipFile, созданном в режиме'r', будет вызыватьValueError. Ранее в этих сценариях вызывалосьRuntimeError.Когда пользовательские метаклассы используются вместе с
super()без аргументов или прямыми ссылками из методов на неявную переменную замыкания__class__, неявная запись пространства имён__classcell__теперь должна передаваться вtype.__new__для инициализации. Невыполнение этого требования приведёт кDeprecationWarningв Python 3.6 и кRuntimeErrorв Python 3.8.С введением
ModuleNotFoundErrorпотребители системы импорта могут начать ожидать, что замены системы импорта будут вызывать это более конкретное исключение, когда это уместно, а не менее конкретноеImportError. Чтобы обеспечить будущую совместимость с такими потребителями, разработчики альтернативных систем импорта, полностью заменяющих__import__(), должны обновить свои реализации для вызова нового подкласса, когда модуль вообще не найден. Разработчики совместимых плагинов для стандартной системы импорта не должны вносить никаких изменений, так как стандартная система импорта будет вызывать новый подкласс, когда это уместно.
Изменения в C API¶Changes in the C API
Семейство аллокаторов
PyMem_Malloc()теперь использует аллокатор pymalloc вместо системногоmalloc(). Приложения, вызывающиеPyMem_Malloc()без удержания GIL, могут аварийно завершаться. Установите переменную окруженияPYTHONMALLOCв значениеdebug, чтобы проверить использование аллокаторов памяти в вашем приложении. См. bpo-26249.Py_Exit()(и главный интерпретатор) теперь переопределяют код завершения на 120, если сброс буферизованных данных не удался. См. bpo-5319.
Изменения байткода CPython¶CPython bytecode changes
В Python 3.6 был внесён ряд серьёзных изменений в байткод.
Интерпретатор Python теперь использует 16-битный wordcode вместо байткода. (Автор: Demur Rumed при участии и рецензировании Serhiy Storchaka и Victor Stinner в bpo-26647 и bpo-28050.)
Новые опкоды
FORMAT_VALUEиBUILD_STRINGкак часть реализации форматированных строковых литералов. (Автор: Eric Smith в bpo-25483 и Serhiy Storchaka в bpo-27078.)Новый опкод
BUILD_CONST_KEY_MAPдля оптимизации создания словарей с постоянными ключами. (Автор: Serhiy Storchaka в 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удалены. (Автор: Demur Rumed в bpo-27095, и Serhiy Storchaka в bpo-27213, bpo-28257.)Добавлены новые опкоды
SETUP_ANNOTATIONSиSTORE_ANNOTATIONдля поддержки нового синтаксиса аннотаций переменных. (Автор: Ivan Levkivskyi в bpo-27985.)
Заметные изменения в Python 3.6.2¶Notable changes in Python 3.6.2
Новая make regen-all цель сборки¶New make regen-all build target
Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\nсобрать без необходимости уже иметь установленную версию Python,\nсистема сборки на основе autotools больше не пытается неявно\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.
Вместо этого была добавлена новая команда make regen-all для принудительной\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\nбыла собрана на основе предварительно сгенерированных версий).
Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.
(Предложено Victor Stinner в bpo-23404.)
Добавлено в версии 3.6.2.
Удаление make touch цели сборки¶Removal of make touch build target
Цель сборки make touch, ранее использовавшаяся для запроса неявной перегенерации\nсгенерированных файлов путем обновления времени их изменения, была удалена.
Она заменена новой целью make regen-all.
(Предложено Victor Stinner в bpo-23404.)
Изменено в версии 3.6.2.
Заметные изменения в Python 3.6.4¶Notable changes in Python 3.6.4
Синглтон PyExc_RecursionErrorInst, который был частью публичного API, удалён, поскольку его члены никогда не очищались и могли вызвать segfault при завершении работы интерпретатора.
(Автор: Xavier de Gaye в bpo-22898 и bpo-30697.)
Заметные изменения в Python 3.6.5¶Notable changes in Python 3.6.5
Функция locale.localeconv() теперь временно устанавливает локаль LC_CTYPE в локаль LC_NUMERIC в некоторых случаях.
(Автор: Victor Stinner в bpo-31900.)
Заметные изменения в Python 3.6.7¶Notable changes in Python 3.6.7
Модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. См. также gh-61441.
В 3.6.7 модуль tokenize теперь неявно генерирует токен NEWLINE, когда на вход подаётся строка без завершающего перевода строки. Это поведение теперь соответствует тому, что делает внутренний токенизатор C.
(Автор: Ammar Askar в bpo-33899.)
Заметные изменения в Python 3.6.10¶Notable changes in Python 3.6.10
Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Подробнее см. документацию loop.create_datagram_endpoint(). (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в bpo-37228.)
Заметные изменения в Python 3.6.13¶Notable changes in Python 3.6.13
Более ранние версии Python допускали использование как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации.
(Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)
Заметные изменения в Python 3.6.14¶Notable changes in 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)