Что нового в Python 3.6¶
- Редакторы:
Элвис Пранскявичус <elvis@magic.io>, Юрий Селиванов <yury@magic.io>
В этой статье описываются новые возможности Python 3.6 по сравнению с версией 3.5. Версия Python 3.6 была выпущена 23 декабря 2016 года. Полный список изменений приведен в changelog.
См.также
PEP 494 - Расписание выхода Python 3.6
Краткое описание - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 498, форматированные строковые литералы.
PEP 515, подчеркивание в числовых литералах.
PEP 526, синтаксис для аннотаций переменных.
PEP 525, асинхронные генераторы.
PEP 530: асинхронное понимание.
Новые библиотечные модули:
Улучшения в реализации CPython:
Тип dict был изменен таким образом, чтобы использовать more compact representation, основанный на a proposal by Raymond Hettinger и аналогичный PyPy dict implementation. Это привело к тому, что словари потребляли на 20-25% меньше памяти по сравнению с Python 3.5.
Настройка процесса создания класса была упрощена с помощью new protocol.
Порядок определения атрибутов класса равен now preserved.
Порядок элементов в
**kwargs
теперь corresponds to the order, в котором аргументы ключевого слова были переданы функции.Были добавлены DTrace и SystemTap probing support.
Новая переменная окружения PYTHONMALLOC теперь может использоваться для отладки ошибок распределения памяти интерпретатора и доступа к ней.
Значительные улучшения в стандартной библиотеке:
Модуль
asyncio
получил новые функции, значительные улучшения в удобстве использования и производительности, а также значительное количество исправлений ошибок. Начиная с версии Python 3.6, модульasyncio
больше не является временным, а его API считается стабильным.Был реализован новый file system path protocol для поддержки path-like objects. Все стандартные библиотечные функции, работающие с путями, были обновлены для работы с новым протоколом.
Модуль
datetime
получил поддержку Local Time Disambiguation.Модуль
typing
получил число improvements.Модуль
tracemalloc
был значительно переработан и теперь используется для улучшения выводаResourceWarning
, а также для лучшей диагностики ошибок выделения памяти. Дополнительную информацию смотрите в разделе PYTHONMALLOC section.
Улучшения в области безопасности:
Новый модуль
secrets
был добавлен для упрощения генерации криптографически стойких псевдослучайных чисел, подходящих для управления секретами, такими как аутентификация учетной записи, токены и тому подобное.В Linux
os.urandom()
теперь блокируется до тех пор, пока не будет инициализирован системный пул энтропии urandom для повышения безопасности. Объяснение приведено в PEP 524.Настройки по умолчанию и набор функций модуля
ssl
были улучшены.Модуль
hashlib
получил поддержку алгоритмов хэширования BLAKE2, SHA-3 и SHAKE, а также функцию получения ключаscrypt()
.
Улучшения в Windows:
PEP 528 и PEP 529, файловая система Windows и кодировка консоли изменены на UTF-8.
Программа запуска
py.exe
при интерактивном использовании больше не отдает предпочтение Python2 перед 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 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
в понятиях list, set, dict и генераторных выражениях:
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__
classmethod будет вызываться в базовом классе всякий раз, когда создается новый подкласс:
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__()
. Всякий раз, когда определяется новый класс, новый метод будет вызываться для всех дескрипторов, включенных в определение, предоставляя им ссылку на определяемый класс и имя, присвоенное дескриптору в пространстве имен класса. Другими словами, экземпляры дескрипторов теперь могут знать имя атрибута дескриптора в классе owner:
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 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 namespace (возвращаемый из type.__prepare__()) теперь является отображением, сохраняющим порядок вставки.
См.также
- PEP 520 – Сохранение порядка определения атрибутов класса
PEP, написанный и реализованный Эриком Сноу.
PEP 468: Сохранение порядка аргументов ключевых слов¶
**kwargs
в сигнатуре функции теперь гарантированно будет отображение, сохраняющее порядок вставки.
См.также
- PEP 468 – Сохранение порядка аргументов ключевых слов
PEP, написанный и реализованный Эриком Сноу.
Новая реализация dict¶
Тип dict теперь использует «компактное» представление, основанное на a proposal by Raymond Hettinger, которое было first implemented by PyPy. Использование памяти в новом dict()
на 20-25% меньше по сравнению с Python 3.5.
Аспект сохранения порядка в этой новой реализации рассматривается как деталь реализации, и на него не следует полагаться (это может измениться в будущем, но желательно, чтобы эта новая реализация dict использовалась в языке в течение нескольких выпусков, прежде чем изменять спецификацию языка, чтобы предписать семантику сохранения порядка для всех текущих и будущие реализации Python; это также помогает сохранить обратную совместимость со старыми версиями языка, где все еще действует случайный порядок итераций, например, Python 3.5).
(Автор: ИНАДА Наоки в статье bpo-27350. Идея originally suggested by Raymond Hettinger.)
PEP 523: Добавление API для оценки фреймов в CPython¶
Хотя Python предоставляет обширную поддержку для настройки того, как выполняется код, единственное место, где этого не сделано, - это вычисление фреймовых объектов. Если вы хотели каким-то образом перехватить вычисление фреймов в Python, на самом деле не было никакого способа без прямого манипулирования указателями на определенные функции.
PEP 523 это можно изменить, предоставив API, позволяющий подключать оценку фреймов на уровне C. Это позволит таким инструментам, как отладчики и Jets, перехватывать оценку фреймов до начала выполнения кода на Python. Это позволяет использовать альтернативные реализации оценки для кода на Python, оценки фреймов отслеживания и т.д.
Этот API не является частью ограниченного C API и помечен как закрытый, что указывает на то, что использование этого API будет ограничено и применимо только к очень избранным низкоуровневым вариантам использования. Семантика API будет изменяться в Python по мере необходимости.
См.также
- PEP 523 – Добавление API для оценки фреймов в CPython
БОДРЯЩИЙ настрой, написанный Бреттом Кэнноном и Дино Вьеландом.
Переменная среды PYTHON MALLOC¶
Новая переменная окружения 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 и Mac OS. В будущем могут быть добавлены дополнительные маркеры.
(Автор - Лукаш Ланга в bpo-21590, на основе исправлений Хесуса Сеа Авиона, Дэвида Малкольма и Нихила Бенеша.)
Другие языковые изменения¶
Вот некоторые небольшие изменения, внесенные в основной язык Python:
Оператор
global
илиnonlocal
теперь должен отображаться в текстовом виде перед первым использованием соответствующего имени в той же области видимости. Ранее это былоSyntaxWarning
.Теперь можно установить значение от special method до
None
, чтобы указать, что соответствующая операция недоступна. Например, если класс устанавливает для__iter__()
значениеNone
, класс не поддается итерации. (Авторы Эндрю Барнерт и Иван Левкивский в bpo-25958.)Длинные последовательности повторяющихся строк обратной трассировки теперь сокращаются как
"[Previous line repeated {count} more times]"
(пример смотрите в обратная связь). (Автор: Эмануэль Барри в bpo-26823).Import теперь генерирует новое исключение
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 для постоянного сворачивания.
Автор: Виктор Стиннер в статье bpo-26146.
асинхронный¶
Начиная с версии 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()
для создания будущих объектов. Это позволяет использовать альтернативные реализации цикла обработки событий, такие как 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.)
бинаскии¶
Функция b2a_base64()
теперь принимает необязательный аргумент ключевого слова newline, чтобы контролировать, добавляется ли символ новой строки к возвращаемому значению. (Добавлено Виктором Стиннером в bpo-25357.)
смат¶
Добавлена новая константа cmath.tau
(τ).(Добавлено Лизой Роуч в bpo-12345, подробности смотрите в PEP 628.)
Новые константы: cmath.inf
и cmath.nan
, чтобы соответствовать math.inf
и math.nan
, а также cmath.infj
и cmath.nanj
, чтобы соответствовать формату, используемому сложными репр. (Автор: Марк Дикинсон в 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.)
параллельные фьючерсы¶
Конструктор класса ThreadPoolExecutor
теперь принимает необязательный аргумент thread_name_prefix, позволяющий настраивать имена потоков, создаваемых пулом. (Добавлено Грегори П. Смитом в bpo-27664.)
контекстная библиотека¶
Класс contextlib.AbstractContextManager
был добавлен, чтобы предоставить абстрактный базовый класс для контекстных менеджеров. Он предоставляет разумную реализацию по умолчанию для __enter__()
, которая возвращает self
и оставляет __exit__()
абстрактным методом. Соответствующий класс был добавлен в модуль typing
как typing.ContextManager
. (Добавлено Бреттом Кэнноном в bpo-25609.)
дата и время¶
Классы datetime
и time
имеют новый атрибут fold
, используемый для устранения неоднозначности местного времени, когда это необходимо. Многие функции в datetime
были обновлены для поддержки устранения неоднозначности местного времени. Смотрите раздел Local Time Disambiguation для получения дополнительной информации. (Автор - Александр Белопольский в статье bpo-24773.)
Методы datetime.strftime()
и date.strftime()
теперь поддерживают директивы по дате ISO 8601 %G
, %u
и %V
. (Автор: Эшли Андерсон в статье bpo-12006.)
Функция datetime.isoformat()
теперь принимает необязательный аргумент timespec, который определяет количество включаемых дополнительных компонентов значения времени. ((Добавлено Алессандро Куччи и Александром Белопольским в bpo-19475.)
Параметр datetime.combine()
теперь принимает необязательный аргумент tzinfo. (Добавлено Александром Белопольским в bpo-27661.)
десятичный¶
Новый метод Decimal.as_integer_ratio()
, который возвращает пару (n, d)
целых чисел, представляющих данный экземпляр Decimal
в виде дроби, с наименьшим значением и положительным знаменателем:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(Материалы предоставлены Стефаном Крахом и Марком Дикинсоном в bpo-25928.)
дистрибутивы¶
Атрибут default_format
был удален из distutils.command.sdist.sdist
, а для атрибута formats
по умолчанию установлено значение ['gztar']
. Хотя это и не ожидается, любой код, основанный на наличии default_format
, возможно, потребуется адаптировать. Более подробную информацию смотрите в bpo-27819.
электронная почта¶
Новый email 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
добавлены два новых базовых класса перечисления: 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>]
исправитель ошибок¶
В Windows модуль faulthandler
теперь устанавливает обработчик исключений Windows: смотрите faulthandler.enable()
. (Добавлено Виктором Стиннером в bpo-23848.)
ввод файла¶
hook_encoded()
теперь поддерживается аргумент errors. (Добавлено Джозефом Хэкманом в bpo-25788.)
хэшлиб¶
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. Пакет кодов для Кеккака, подготовленный Гвидо Бертони, Джоан Деймен, Михаэлем Питерсом, Жилем Ван Ашем и Ронни Ван Киером.)
Функция получения ключа на основе пароля scrypt()
теперь доступна в OpenSSL 1.1.0 и более поздних версиях. (Автор: Кристиан Хеймс в статье bpo-27928).
http.клиент¶
HTTPConnection.request()
и endheaders()
теперь поддерживают разделенные тела запросов на кодирование. (Авторы Демиан Брехт и Рольф Краль в bpo-12319).
idlelib и ХОЛОСТОЙ ход¶
Пакет idlelib модернизируется и реорганизовывается, чтобы улучшить внешний вид и работу IDLE, а также упростить понимание, тестирование и улучшение кода. Частью улучшения внешнего вида IDLE, особенно в Linux и Mac, является использование виджетов ttk, в основном в диалоговых окнах. В результате IDLE больше не работает с tcl/tk 8.4. Теперь для него требуется tcl/tk 8.5 или 8.6. Мы рекомендуем использовать последнюю версию любого из них.
«Модернизация» включает в себя переименование и консолидацию модулей idlelib. Переименование файлов с неполными именами в верхнем регистре аналогично переименованию, например, Tkinter и tkFont в tkinter и tkinter tkinters.шрифт в версии 3.0. В результате импорт файлов idlelib, которые работали в версии 3.5, обычно не будет работать в версии 3.6. Потребуется, как минимум, изменить название модуля (см. idlelib/README.txt), а иногда и больше. ((Изменения названия были внесены Элом Свигартом и Терри Риди в bpo-24225. Большинство исправлений для idlelib с тех пор были и будут частью этого процесса.)
В качестве компенсации, в конечном итоге, некоторые классы idlelib станут проще в использовании, с улучшенными API и документацией, объясняющей их. Дополнительная полезная информация будет добавлена в idlelib, когда она будет доступна.
Новое в версии 3.6.2:
Несколько исправлений для автозавершения. (Добавлено Луи Лу в bpo-15786.)
Новое в версии 3.6.3:
Обозреватель модулей (в меню «Файл», ранее называвшемся «Обозреватель классов») теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Авторы: Гильерме Поло, Шерил Сабелла и Терри Ян Риди в bpo-1612262.)
Функции IDLE, ранее реализованные в виде расширений, были переопределены как обычные функции. Их настройки были перенесены со вкладки «Расширения» на другие вкладки диалогового окна. (Авторы Чарльз Вольгангер и Терри Ян Риди в bpo-27099).
Диалоговое окно настроек (Options, Configure IDLE) было частично переписано, чтобы улучшить внешний вид и функциональность. (Авторы - Шерил Сабелла и Терри Джен Риди в нескольких выпусках).
Новое в версии 3.6.4:
Образец шрифта теперь включает в себя набор нелатинских символов, чтобы пользователи могли лучше видеть эффект от выбора определенного шрифта. (Автор: Терри Джен Риди в bpo-13802.) Образец можно отредактировать, включив в него другие символы. (Автор - Сергей Сторчака в bpo-31860.)
Новое в версии 3.6.6:
Изменен параметр контекста кода редактора. В окне отображаются все контекстные строки, вплоть до максимального количества строк. Щелчок по контекстной строке приводит к переходу редактора к этой строке. Цвета контекста для пользовательских тем добавлены на вкладку «Основные моменты» диалогового окна настроек. (Авторы: Шерил Сабелла и Терри Джен Риди в статье bpo-33642, bpo-33768, и bpo-33679.)
В Windows новый вызов API сообщает Windows, что tk масштабируется с учетом DPI. В Windows 8.1+ или 10, при неизменных свойствах совместимости с DPI в двоичном коде Python и разрешении монитора более 96 точек на дюйм, это должно сделать текст и линии более четкими. В противном случае это не возымеет никакого эффекта. (Автор: Терри Джен Риди в bpo-33656.)
Новое в версии 3.6.7:
Вывод в N строках (по умолчанию 50) сокращается до размера кнопки. N можно изменить в разделе PyShell на странице «Общие» диалогового окна настроек. Меньшее количество строк, но, возможно, и более длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод можно развернуть на месте, дважды щелкнув по кнопке, или перенести в буфер обмена, или в отдельное окно, щелкнув по кнопке правой кнопкой мыши. (Добавлено Tal Einat в bpo-1529353.)
импортный файл¶
Импорт теперь вызывает новое исключение 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
. (Автор: Джелле Зейлстра в статье 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.)
математика¶
Константа tau (τ) была добавлена в модули math
и cmath
.(Добавлено Лизой Роуч в bpo-12345, подробности смотрите в PEP 628.)
многопроцессорная обработка¶
Proxy Objects, возвращаемый multiprocessing.Manager()
, теперь может быть вложенным. (Добавлено Дэвином Поттсом в bpo-6766.)
ос¶
Смотрите краткое описание PEP 519 для получения подробной информации о том, как модули os
и os.path
теперь поддерживают path-like objects.
scandir()
теперь поддерживает bytes
пути в Windows.
Новый метод close()
позволяет явно закрыть итератор scandir()
. Итератор scandir()
теперь поддерживает протокол context manager. Если итератор scandir()
не исчерпан и не закрыт явно, в его деструкторе будет запущен ResourceWarning
. (Добавлено Сергеем Сторчакой в bpo-25994.)
В Linux os.urandom()
теперь блокируется до тех пор, пока не будет инициализирован системный пул энтропии urandom для повышения безопасности. Объяснение приведено в PEP 524.
Системный вызов Linux getrandom()
(получение случайных байт) теперь доступен как новая функция os.getrandom()
. (Автор - Виктор Стиннер, участник PEP 524)
файл пути¶
pathlib
теперь поддерживается path-like objects. (Добавлено Бреттом Кэнноном в bpo-27186.)
Более подробную информацию смотрите в сводке по PEP 519.
pdb (почтовый индекс)¶
Конструктор класса Pdb
имеет новый необязательный аргумент readrc, который определяет, следует ли считывать файлы .pdbrc
.
соленый огурец¶
Объекты, для которых требуется __new__
, вызываемые с помощью аргументов ключевого слова, теперь можно выбрать, используя pickle protocols более старую версию протокола, чем версия 4. Версия протокола 4 уже поддерживает этот случай. (Добавлено Сергеем Сторчакой в bpo-24164.)
соленые огурцы¶
pickletools.dis()
теперь выводит неявный индекс memo для кода операции MEMOIZE
. (Добавлено Сергеем Сторчакой в bpo-25382.)
pydoc¶
Модуль pydoc
научился учитывать переменную среды MANPAGER
. (Автор - Маттиас Клозе в статье bpo-8637).
help()
и pydoc
теперь можно отображать именованные поля кортежей в том порядке, в котором они были определены, а не в алфавитном порядке. (Добавлено Раймондом Хеттингером в bpo-24879.)
случайный¶
Новая функция choices()
возвращает список элементов заданного размера из заданной совокупности с необязательными весами. (Добавлено Раймондом Хеттингером в bpo-18844.)
ре¶
Добавлена поддержка диапазонов модификаторов в регулярных выражениях. Примеры: '(?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.)
строка чтения¶
Добавлено set_auto_history()
, чтобы включить или отключить автоматическое добавление вводимых данных в список истории. (Добавлено Тайлером Кромптоном в bpo-26870.)
rlкомплектер¶
Имена частных и специальных атрибутов теперь опускаются, если только префикс не начинается с подчеркивания. После некоторых завершенных ключевых слов добавляется пробел или двоеточие. (Автор Сергей Сторчака в bpo-25011 и bpo-25209).
шлекс¶
В 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.)
Модуль socket теперь поддерживает семейство адресов AF_ALG
для взаимодействия с crypto 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
теперь поддерживается IEEE 754 с плавающей точкой половинной точности с помощью спецификатора формата 'e'
. (Авторы: Эли Стивенс, Марк Дикинсон в bpo-11734).
подпроцесс¶
subprocess.Popen
деструктор теперь выдает предупреждение ResourceWarning
, если дочерний процесс все еще запущен. Используйте протокол контекстного менеджера (with proc: ...
) или явно вызовите метод wait()
, чтобы прочитать статус завершения дочернего процесса. (Автор Виктор Стиннер в bpo-26741).
Конструктор subprocess.Popen
и все функции, которые передают ему аргументы, теперь принимают аргументы encoding и errors. Указание любого из них включит текстовый режим для потоков stdin, stdout и stderr. (Автор: Стив Дауэр в статье bpo-6135.)
sys¶
Новая функция getfilesystemencodeerrors()
возвращает название режима ошибки, используемого для преобразования имен файлов в кодировке Unicode в байты. (Добавлено Стивом Дауэром в bpo-27781.)
В Windows возвращаемое значение функции getwindowsversion()
теперь включает поле platform_version, которое содержит точную основную версию, второстепенную версию и номер сборки текущей операционной системы, а не версию, которая эмулируется для процесса (добавлено Стивом Дауэром в bpo-27932.)
telnetlib - телнетлиб¶
Telnet
теперь является контекстным менеджером (вклад Стефана Виртеля в bpo-25485).
время¶
Атрибуты struct_time
tm_gmtoff
и tm_zone
теперь доступны на всех платформах.
время это¶
Был добавлен новый удобный метод Timer.autorange()
для повторного вызова Timer.timeit()
, так что общее время выполнения больше или равно 200 миллисекундам. (Автор: Стивен Д’Апрано в статье bpo-6422.)
timeit
теперь предупреждает о существенной (в 4 раза) разнице между лучшим и худшим временем. (Автор Сергей Сторчака в bpo-23552).
ткинтер¶
Добавлены методы trace_add()
, trace_remove()
и trace_info()
в классе tkinter.Variable
. Они заменяют старые методы trace_variable()
, trace()
, trace_vdelete()
и trace_vinfo()
, которые используют устаревшие команды Tcl и могут не работать в будущих версиях Tcl. (Автор - Сергей Сторчака в bpo-22115).
обратная связь¶
Как модуль обратной трассировки, так и встроенный в интерпретатор индикатор исключений теперь сокращают длинные последовательности повторяющихся строк в обратных трассировках, как показано в следующем примере:
>>> 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
теперь поддерживает отслеживание распределения памяти в нескольких разных адресных пространствах.
Добавлен новый класс фильтра 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
теперь использует данные из Unicode 9.0.0. (Автор - Бенджамин Питерсон.)
единичный тест.имитация¶
Класс Mock
имеет следующие улучшения:
Два новых метода,
Mock.assert_called()
иMock.assert_called_once()
, позволяют проверить, был ли вызван фиктивный объект. (Добавлено Амитом Сахой в bpo-26323.)Метод
Mock.reset_mock()
теперь имеет два необязательных аргумента только для ключевых слов: return_value и side_effect. (Добавлено Кушалом Дасом в bpo-21271.)
urllib.запрос¶
Если HTTP-запрос содержит файл или повторяемое тело (отличное от объекта bytes), но не содержит заголовка Content-Length
, вместо того, чтобы выдавать ошибку, AbstractHTTPHandler
теперь можно использовать кодировку фрагментированной передачи. (Материалы предоставлены Демианом Брехтом и Рольфом Кралем в bpo-12319.)
urllib.робот-анализатор¶
RobotFileParser
теперь поддерживает расширения Crawl-delay
и Request-rate
. (Добавлено Николаем Богойчевым в bpo-16099.)
венв¶
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()
Обратная трассировка «Объект, выделенный при» является новой и отображается только в том случае, если tracemalloc
отслеживает выделение памяти Python и если модуль warnings
уже был импортирован.
winreg (выигрывать)¶
Добавлен 64-разрядный целочисленный тип REG_QWORD
. (Добавлено Клементом Руо в bpo-23026.)
выигрышный звук¶
Разрешенные аргументы ключевых слов для передачи в Beep
, MessageBeep
, и PlaySound
(bpo-27982).
xmlrpc.клиент¶
Модуль xmlrpc.client
теперь поддерживает отмену привязки дополнительных типов данных, используемых реализацией Apache XML-RPC для числовых данных и None
. (Добавлено Сергеем Сторчакой в bpo-26885.)
почтовый файл¶
Новый метод класса ZipInfo.from_file()
позволяет создавать экземпляр ZipInfo
из файла файловой системы. Новый метод ZipInfo.is_dir()
можно использовать для проверки того, представляет ли экземпляр ZipInfo
каталог. (Автор Томас Клюйвер в статье bpo-26039.)
Метод ZipFile.open()
теперь можно использовать для записи данных в ZIP-файл, а также для извлечения данных. (Добавлено Томасом Клюйвером в bpo-26039.)
злиб¶
Функции compress()
и decompress()
теперь принимают аргументы по ключевым словам. (Добавлено Авивом Паливодой в bpo-26243 и Сян Чжаном в bpo-16764 соответственно.)
Оптимизация¶
Интерпретатор Python теперь использует 16-битный текстовый код вместо байт-кода, что сделало возможным ряд оптимизаций кода операции. (Подготовлено Demur Rumed при участии Сергея Сторчаки и Виктора Стиннера и их отзывов в bpo-26647 и bpo-28050.)
Класс
asyncio.Future
теперь имеет оптимизированную реализацию на языке Си. (Авторы - Юрий Селиванов и ИНАДА Наоки в bpo-26081.)Класс
asyncio.Task
теперь имеет оптимизированную реализацию на языке Си. (Добавлено Юрием Селивановым в bpo-28544.)Различные улучшения реализации в модуле
typing
(например, кэширование универсальных типов) позволяют повысить производительность до 30 раз и сократить объем занимаемой памяти.Декодер ASCII теперь в 60 раз быстрее выполняет обработку ошибок
surrogateescape
,ignore
иreplace
(Добавлено Виктором Стиннером в bpo-24870).Кодеры ASCII и Latin1 теперь работают в 3 раза быстрее для обработки ошибок
surrogateescape
(добавлено Виктором Стиннером в bpo-25227).Кодировщик UTF-8 теперь в 75 раз быстрее выполняет обработку ошибок
ignore
,replace
,surrogateescape
,surrogatepass
( Добавлено Виктором Стиннером в bpo-25267).Декодер UTF-8 теперь в 15 раз быстрее выполняет обработку ошибок
ignore
,replace
иsurrogateescape
(Добавлено Виктором Стиннером в bpo-25301).bytes % args
теперь в 2 раза быстрее. (Автор Виктор Стиннер в bpo-25349).bytearray % args
теперь работает в 2,5-5 раз быстрее. (Автор Виктор Стиннер в bpo-25399).Оптимизируйте
bytes.fromhex()
иbytearray.fromhex()
: теперь они работают в 2-3,5 раза быстрее. (Автор Виктор Стиннер в bpo-25401).Оптимизируйте
bytes.replace(b'', b'.')
иbytearray.replace(b'', b'.')
: до 80% быстрее. (Автор Джош Снайдер в bpo-26574).Функции распределения домена
PyMem_Malloc()
(PYMEM_DOMAIN_MEM
) теперь используют функцию pymalloc memory allocator вместо функцииmalloc()
из библиотеки C. Распределитель pymalloc оптимизирован для объектов размером не более 512 байт с коротким временем жизни и используетmalloc()
для блоков памяти большего размера. (Добавлено Виктором Стиннером в bpo-26249).pickle.load()
иpickle.loads()
теперь работают на 10% быстрее при десериализации множества небольших объектов (вклад Виктора Стиннера в bpo-27056).Передача keyword arguments функции сопряжена с большими накладными расходами по сравнению с передачей positional arguments. Теперь в функциях расширения, реализованных с использованием Argument Clinic, эти накладные расходы значительно уменьшены. (Добавлено Сергеем Сторчакой в bpo-27574).
Оптимизированы функции
glob()
иiglob()
в модулеglob
; теперь они работают примерно в 3-6 раз быстрее. (Автор Сергей Сторчака в bpo-25596).Оптимизирован поиск по глобусу в
pathlib
с помощьюos.scandir()
; теперь он выполняется примерно в 1,5-4 раза быстрее. (Добавлено Сергеем Сторчакой в bpo-26032).xml.etree.ElementTree
значительно улучшена производительность синтаксического анализа, итераций и глубокого копирования. (Вклад Сергея Сторчаки в bpo-25638, bpo-25873, и bpo-25869.)Создание экземпляров
fractions.Fraction
из чисел с плавающей запятой и десятичных дробей теперь выполняется в 2-3 раза быстрее. (Добавлено Сергеем Сторчакой в bpo-25971.)
Изменения в сборке и C API¶
Для создания 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
configure. Его включение приведет к активации дорогостоящих оптимизаций, таких как PGO. (Оригинальный патч от Александра Патраску (Alexandru Patrascu) из Intel в bpo-26359.)Символ GIL теперь должен удерживаться при выполнении функций распределителя
PYMEM_DOMAIN_OBJ
(например:PyObject_Malloc()
) иPYMEM_DOMAIN_MEM
(например:PyMem_Malloc()
) вызываются домены.Новое: c:func: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: Измените обработку остановки внутри генераторов.
Ожидается, что метод __aiter__()
теперь будет возвращать асинхронный итератор напрямую, а не доступный, как ранее. Выполнение первого из них вызовет DeprecationWarning
. Обратная совместимость будет удалена в Python 3.7. (Добавлено Юрием Селивановым в bpo-27243.)
Пара символов обратной косой черты, которая не является допустимой escape-последовательностью, теперь генерирует DeprecationWarning
. Хотя в конечном итоге это будет SyntaxError
, этого не будет в нескольких версиях Python. (Автор: Эмануэль Барри в bpo-27364.)
При выполнении относительного импорта возврат к __name__
и __path__
из вызывающего модуля, когда __spec__
или __package__
не определены, теперь вызывает ImportWarning
. (Автор: Роуз Эймс в bpo-25791.)
Устаревшие модули, функции и методы Python¶
асинхронный режим¶
Вариант asynchat
был заменен на asyncio
. (Добавлено Мариеттой в bpo-25002.)
асинхронный процессор¶
Вариант asyncore
был заменен на asyncio
. (Добавлено Мариеттой в bpo-25002.)
дбм¶
В отличие от других реализаций dbm
, модуль dbm.dumb
создает базы данных в режиме 'rw'
и позволяет изменять базу данных, открытую в режиме 'r'
. Это поведение теперь считается устаревшим и будет удалено в версии 3.8. (Добавлено Сергеем Сторчакой в bpo-21708.)
дистрибутивы¶
Недокументированный аргумент extra_path
для конструктора Distribution
теперь считается устаревшим и при его установке будет выдаваться предупреждение. Поддержка этого параметра будет удалена в будущих версиях Python. Подробности см. в разделе bpo-27919.
стеклопластик¶
Поддержка нецелочисленных аргументов в getgrgid()
была признана устаревшей. (Добавлено Сергеем Сторчакой в bpo-26129.)
импортный файл¶
Методы 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), но это может измениться в будущих версиях.
ос¶
Недокументированная поддержка общих bytes-like objects в качестве путей в функциях os
, compile()
и аналогичных функциях теперь является устаревшей. (Автор - Сергей Сторчака в bpo-25791 и bpo-26754.)
ре¶
Поддержка встроенных флагов (?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.tix
теперь устарел. Вместо tkinter
пользователям следует использовать tkinter.ttk
.
венв¶
Скрипт pyvenv
был заменен на python3 -m venv
. Это предотвращает путаницу в отношении того, к какому интерпретатору Python подключен pyvenv
и, следовательно, какой интерпретатор Python будет использоваться виртуальной средой. (Автор Бретт Кэннон в bpo-25154.)
xml-код¶
В качестве защиты от DTD и поиска внешних объектов модули
xml.dom.minidom
иxml.sax
больше не обрабатывают внешние объекты по умолчанию. (Автор Кристиан Хеймс в статье gh-61441).
Устаревшие функции и типы C API¶
Недокументированные функции PyUnicode_AsEncodedObject()
, PyUnicode_AsDecodedObject()
, PyUnicode_AsEncodedUnicode()
и PyUnicode_AsDecodedUnicode()
теперь считаются устаревшими. Вместо них используйте generic codec based API.
Устаревшие параметры сборки¶
Флаг --with-system-ffi
configure теперь включен по умолчанию на UNIX-платформах, отличных от macOS. Это может быть отключено с помощью --without-system-ffi
, но использование этого флага устарело и не будет принято в Python 3.7. Это изменение не повлияет на macOS. Обратите внимание, что многие дистрибутивы ОС уже используют флаг --with-system-ffi
при сборке своей системы на Python.
Удаленный¶
Удаление API и функций¶
Неизвестные значения, состоящие из
'\'
и буквы ASCII в регулярных выражениях, теперь будут вызывать ошибку. В шаблонах заменыre.sub()
они по-прежнему разрешены, но не рекомендуются. Флагre.LOCALE
теперь можно использовать только с бинарными шаблонами.inspect.getmoduleinfo()
был удален (устарел, поскольку для получения имени модуля для заданного пути следует использовать Python 3.3).inspect.getmodulename()
. (Добавлено Юрием Селивановым в bpo-13248.)traceback.Ignore
класс иtraceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
,traceback.find_strings
,traceback.find_executable_lines
методы были удалены из модуляtraceback
. Это были недокументированные методы, устаревшие начиная с версии Python 3.2, и эквивалентная функциональность доступна из частных методов.Фиктивные методы
tk_menuBar()
иtk_bindForTraversal()
в классах виджетовtkinter
были удалены (соответствующие команды Tk устарели начиная с версии Tk 4.0).Метод
open()
классаzipfile.ZipFile
больше не поддерживает режим'U'
(устарел начиная с версии Python 3.4). Используйтеio.TextIOWrapper
для чтения сжатых текстовых файлов в режиме universal newlines.Недокументированные модули
IN
,CDROM
,DLFCN
,TYPES
,CDIO
, иSTROPTS
были удалены. Они были доступны в каталогах, относящихся к конкретной платформеLib/plat-*/
, но постоянно устаревали, были непоследовательно доступны на разных платформах и не поддерживались. Сценарий, который создал эти модули, по-прежнему доступен в исходном коде по адресу Tools/scripts/h2py.py.Устаревший класс
asynchat.fifo
был удален.
Перенос на Python 3.6¶
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении команды «python»¶
Вывод специальной сборки Python с определенными макросами
COUNT_ALLOCS
,SHOW_ALLOC_COUNT
илиSHOW_TRACK_COUNT
теперь по умолчанию отключен. Его можно снова включить, используя опцию-X showalloccount
. Теперь он выводит значениеstderr
вместоstdout
. (Добавлено Сергеем Сторчакой в bpo-23034.)
Изменения в Python API¶
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
объектов code изменен, чтобы поддерживать значение с отрицательной разницей в числе строк. По умолчанию 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__`Последовательные модули имели пропавшие без вести APIs, добавленные к ним <<<0 > > > attributes, чтобы соответствовать документированному APIs: :mod:`calendar
,cgi
,csv
,ElementTree
,enum
,fileinput
,ftplib
,logging
,mailbox
,mimetypes
,optparse
,plistlib
,smtpd
,subprocess
,tarfile
,threading
иwave
. Thisimport *
means they will export new symbols when << < 18 > > > is used. (Contributed by Joel Taddei and Jacek Kołodziej in 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()
будет передаваться в качестве ключевого слова arguments. Код, который уже был обновлен в соответствии с предупреждением об устаревании, сгенерированным в версии 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
был удален и больше не используется. Вместо этого на всех платформах по умолчанию используется формат 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, вызывающий сервер теперь должен указывать значение длины содержимого. (Авторы Демиан Брехт и Рольф Краль с изменениями Мартина Пантера в bpo-12319.)DictReader
Теперь возвращает строки типаOrderedDict
. (Добавлено Стивом Холденом в bpo-27842.)Параметр
crypt.METHOD_CRYPT
больше не будет добавляться вcrypt.methods
, если он не поддерживается платформой. (Добавлено Виктором Стиннером в bpo-25287.)Аргументы verbose и rename для
namedtuple()
теперь используются только для ключевых слов. (Добавлено Раймондом Хеттингером в bpo-25628.)В Linux
ctypes.util.find_library()
теперь ищет разделяемые библиотеки вLD_LIBRARY_PATH
. (Добавлено Винаем Саджипом в bpo-9998.)Класс
imaplib.IMAP4
теперь обрабатывает флаги, содержащие символ']'
в сообщениях, отправляемых с сервера, для улучшения совместимости с реальным миром. (Добавлено Литой Чо в bpo-21815.)Функция
mmap.write()
теперь возвращает количество записанных байт, как и другие методы записи. (Добавлено Якубом Стасиаком в bpo-26335.)Функции
pkgutil.iter_modules()
иpkgutil.walk_packages()
теперь возвращаютModuleInfo
именованных кортежа. (Добавлено Рамчандрой Апте в bpo-17211.)re.sub()
теперь выдает ошибку для недопустимых ссылок на числовые группы в шаблонах замены, даже если шаблон не найден в строке. Сообщение об ошибке для недопустимых ссылок на группы теперь содержит индекс группы и положение ссылки. (Автор: SilentGhost, Сергей Сторчака в bpo-25953.)zipfile.ZipFile
теперь будет отображатьсяNotImplementedError
для нераспознанных значений сжатия. Ранее отображалось простое значениеRuntimeError
. Кроме того, вызов методовZipFile
для закрытого ZIP-файла или вызов методаwrite()
для Zip-файла, созданного в режиме'r'
, вызоветValueError
. Ранее в этих сценариях поднималось значениеRuntimeError
.когда пользовательские метаклассы объединяются с нулевым аргументом
super()
или прямыми ссылками из методов на неявную переменную замыкания__class__
, неявная запись пространства имен__classcell__
теперь должна быть передана вtype.__new__
для инициализации. Невыполнение этого требования приведет к появлениюDeprecationWarning
в Python 3.6 иRuntimeError
в Python 3.8.С введением
ModuleNotFoundError
пользователи импортной системы могут начать ожидать, что замена импортной системы вызовет это более конкретное исключение, когда это необходимо, а не менее конкретноеImportError
. Чтобы обеспечить будущую совместимость с такими потребителями, разработчикам альтернативных систем импорта, которые полностью заменяют__import__()
, необходимо будет обновить свои реализации, чтобы создать новый подкласс, когда модуль вообще не может быть найден. Разработчикам плагинов, совместимых с системой импорта по умолчанию, не нужно вносить никаких изменений, поскольку система импорта по умолчанию создаст новый подкласс, когда это будет необходимо.
Изменения в C API¶
Семейство распределителей
PyMem_Malloc()
теперь использует pymalloc allocator, а не systemmalloc()
. Приложения, вызывающиеPyMem_Malloc()
без удержания GIL, теперь могут завершать работу с ошибкой. Установите для переменной окруженияPYTHONMALLOC
значениеdebug
, чтобы проверить использование распределителей памяти в вашем приложении. Смотрите bpo-26249.Py_Exit()
(и основной интерпретатор) теперь заменяют статус завершения на 120, если не удалось очистить буферизованные данные. Смотрите bpo-5319.
Изменения в байт-коде CPython¶
В Python 3.6 было внесено несколько серьезных изменений в bytecode.
Интерпретатор Python теперь использует 16-битный текстовый код вместо байт-кода. (Добавлено автором Demur Rumed с использованием материалов и отзывов Сергея Сторчаки и Виктора Стиннера в bpo-26647 и bpo-28050.)
Новые коды операций
FORMAT_VALUE
иBUILD_STRING
как часть реализации formatted string literal. (Авторы: Эрик Смит в bpo-25483 и Сергей Сторчака в bpo-27078.)Новый
BUILD_CONST_KEY_MAP
код операции для оптимизации создания словарей с постоянными ключами. (Добавлено Сергеем Сторчакой в bpo-27140.)Коды операций вызова функций были сильно переработаны для повышения производительности и упрощения реализации. Коды операций
MAKE_FUNCTION
,CALL_FUNCTION
,CALL_FUNCTION_KW
иBUILD_MAP_UNPACK_WITH_CALL
были изменены, добавлены новыеCALL_FUNCTION_EX
иBUILD_TUPLE_UNPACK_WITH_CALL
, а коды операцийCALL_FUNCTION_VAR
,CALL_FUNCTION_VAR_KW
иMAKE_CLOSURE
были удалены. (Материалы предоставлены Демуром Румедом в bpo-27095 и Сергеем Сторчакой в bpo-27213, bpo-28257.)Добавлены новые коды операций
SETUP_ANNOTATIONS
иSTORE_ANNOTATION
для поддержки нового синтаксиса variable annotation. (Автор Иван Левкивский в bpo-27985.)
Заметные изменения в Python 3.6.2¶
Новая цель построения make regen-all
¶
Чтобы упростить перекрестную компиляцию и обеспечить надежную компиляцию CPython без необходимости наличия существующей версии Python, система сборки на основе autotools больше не пытается неявно перекомпилировать сгенерированные файлы в зависимости от времени изменения файла.
Вместо этого была добавлена новая команда make regen-all
для принудительной регенерации этих файлов по желанию (например, после того, как начальная версия Python уже была собрана на основе предварительно сгенерированных версий).
Также определены более избирательные цели регенерации - подробнее смотрите в разделе Makefile.pre.in.
(Автор: Виктор Стиннер в bpo-23404.)
Добавлено в версии 3.6.2.
Удаление make touch
целевого объекта сборки¶
Цель сборки make touch
, ранее использовавшаяся для запроса неявной регенерации сгенерированных файлов путем обновления времени их модификации, была удалена.
Он был заменен новой целью make regen-all
.
(Автор: Виктор Стиннер в bpo-23404.)
Изменено в версии 3.6.2.
Заметные изменения в Python 3.6.4¶
Синглтон PyExc_RecursionErrorInst
, который был частью общедоступного API, был удален, поскольку его элементы никогда не очищались, что может привести к сбою сегмента во время завершения работы интерпретатора. (Автор Ксавье де Гайе в bpo-22898 и bpo-30697.)
Заметные изменения в Python 3.6.5¶
Функция locale.localeconv()
теперь в некоторых случаях временно устанавливает языковой стандарт LC_CTYPE
на языковой стандарт LC_NUMERIC
. (Добавлено Виктором Стиннером в bpo-31900.)
Заметные изменения в Python 3.6.7¶
Модули 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)