Что нового в Python 3.7¶
- Редактор
Элвис Пранскевичус <elvis@magic.io>
В этой статье рассказывается о новых возможностях в Python 3.7 по сравнению с 3.6. Python 3.7 был выпущен 27 июня 2018 года. Для получения полной информации смотрите changelog.
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 563, отложенная оценка аннотаций типов.
Изменения синтаксиса, несовместимые с обратным ходом:
Новые библиотечные модули:
Новые встроенные функции:
PEP 553, новая функция
breakpoint()
.
Улучшение модели данных Python:
PEP 562, настройка доступа к атрибутам модуля.
PEP 560, поддержка ядра для типизации модульных и общих типов.
характер сохранения порядка вставки объектов dict has been declared, чтобы стать официальной частью спецификации языка Python.
Значительные улучшения в стандартной библиотеке:
Модуль
asyncio
получил новые возможности, значительные usability and performance improvements.Модуль
time
получил поддержку functions with nanosecond resolution.
Улучшения в реализации CPython:
Отказ от использования ASCII в качестве кодировки текста по умолчанию:
PEP 552, детерминированный .pycs
PEP 565, улучшена работа с
DeprecationWarning
Улучшения в API языка C:
PEP 539, новый C API для локального хранения потоков
Улучшение документации:
В этом выпуске заметно улучшена производительность во многих областях. В разделе Оптимизации подробно перечислены эти улучшения.
Список изменений, которые могут повлиять на совместимость с предыдущими выпусками Python, приведен в разделе Перенос на Python 3.7.
Новые возможности¶
PEP 563: Отложенная оценка аннотаций¶
Появление подсказок типов в Python выявило две вопиющие проблемы с функциональностью аннотаций, добавленных в PEP 3107 и доработанных в PEP 526:
аннотации могли использовать только те имена, которые уже были доступны в текущей области видимости, другими словами, они не поддерживали прямые ссылки любого вида; и
аннотирование исходного кода оказало негативное влияние на время запуска программ на Python.
Обе эти проблемы решаются путем откладывания оценки аннотаций. Вместо компиляции кода, выполняющего выражения в аннотациях во время их определения, компилятор хранит аннотацию в строковой форме, эквивалентной AST данного выражения. При необходимости аннотации могут быть разрешены во время выполнения с помощью typing.get_type_hints()
. В общем случае, когда это не требуется, аннотации дешевле хранить (так как короткие строки интернируются интерпретатором) и ускоряют время запуска.
С точки зрения удобства использования, аннотации теперь поддерживают прямые ссылки, что позволяет использовать следующий синтаксис:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Поскольку это изменение нарушает совместимость, новое поведение должно быть включено в Python 3.7 на основе каждого модуля с помощью __future__
import:
from __future__ import annotations
В Python 3.10 он будет использоваться по умолчанию.
См.также
- PEP 563 – Отложенная оценка аннотаций
PEP написан и реализован Лукашем Ланга.
PEP 538: Legacy C Locale Coercion¶
Постоянной проблемой в серии Python 3 было определение разумной стратегии по умолчанию для обработки предположения о «7-битной ASCII» кодировке текста, которое в настоящее время подразумевается при использовании локали по умолчанию C или POSIX на платформах, отличных от Windows.
PEP 538 обновляет интерфейс командной строки интерпретатора по умолчанию для автоматического принудительного преобразования этой локали в доступную локаль на основе UTF-8, как описано в документации новой переменной окружения PYTHONCOERCECLOCALE
. Автоматическая установка LC_CTYPE
таким образом означает, что и основной интерпретатор, и расширения C с поддержкой локали (такие как readline
) будут предполагать использование UTF-8 в качестве кодировки текста по умолчанию, а не ASCII.
Определение поддержки платформы в PEP 11 также было обновлено, чтобы ограничить поддержку полной обработки текста соответствующим образом настроенными локалями, не основанными на ASCII.
В рамках этого изменения обработчиком ошибок по умолчанию для stdin
и stdout
теперь является surrogateescape
(а не strict
) при использовании любой из определенных целевых локалей принуждения (в настоящее время C.UTF-8
, C.utf8
и UTF-8
). Обработчик ошибок по умолчанию для stderr
продолжает быть backslashreplace
, независимо от локали.
По умолчанию принуждение локали молчит, но для помощи в отладке потенциально связанных с локалью проблем интеграции можно запросить явные предупреждения (выдаваемые непосредственно на stderr
), установив PYTHONCOERCECLOCALE=warn
. Эта настройка также заставит среду выполнения Python выдать предупреждение, если при инициализации интерпретатора ядра остается активной устаревшая локаль C.
Хотя принуждение к локали PEP 538 имеет то преимущество, что оно также влияет на модули расширения (такие как GNU readline
), а также на дочерние процессы (включая те, которые запускают не-Python приложения и старые версии Python), его недостатком является требование наличия подходящей целевой локали в работающей системе. Чтобы лучше справиться со случаем, когда подходящая целевая локаль недоступна (как, например, в RHEL/CentOS 7), Python 3.7 также реализует PEP 540: Принудительный режим выполнения UTF-8.
См.также
- PEP 538 – Принуждение устаревшей локали C к локали, основанной на UTF-8
PEP написан и реализован Ником Когланом.
PEP 540: Принудительный режим выполнения UTF-8¶
Новый параметр командной строки -X
utf8
и переменная окружения PYTHONUTF8
могут быть использованы для включения Python UTF-8 Mode.
В режиме UTF-8 CPython игнорирует настройки локали и по умолчанию использует кодировку UTF-8. Обработчики ошибок для потоков sys.stdin
и sys.stdout
установлены на surrogateescape
.
Принудительный режим UTF-8 может быть использован для изменения поведения обработки текста во встроенном интерпретаторе Python без изменения настроек локали встроенного приложения.
В то время как режим UTF-8 в PEP 540 имеет то преимущество, что он работает независимо от того, какие локали доступны в запущенной системе, его недостатком является отсутствие эффекта на модули расширения (такие как GNU readline
), дочерние процессы, запускающие не-Python приложения, и дочерние процессы, запускающие старые версии Python. Чтобы снизить риск повреждения текстовых данных при взаимодействии с такими компонентами, в Python 3.7 также реализована функция PEP 540: Принудительный режим выполнения UTF-8).
Режим UTF-8 включается по умолчанию, когда локаль имеет значение C
или POSIX
, и функция принуждения к локали PEP 538 не смогла изменить ее на альтернативу, основанную на UTF-8 (независимо от того, была ли установлена PYTHONCOERCECLOCALE=0
, установлена ли LC_ALL
или отсутствует подходящая целевая локаль).
См.также
- PEP 540 – Добавить новый режим UTF-8
PEP написан и реализован Виктором Стиннером
PEP 553: Встроенные breakpoint()
¶
Python 3.7 включает новую встроенную функцию breakpoint()
как простой и последовательный способ входа в отладчик Python.
Встроенный breakpoint()
вызывает sys.breakpointhook()
. По умолчанию последний импортирует pdb
и затем вызывает pdb.set_trace()
, но, привязав sys.breakpointhook()
к выбранной вами функции, breakpoint()
может войти в любой отладчик. Кроме того, переменная окружения PYTHONBREAKPOINT
может быть установлена на вызываемую функцию выбранного вами отладчика. Установите PYTHONBREAKPOINT=0
, чтобы полностью отключить встроенную breakpoint()
.
См.также
- PEP 553 – Встроенная точка останова()
PEP написан и реализован Барри Варшавом
PEP 539: Новый C API для локального хранения потоков¶
Хотя Python предоставляет C API для поддержки потоково-локального хранения; существующий Thread Local Storage (TLS) API использовал int для представления ключей TLS на всех платформах. Обычно это не было проблемой для официально поддерживаемых платформ, но это не является ни POSIX-совместимым, ни переносимым в любом практическом смысле.
PEP 539 изменяет это, предоставляя новый Thread Specific Storage (TSS) API в CPython, который заменяет использование существующего TLS API в интерпретаторе CPython, одновременно обесценивая существующий API. API TSS использует новый тип Py_tss_t
вместо int для представления ключей TSS - непрозрачный тип, определение которого может зависеть от базовой реализации TLS. Таким образом, это позволит создавать CPython на платформах, где родной ключ TLS определен таким образом, что не может быть безопасно приведен к int.
Обратите внимание, что на платформах, где собственный ключ TLS определен таким образом, что не может быть безопасно приведен к int, все функции существующего API TLS будут бесполезны и немедленно вернут отказ. Это ясно указывает на то, что старый API не поддерживается на платформах, где он не может быть надежно использован, и что не будет предпринято никаких усилий для добавления такой поддержки.
См.также
- PEP 539 – Новый C-API для локального хранения данных в CPython
PEP написан Эриком М. Брэем; реализация Масаюки Ямамото.
PEP 562: Настройка доступа к атрибутам модуля¶
Python 3.7 позволяет определять __getattr__()
на модулях и будет вызывать его всякий раз, когда атрибут модуля не найден. Определение __dir__()
на модулях теперь также разрешено.
Типичным примером того, где это может быть полезно, является обесценивание атрибутов модуля и ленивая загрузка.
См.также
- PEP 562 – Модуль
__getattr__
и__dir__
PEP написан и реализован Иваном Левкивским
PEP 564: Новые функции времени с наносекундным разрешением¶
Разрешение часов в современных системах может превышать ограниченную точность числа с плавающей запятой, возвращаемого функцией time.time()
и ее вариантами. Чтобы избежать потери точности, PEP 564 добавляет шесть новых «наносекундных» вариантов существующих функций таймера в модуль time
:
Новые функции возвращают количество наносекунд в виде целочисленного значения.
Measurements показывают, что на Linux и Windows разрешение time.time_ns()
примерно в 3 раза лучше, чем у time.time()
.
См.также
- PEP 564 – Добавить новые функции времени с наносекундным разрешением
PEP написан и реализован Виктором Стиннером
PEP 565: Показывать предупреждение об устаревании в __main__
¶
Стандартная обработка DeprecationWarning
была изменена таким образом, что эти предупреждения снова показываются по умолчанию, но только в том случае, если код, вызывающий их, выполняется непосредственно в модуле __main__
. В результате разработчики однофайловых скриптов и те, кто использует Python в интерактивном режиме, должны снова начать видеть предупреждения об устаревании для используемых ими API, но предупреждения об устаревании, вызванные импортированными модулями приложений, библиотек и фреймворков, будут по-прежнему скрыты по умолчанию.
В результате этого изменения стандартная библиотека теперь позволяет разработчикам выбирать между тремя различными вариантами поведения предупреждения об обесценивании:
FutureWarning
: всегда отображается по умолчанию, рекомендуется для предупреждений, предназначенных для конечных пользователей приложения (например, для устаревших параметров конфигурации приложения).DeprecationWarning
: отображается по умолчанию только в__main__
и при запуске тестов, рекомендуется для предупреждений, предназначенных для просмотра другими разработчиками Python, когда обновление версии может привести к изменению поведения или ошибке.PendingDeprecationWarning
: отображается по умолчанию только при запуске тестов, предназначен для случаев, когда при обновлении будущей версии категория предупреждения будет изменена наDeprecationWarning
илиFutureWarning
.
Ранее DeprecationWarning
и PendingDeprecationWarning
были видны только при выполнении тестов, что означало, что разработчики, в основном пишущие однофайловые скрипты или использующие Python в интерактивном режиме, могли быть удивлены разрушающими изменениями в API, которые они использовали.
См.также
- PEP 565 – Показать предупреждение об износе в
__main__
PEP написан и реализован Ником Когланом
PEP 560: Поддержка ядра для модуля typing
и общих типов¶
Изначально PEP 484 был разработан таким образом, чтобы не вносить любые изменения в основной интерпретатор CPython. Теперь подсказки типов и модуль typing
широко используются сообществом, поэтому это ограничение снято. PEP вводит два специальных метода __class_getitem__()
и __mro_entries__
, эти методы теперь используются большинством классов и специальных конструкций в typing
. В результате скорость выполнения различных операций с типами увеличилась до 7 раз, родовые типы могут использоваться без конфликтов с метаклассами, а также исправлено несколько давних ошибок в модуле typing
.
См.также
- PEP 560 – Поддержка ядра для типизации модульных и общих типов
PEP написан и реализован Иваном Левкивским
PEP 552: Файлы .pyc на основе хэша¶
Python традиционно проверяет актуальность файлов кэша байткода (т.е. файлов .pyc
), сравнивая исходные метаданные (временную метку последнего изменения и размер) с исходными метаданными, сохраненными в заголовке файла кэша при его генерации. Несмотря на свою эффективность, этот метод аннулирования имеет свои недостатки. Если временные метки файловой системы слишком грубые, Python может пропустить обновления источника, что приведет к путанице пользователей. Кроме того, наличие временной метки в файле кэша проблематично для build reproducibility и систем сборки на основе содержимого.
PEP 552 расширяет формат pyc, позволяя использовать хэш исходного файла для проверки недействительности вместо временной метки источника. Такие .pyc
файлы называются «основанными на хэше». По умолчанию Python по-прежнему использует проверку недействительности на основе временной метки и не генерирует файлы .pyc
на основе хэша во время выполнения. Файлы .pyc
на основе хэша могут быть сгенерированы с помощью py_compile
или compileall
.
Файлы на основе хэша .pyc
бывают двух вариантов: проверенные и непроверенные. Python проверяет проверенные хэш-файлы .pyc
на соответствие соответствующим исходным файлам во время выполнения, но не делает этого для непроверенных хэш-файлов. Непроверенные хэш-файлы .pyc
являются полезной оптимизацией производительности для сред, в которых внешняя по отношению к Python система (например, система сборки) отвечает за поддержание актуальности файлов .pyc
.
Для получения дополнительной информации см. раздел Аннулирование кэшированного байткода.
См.также
- PEP 552 – Детерминированный pycs
PEP написан и реализован Бенджамином Петерсоном
PEP 545: Переводы документации Python¶
PEP 545 описывает процесс создания и поддержки переводов документации Python.
Добавлены три новых перевода:
Японский язык: https://docs.python.org/ja/
Французский: https://docs.python.org/fr/
Корейский: https://docs.python.org/ko/
См.также
- PEP 545 – Переводы документации Python
PEP написан и реализован Жюльеном Паларом, Инадой Наоки и Виктором Стиннером.
Режим разработки Python (-X dev)¶
Для включения -X
можно использовать новый параметр командной строки dev
PYTHONDEVMODE
или новую переменную окружения Python Development Mode. В режиме разработки Python выполняет дополнительные проверки во время выполнения, которые слишком дороги, чтобы быть включенными по умолчанию. Полное описание смотрите в документации Python Development Mode.
Другие языковые изменения¶
Выражение
await
и выражения, содержащие клаузулуasync for
, были недопустимы в выражениях в formatted string literals из-за проблемы с реализацией. В Python 3.7 это ограничение было снято.Теперь в функцию можно передавать более 255 аргументов, а функция может иметь более 255 параметров. (Внесено Сергеем Сторчакой в bpo-12844 и bpo-18896).
bytes.fromhex()
иbytearray.fromhex()
теперь игнорируют все пробельные символы ASCII, а не только пробелы. (Внесено Робертом Сяо в bpo-28927).str
,bytes
иbytearray
получили поддержку нового методаisascii()
, который можно использовать для проверки, содержит ли строка или байт только символы ASCII. (Вклад INADA Naoki в bpo-32677).ImportError
теперь отображает имя модуля и путь к модулю__file__
, когдаfrom ... import ...
не работает. (Внесено Матиасом Буссонье в bpo-29546).Циклический импорт с абсолютным импортом с привязкой подмодуля к имени теперь поддерживается. (Внесено Сергеем Сторчакой в bpo-30024).
object.__format__(x, '')
теперь эквивалентенstr(x)
, а неformat(str(self), '')
. (Внесено Сергеем Сторчакой в bpo-28974).Чтобы лучше поддерживать динамическое создание трасс стека,
types.TracebackType
теперь можно инстанцировать из кода Python, а атрибутtb_next
на tracebacks теперь доступен для записи. (Вклад Натаниэля Дж. Смита в bpo-30579).При использовании переключателя
-m
,sys.path[0]
теперь охотно расширяется до полного пути к начальному каталогу, а не остается пустым каталогом (что позволяет импортировать из текущего рабочего каталога в момент, когда происходит импорт) (Внесено Ником Когланом в bpo-33053).Новая опция
-X
importtime
или переменная окруженияPYTHONPROFILEIMPORTTIME
могут быть использованы для отображения времени импорта каждого модуля. (Внесено Инадой Наоки в bpo-31415).
Новые модули¶
contextvars¶
Новый модуль contextvars
и набор new C APIs вводят поддержку контекстных переменных. Контекстные переменные концептуально похожи на переменные, локальные для потоков. В отличие от TLS, контекстные переменные корректно поддерживают асинхронный код.
Модули asyncio
и decimal
были обновлены для использования и поддержки контекстных переменных из коробки. В частности, активный десятичный контекст теперь хранится в контекстной переменной, что позволяет десятичным операциям работать с правильным контекстом в асинхронном коде.
См.также
- PEP 567 – Контекстные переменные
PEP написан и реализован Юрием Селивановым
dataclasses¶
Новый декоратор dataclass()
предоставляет возможность объявлять классы данных. Класс данных описывает свои атрибуты с помощью аннотаций переменных класса. Его конструктор и другие магические методы, такие как __repr__()
, __eq__()
и __hash__()
генерируются автоматически.
Пример:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
См.также
- PEP 557 – Классы данных
PEP написан и реализован Эриком В. Смитом
importlib.resources¶
Новый модуль importlib.resources
предоставляет несколько новых API и один новый ABC для доступа, открытия и чтения ресурсов внутри пакетов. Ресурсы примерно похожи на файлы внутри пакетов, но они не обязательно должны быть реальными файлами в физической файловой системе. Загрузчики модулей могут предоставлять функцию get_resource_reader()
, которая возвращает экземпляр importlib.abc.ResourceReader
для поддержки этого нового API. Встроенные загрузчики путей к файлам и загрузчики zip-файлов поддерживают это.
Вклад внесли Барри Варшава и Бретт Кэннон в bpo-32248.
См.также
importlib_resources – бэкпорт PyPI для более ранних версий Python.
Улучшенные модули¶
argparse¶
Новый метод ArgumentParser.parse_intermixed_args()
позволяет смешивать опции и позиционные аргументы. (Внесено paul.j3 в bpo-14191).
asyncio¶
Модуль asyncio
получил множество новых возможностей, удобство использования и performance improvements. Заметные изменения включают:
Новая функция provisional
asyncio.run()
может быть использована для запуска корутины из синхронного кода путем автоматического создания и уничтожения цикла событий. (Внесено Юрием Селивановым в bpo-32314).asyncio получил поддержку
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
иFuture.add_done_callback()
имеют новый необязательный параметр context только для ключевого слова.Tasks
теперь автоматически отслеживают свой контекст. Более подробную информацию смотрите в PEP 567. (Внесено Юрием Селивановым в bpo-32436).Новая функция
asyncio.create_task()
была добавлена в качестве сокращения дляasyncio.get_event_loop().create_task()
. (Внесено Андреем Светловым в bpo-32311).Новый метод
loop.start_tls()
можно использовать для обновления существующего соединения до TLS. (Внесено Юрием Селивановым в bpo-23749).Новый метод
loop.sock_recv_into()
позволяет читать данные из сокета непосредственно в предоставленный буфер, что дает возможность уменьшить количество копий данных. (Внесено Антуаном Питру в bpo-31819).Новая функция
asyncio.current_task()
возвращает текущий запущенный экземплярTask
, а новая функцияasyncio.all_tasks()
возвращает набор всех существующих экземпляровTask
в данном цикле. МетодыTask.current_task()
иTask.all_tasks()
были устаревшими. (Внесено Андреем Светловым в bpo-32250).Новый класс provisional
BufferedProtocol
позволяет реализовать потоковые протоколы с ручным управлением буфером приема. (Вклад Юрия Селиванова в bpo-32251).Новая функция
asyncio.get_running_loop()
возвращает текущий запущенный цикл и выдает сообщениеRuntimeError
, если цикл не запущен. Это отличается отasyncio.get_event_loop()
, которая создает новый цикл событий, если ни один из них не запущен. (Внесено Юрием Селивановым в bpo-32269).Новый метод корутины
StreamWriter.wait_closed()
позволяет ждать, пока писатель потока не будет закрыт. Новый методStreamWriter.is_closing()
может быть использован для определения закрытия писателя. (Внесено Андреем Светловым в bpo-32391).Новый метод корутины
loop.sock_sendfile()
позволяет отправлять файлы, используяos.sendfile
, когда это возможно. (Внесено Андреем Светловым в bpo-32410).Новые методы
Future.get_loop()
иTask.get_loop()
возвращают экземпляр цикла, на котором была создана задача или будущее.Server.get_loop()
позволяет делать то же самое для объектовasyncio.Server
. (Вклад Юрия Селиванова в bpo-32415 и Шриниваса Редди Тхатипарти в bpo-32418).Теперь можно контролировать, как экземпляры
asyncio.Server
начинают обслуживаться. Ранее сервер начинал обслуживать сразу после создания. Новый аргумент start_serving к ключевому словуloop.create_server()
иloop.create_unix_server()
, а такжеServer.start_serving()
иServer.serve_forever()
можно использовать для разделения инстанцирования и обслуживания сервера. Новый методServer.is_serving()
возвращаетTrue
, если сервер обслуживается. ОбъектыServer
теперь являются асинхронными менеджерами контекста:srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(Внесено Юрием Селивановым в bpo-32662).
Объекты обратного вызова, возвращаемые
loop.call_later()
, получили новый методwhen()
, который возвращает абсолютную временную метку запланированного обратного вызова. (Внесено Андреем Светловым в bpo-32741).Метод
loop.create_datagram_endpoint()
получил поддержку для сокетов Unix. (Вклад Квентина Даванса в bpo-31245).Функции
asyncio.open_connection()
,asyncio.start_server()
, методыloop.create_connection()
,loop.create_server()
,loop.create_accepted_socket()
и соответствующие им варианты сокетов UNIX теперь принимают аргумент ключевого слова ssl_handshake_timeout. (Внесено Нилом Аспиналлом в bpo-29970).Новый метод
Handle.cancelled()
возвращаетTrue
, если обратный вызов был отменен. (Внесено Маратом Шарафутдиновым в bpo-31943).Исходный текст asyncio был преобразован для использования синтаксиса
async
/await
. (Внесено Андреем Светловым в bpo-32193).Новый метод
ReadTransport.is_reading()
может быть использован для определения состояния чтения транспорта. Кроме того, вызовыReadTransport.resume_reading()
иReadTransport.pause_reading()
теперь идемпотентны. (Внесено Юрием Селивановым в bpo-32356).Методы Loop, принимающие пути к сокету, теперь поддерживают передачу path-like objects. (Вклад Юрия Селиванова в bpo-32066).
В
asyncio
TCP-сокеты в Linux теперь создаются с установленным по умолчанию флагомTCP_NODELAY
. (Вклад Юрия Селиванова и Виктора Стиннера в bpo-27456).Исключения, возникающие в отмененных задачах, больше не регистрируются. (Внесено Юрием Селивановым в bpo-30508).
Новые классы
WindowsSelectorEventLoopPolicy
иWindowsProactorEventLoopPolicy
. (Внесено Юрием Селивановым в bpo-33792).
Несколько API asyncio
были deprecated.
binascii¶
Функция b2a_uu()
теперь принимает необязательный аргумент backtick. Когда он истинен, нули представляются символами '`'
вместо пробелов. (Внесено Сянь Чжаном в bpo-30103).
календарь¶
Класс HTMLCalendar
имеет новые атрибуты класса, которые облегчают настройку классов CSS в создаваемом HTML-календаре. (Внесено Озом Тирамом в bpo-30095).
коллекции¶
collections.namedtuple()
теперь поддерживает значения по умолчанию. (Вклад Раймонда Хеттингера в bpo-32320).
compileall¶
compileall.compile_dir()
узнал новый параметр invalidation_mode, который может быть использован для включения hash-based .pyc invalidation. Режим аннулирования также может быть указан в командной строке с помощью нового аргумента --invalidation-mode
. (Вклад Бенджамина Петерсона в bpo-31650).
concurrent.futures¶
ProcessPoolExecutor
и ThreadPoolExecutor
теперь поддерживают новые аргументы конструктора initializer и initargs. (Внесено Антуаном Питру в bpo-21423).
ProcessPoolExecutor
теперь может принимать контекст мультипроцессинга через новый аргумент mp_context. (Внесено Томасом Моро в bpo-31540).
contextlib¶
Новый nullcontext()
является более простым и быстрым no-op менеджером контекста, чем ExitStack
. (Внесено Джесси-Баккером в bpo-10049).
Новые asynccontextmanager()
, AbstractAsyncContextManager
и AsyncExitStack
были добавлены в дополнение к их синхронным аналогам. (Вклад Джелла Зилстры в bpo-29679 и bpo-30241, а также Александра Мора и Ильи Кулакова в bpo-29302).
cProfile¶
Командная строка cProfile
теперь принимает -m module_name
в качестве альтернативы пути к сценарию. (Внесено Саньямом Хураной в bpo-21862).
крипта¶
Модуль crypt
теперь поддерживает метод хэширования Blowfish. (Внесено Сергеем Сторчакой в bpo-31664).
Функция mksalt()
теперь позволяет указывать количество раундов для хеширования. (Внесено Сергеем Сторчакой в bpo-31702).
дататайм¶
Новый метод datetime.fromisoformat()
создает объект datetime
из строки в одном из форматов, выводимых datetime.isoformat()
. (Внесено Полом Ганслом в bpo-15873).
Класс tzinfo
теперь поддерживает субминутные смещения. (Внесено Александром Белопольским в bpo-5288).
dbm¶
dbm.dumb
теперь поддерживает чтение файлов только для чтения и больше не записывает индексный файл, если он не изменен.
десятичная дробь¶
Модуль decimal
теперь использует context variables для хранения десятичного контекста. (Внесено Юрием Селивановым в bpo-32630).
dis¶
Функция dis()
теперь может разбирать вложенные объекты кода (код пониманий, генераторов выражений и вложенных функций, а также код, используемый для построения вложенных классов). Максимальная глубина рекурсии разборки контролируется новым параметром depth. (Внесено Сергеем Сторчакой в bpo-11822).
distutils¶
README.rst
теперь включен в список стандартных README дистрибутивов distutils и, следовательно, включен в дистрибутивы исходных текстов. (Вклад Райана Гонсалеса в bpo-11913).
enum¶
В Enum
было изучено новое свойство класса _ignore_
, позволяющее перечислять имена свойств, которые не должны становиться членами перечисления. (Внесено Итаном Фурманом из bpo-31801).
В Python 3.8 попытка проверить наличие объектов не-Enum в классах Enum
вызовет ошибку TypeError
(например, 1 in Color
); аналогично, попытка проверить наличие объектов не-Flag в членах Flag
вызовет ошибку TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции возвращают False
и являются устаревшими. (Внесено Итаном Фурманом в bpo-33217).
functools¶
functools.singledispatch()
теперь поддерживает регистрацию реализаций с использованием аннотаций типов. (Вклад внес Лукаш Ланга в bpo-32227).
gc¶
Новая функция gc.freeze()
позволяет заморозить все объекты, отслеживаемые сборщиком мусора, и исключить их из будущих сборов. Это можно использовать перед вызовом POSIX fork()
, чтобы сделать GC дружественным к копированию при записи или ускорить сборку. Новая функция gc.unfreeze()
обращает эту операцию вспять. Кроме того, gc.get_freeze_count()
можно использовать для получения количества замороженных объектов. (Внесено Ли Цзекуном в bpo-31558).
hmac¶
Модуль hmac
теперь имеет оптимизированную однозадачную функцию digest()
, которая в три раза быстрее, чем HMAC()
. (Вклад Кристиана Хаймса в bpo-32433).
http.client¶
HTTPConnection
и HTTPSConnection
теперь поддерживают новый аргумент blocksize для улучшения пропускной способности загрузки. (Внесено Ниром Соффером в bpo-31945).
http.server¶
SimpleHTTPRequestHandler
теперь поддерживает заголовок HTTP If-Modified-Since
. Сервер возвращает статус ответа 304, если целевой файл не был изменен по истечении времени, указанного в заголовке. (Внесено Пьером Квентелом из bpo-29654).
SimpleHTTPRequestHandler
принимает новый аргумент directory, в дополнение к новому аргументу командной строки --directory
. С этим параметром сервер обслуживает указанный каталог, по умолчанию он использует текущий рабочий каталог. (Внесено Стефаном Виртелом и Жюльеном Паларом в bpo-28707).
Новый класс ThreadingHTTPServer
использует потоки для обработки запросов с помощью ThreadingMixin
. Он используется, когда http.server
запускается вместе с -m
. (Внесен Жюльеном Палардом в bpo-31639).
idlelib и IDLE¶
Многочисленные исправления автозаполнения. (Внесено Луи Лу в bpo-15786).
Module Browser (в меню File, ранее назывался Class Browser) теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Вклад внесли Гильерме Поло, Шерил Сабелла и Терри Ян Риди в bpo-1612262).
Диалоговое окно настроек (Options, Configure IDLE) было частично переписано для улучшения внешнего вида и функциональности. (Внесено Шерил Сабелла и Терри Джен Риди в нескольких выпусках).
Образец шрифта теперь включает выборку нелатинских символов, чтобы пользователи могли лучше увидеть эффект от выбора конкретного шрифта. (Внесено Терри Яном Риди в bpo-13802.) Образец можно редактировать, чтобы включить другие символы. (Внесено Сергеем Сторчакой в bpo-31860).
Функции IDLE, ранее реализованные в виде расширений, были переделаны в обычные функции. Их настройки были перенесены с вкладки Расширения на другие вкладки диалога. (Вклад внесли Чарльз Вольгангер и Терри Ян Риди в bpo-27099).
Пересмотрена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до maxlines. Щелчок на контекстной строке переводит редактор на эту строку. Цвета контекста для пользовательских тем добавлены на вкладку Выделения диалога Настройки. (Вклад внесли Шерил Сабелла и Терри Ян Риди в bpo-33642, bpo-33768 и bpo-33679).
В Windows новый вызов API сообщает Windows, что tk масштабируется с учетом DPI. В Windows 8.1+ или 10, при неизменных свойствах совместимости DPI бинарного файла Python и разрешении монитора более 96 DPI, это должно сделать текст и линии более четкими. В противном случае это не должно иметь никакого эффекта. (Внесено Терри Яном Риди в bpo-33656).
Новое в версии 3.7.1:
Вывод более N строк (по умолчанию 50) сжимается до кнопки. N можно изменить в разделе PyShell на странице Общие диалогового окна Настройки. Меньшее количество строк, но, возможно, очень длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод может быть развернут на месте двойным щелчком по кнопке или в буфер обмена или отдельное окно щелчком правой кнопки. (Внесено Талем Эйнатом в bpo-1529353).
Вышеуказанные изменения были перенесены в поддерживающие релизы 3.6.
НОВОЕ в версии 3.7.4:
Добавьте «Run Customized» в меню Run, чтобы запустить модуль с настроенными параметрами. Все введенные аргументы командной строки добавляются в sys.argv. Они снова появляются в поле для следующего запуска с настройками. Можно также подавить обычный перезапуск главного модуля Shell. (Вклад внесли Шерил Сабелла, Терри Ян Риди и другие в bpo-5680 и bpo-37627).
Новое в 3.7.5:
Добавьте необязательные номера строк для окон редактора IDLE. Окна открываются без номеров строк, если иное не установлено на вкладке Общие диалогового окна конфигурации. Номера строк для существующего окна показываются и скрываются в меню Options. (Вклад внесли Тал Эйнат и Саймадхав Хебликар в bpo-17535).
importlib¶
ABC importlib.abc.ResourceReader
был введен для поддержки загрузки ресурсов из пакетов. См. также importlib.resources. (Вклад Барри Варшава, Бретта Кэннона в bpo-32248).
importlib.reload()
теперь поднимает ModuleNotFoundError
, если у модуля отсутствует спецификация. (Внесено Гарвитом Кхатри в bpo-29851).
importlib.find_spec()
теперь выдает ModuleNotFoundError
вместо AttributeError
, если указанный родительский модуль не является пакетом (т.е. не имеет атрибута __path__
). (Внесено Миланом Оберкирхом в bpo-30436).
Новый importlib.source_hash()
может быть использован для вычисления хэша переданного источника. А hash-based .pyc file вставляет значение, возвращаемое этой функцией.
io¶
Новый метод TextIOWrapper.reconfigure()
может быть использован для перенастройки текстового потока с новыми параметрами. (При участии Антуана Питру в bpo-30526 и Инада Наоки в bpo-15216).
ipaddress¶
Новые методы subnet_of()
и supernet_of()
из ipaddress.IPv6Network
и ipaddress.IPv4Network
можно использовать для тестов на сдерживание сети. (Вклад Мишеля Альбера и Шерил Сабелла в bpo-20825).
itertools¶
itertools.islice()
теперь принимает integer-like objects
в качестве аргументов start, stop и slice. (Внесено Уиллом Робертсом в bpo-30537).
локаль¶
Новый денежный аргумент в locale.format_string()
может быть использован для того, чтобы заставить преобразование использовать разделители денежных тысяч и группирующие строки. (Внесено Garvit в bpo-10379).
Функция locale.getpreferredencoding()
теперь всегда возвращает 'UTF-8'
на Android или когда находится в forced UTF-8 mode.
ведение журнала¶
Экземпляры Logger
теперь можно мариновать. (Вклад внес Vinay Sajip из bpo-30520).
Новый метод StreamHandler.setStream()
можно использовать для замены потока регистратора после создания обработчика. (Внесено Vinay Sajip в bpo-30522).
Теперь можно указывать аргументы ключевых слов для конструкторов обработчиков в конфигурации, передаваемой в logging.config.fileConfig()
. (Внесено Престоном Ландерсом в bpo-31080).
математика¶
Новая функция math.remainder()
реализует операцию остатка в стиле IEEE 754. (Внесено Марком Дикинсоном в bpo-29962).
mimetypes¶
MIME-тип .bmp был изменен с 'image/x-ms-bmp'
на 'image/bmp'
. (Внесено Нитишем Чандрой в bpo-22589).
msilib¶
Новый метод Database.Close()
можно использовать для закрытия базы данных MSI. (Внесено Беркером Пексагом в bpo-20486).
многопроцессорная обработка¶
Метод new Process.close()
явно закрывает объект процесса и освобождает все связанные с ним ресурсы. Метод ValueError
вызывается, если основной процесс все еще запущен. (Внесено Антуаном Питру в bpo-30596).
Новый метод Process.kill()
можно использовать для завершения процесса с помощью сигнала SIGKILL
на Unix. (Внесено Витором Перейрой в bpo-30794).
Недемонические потоки, создаваемые Process
, теперь объединяются при выходе из процесса. (Внесено Антуаном Питру в bpo-18966).
os¶
os.fwalk()
теперь принимает аргумент path как bytes
. (Внесено Сергеем Сторчакой в bpo-28682).
os.scandir()
получил поддержку file descriptors. (Внесено Сергеем Сторчакой в bpo-25996).
Новая функция register_at_fork()
позволяет регистрировать обратные вызовы Python для выполнения на развилке процесса. (Внесено Антуаном Питру в bpo-16500.)
Добавлены функции os.preadv()
(объединяют функциональность os.readv()
и os.pread()
) и os.pwritev()
(объединяют функциональность os.writev()
и os.pwrite()
). (Внесено Пабло Галиндо в bpo-31368).
Аргумент mode в os.makedirs()
больше не влияет на биты разрешения файлов вновь созданных каталогов промежуточного уровня. (Внесено Сергеем Сторчакой в bpo-19930).
os.dup2()
теперь возвращает новый дескриптор файла. Ранее всегда возвращалось None
. (Внесено Бенджамином Петерсоном в bpo-32441).
Структура, возвращаемая os.stat()
, теперь содержит атрибут st_fstype
на Solaris и его производных. (Внесено Хесусом Сеа Авионом в bpo-32659).
pathlib¶
Новый метод Path.is_mount()
теперь доступен в системах POSIX и может быть использован для определения того, является ли путь точкой монтирования. (Внесено Купером Ри Лисом в bpo-30897).
pdb¶
pdb.set_trace()
теперь принимает необязательный аргумент header, содержащий только ключевое слово. Если он задан, он выводится на консоль непосредственно перед началом отладки. (Внесено Барри Варшавом в bpo-31389).
Командная строка pdb
теперь принимает -m module_name
в качестве альтернативы файлу сценария. (Внесено Марио Корчеро в bpo-32206).
py_compile¶
py_compile.compile()
- и, соответственно, compileall
- теперь уважает переменную окружения SOURCE_DATE_EPOCH
, безусловно создавая .pyc
файлы для проверки на основе хэша. Это позволяет гарантировать reproducible builds файлов .pyc
при их нетерпеливом создании. (Внесено Бернхардом М. Видеманном в bpo-29708).
pydoc¶
Сервер pydoc теперь может привязываться к произвольному имени хоста, указанному новым аргументом командной строки -n
. (Внесено Феанилом Пателем в bpo-31128).
очередь¶
Новый класс SimpleQueue
представляет собой неограниченную очередь FIFO. (Внесено Антуаном Питру в bpo-14976).
re¶
Флаги re.ASCII
, re.LOCALE
и re.UNICODE
могут быть установлены в пределах группы. (Внесено Сергеем Сторчакой в bpo-31690).
re.split()
теперь поддерживает разбиение на шаблоны типа r'\b'
, '^$'
или (?=-)
, которые соответствуют пустой строке. (Внесено Сергеем Сторчакой в bpo-25054).
Регулярные выражения, скомпилированные с флагом re.LOCALE
, больше не зависят от локали во время компиляции. Параметры локали применяются только при использовании скомпилированного регулярного выражения. (Внесено Сергеем Сторчакой в bpo-30215).
FutureWarning
теперь выдается, если регулярное выражение содержит конструкции набора символов, которые семантически изменятся в будущем, такие как вложенные множества и операции с множествами. (Внесено Сергеем Сторчакой в bpo-30349).
Скомпилированные регулярные выражения и объекты соответствия теперь можно копировать с помощью copy.copy()
и copy.deepcopy()
. (Внесено Сергеем Сторчакой в bpo-10076).
сигнал¶
Новый аргумент warn_on_full_buffer в функции signal.set_wakeup_fd()
позволяет указать, печатает ли Python предупреждение на stderr при переполнении буфера пробуждения. (Внесено Натаниэлем Дж. Смитом в bpo-30050).
розетка¶
Новый метод socket.getblocking()
возвращает True
, если сокет находится в блокирующем режиме, и False
в противном случае. (Внесено Юрием Селивановым в bpo-32373).
Новая функция socket.close()
закрывает переданный дескриптор файла сокета. Эту функцию следует использовать вместо os.close()
для лучшей совместимости на разных платформах. (Внесено Кристианом Хаймсом в bpo-32454).
Модуль socket
теперь раскрывает константы socket.TCP_CONGESTION
(Linux 2.6.13), socket.TCP_USER_TIMEOUT
(Linux 2.6.37) и socket.TCP_NOTSENT_LOWAT
(Linux 3.12). (Вклад внесли Омар Сандовал в bpo-26273 и Натаниэль Дж. Смит в bpo-29728).
Поддержка сокетов socket.AF_VSOCK
была добавлена для обеспечения связи между виртуальными машинами и их хостами. (Внесено Кэти Эйвери в bpo-27584).
Сокеты теперь по умолчанию автоматически определяют семейство, тип и протокол из дескриптора файла. (Вклад Кристиана Хаймса из bpo-28134).
socketserver¶
socketserver.ThreadingMixIn.server_close()
теперь ожидает завершения всех недемонических потоков. socketserver.ForkingMixIn.server_close()
теперь ожидает завершения всех дочерних процессов.
Добавьте новый атрибут класса socketserver.ForkingMixIn.block_on_close
к классам socketserver.ForkingMixIn
и socketserver.ThreadingMixIn
. Установите атрибут класса в False
, чтобы получить поведение, существовавшее до версии 3.7.
sqlite3¶
sqlite3.Connection
теперь раскрывает метод backup()
, когда базовая библиотека SQLite имеет версию 3.6.11 или выше. (Внесено Леле Гайфаксом в bpo-27645).
Аргумент database в sqlite3.connect()
теперь принимает любой path-like object, а не только строку. (Внесено Андерсом Лоренценом в bpo-31843).
ssl¶
Модуль ssl
теперь использует встроенный API OpenSSL вместо match_hostname()
для проверки имени хоста или IP-адреса. Значения проверяются во время рукопожатия TLS. Любая ошибка проверки сертификата, включая неудачную проверку имени хоста, теперь вызывает исключение SSLCertVerificationError
и прерывает рукопожатие с соответствующим сообщением TLS Alert. Новое исключение содержит дополнительную информацию. Проверка имени хоста может быть настроена с помощью SSLContext.hostname_checks_common_name
. (Вклад Кристиана Хаймса в bpo-31399).
Примечание
Улучшенная проверка имени хоста требует реализации libssl, совместимой с OpenSSL 1.0.2 или 1.1. Соответственно, OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются (подробнее см. Удаление опор платформы). Модуль ssl в основном совместим с LibreSSL 2.7.2 и новее.
Модуль ssl
больше не отправляет IP-адреса в расширении SNI TLS. (Внесено Кристианом Хаймсом в bpo-32185).
match_hostname()
больше не поддерживает частичные подстановочные знаки, такие как www*.example.org
. (Вклад внесли Мандип Сингх из bpo-23033 и Кристиан Хаймс из bpo-31399).
Выбор набора шифров по умолчанию в модуле ssl
теперь использует подход черного списка, а не жестко заданного белого списка. Python больше не включает шифры, которые были заблокированы обновлениями безопасности OpenSSL. Выбор набора шифров по умолчанию может быть настроен во время компиляции. (Внесено Кристианом Хаймсом в bpo-31429).
Теперь поддерживается проверка сертификатов сервера, содержащих интернационализированные доменные имена (IDN). В рамках этого изменения атрибут SSLSocket.server_hostname
теперь хранит ожидаемое имя хоста в форме A-метки ("xn--pythn-mua.org"
), а не в форме U-метки ("pythön.org"
). (Вклад Натаниэля Дж. Смита и Кристиана Хаймса в bpo-28414).
Модуль ssl
имеет предварительную и экспериментальную поддержку TLS 1.3 и OpenSSL 1.1.1. На момент выпуска Python 3.7.0 OpenSSL 1.1.1 все еще находится в стадии разработки, а TLS 1.3 еще не был окончательно доработан. Квитирование и протокол TLS 1.3 ведут себя несколько иначе, чем TLS 1.2 и более ранние версии, смотрите TLS 1.3. (При участии Кристиана Хаймса в bpo-32947, bpo-20995, bpo-29136, bpo-30622 и bpo-33618)
SSLSocket
и SSLObject
больше не имеют публичного конструктора. Прямое создание экземпляров никогда не было документированной и поддерживаемой функцией. Экземпляры должны создаваться с помощью методов SSLContext
wrap_socket()
и wrap_bio()
. (Внесено Кристианом Хаймсом в bpo-32951)
API OpenSSL 1.1 для установки минимальной и максимальной версии протокола TLS доступны в виде SSLContext.minimum_version
и SSLContext.maximum_version
. Поддерживаемые протоколы обозначаются несколькими новыми флагами, такими как HAS_TLSv1_1
. (Вклад Кристиана Хаймса в bpo-32609).
строка¶
string.Template
теперь позволяет опционально изменять шаблон регулярного выражения для скобок и не скобок отдельно. (Вклад Барри Варшава в bpo-1198569).
подпроцесс¶
Функция subprocess.run()
принимает новый аргумент ключевого слова capture_output. При значении true будут захвачены stdout и stderr. Это эквивалентно передаче subprocess.PIPE
в качестве аргументов stdout и stderr. (Внесено Бо Бэйлзом в bpo-32102).
Функция subprocess.run
и конструктор subprocess.Popen
теперь принимают аргумент text в качестве псевдонима universal_newlines. (Внесено Эндрю Клеггом в bpo-31756).
В Windows значение по умолчанию для close_fds было изменено с False
на True
при перенаправлении стандартных дескрипторов. Теперь можно установить close_fds в true при перенаправлении стандартных дескрипторов. См. subprocess.Popen
. Это означает, что close_fds теперь имеет значение по умолчанию True
на всех поддерживаемых платформах. (Внесено Сегевом Файнером в bpo-19764).
Модуль подпроцесса стал более изящным при обработке KeyboardInterrupt
во время subprocess.call()
, subprocess.run()
или в менеджере контекста Popen
. Теперь он ждет некоторое время, пока дочерняя программа не выйдет, прежде чем продолжить обработку исключения KeyboardInterrupt
. (Внесено Грегори П. Смитом в bpo-25942).
sys¶
Новая крючковая функция sys.breakpointhook()
вызывается встроенной breakpoint()
. (Внесено Барри Варшавом в bpo-31353).
В Android новая функция sys.getandroidapilevel()
возвращает версию Android API во время сборки. (Вклад Виктора Стиннера в bpo-28740).
Новая функция sys.get_coroutine_origin_tracking_depth()
возвращает текущую глубину отслеживания начала кориутины, заданную новой функцией sys.set_coroutine_origin_tracking_depth()
. asyncio
был преобразован для использования этого нового API вместо устаревшего sys.set_coroutine_wrapper()
. (Внесено Натаниэлем Дж. Смитом в bpo-32591).
время¶
PEP 564 добавляет в модуль time
шесть новых функций с наносекундным разрешением:
Добавлены новые идентификаторы часов:
time.CLOCK_BOOTTIME
(Linux): Идентичноtime.CLOCK_MONOTONIC
, за исключением того, что включает в себя все время, когда система приостановлена.time.CLOCK_PROF
(FreeBSD, NetBSD и OpenBSD): таймер процессора с высоким разрешением для каждого процесса.time.CLOCK_UPTIME
(FreeBSD, OpenBSD): Время, абсолютное значение которого - это время, в течение которого система работает и не приостановлена, что обеспечивает точное измерение времени работы.
Новые функции time.thread_time()
и time.thread_time_ns()
можно использовать для получения измерений процессорного времени каждого потока. (Внесено Антуаном Питру в bpo-32025).
Новая функция time.pthread_getcpuclockid()
возвращает идентификатор часов потокозависимых часов процессорного времени.
tkinter¶
Новый класс tkinter.ttk.Spinbox
теперь доступен. (Внесено Аланом Муром в bpo-32585).
tracemalloc¶
tracemalloc.Traceback
ведет себя более похоже на обычные трассировки, сортируя кадры от самых старых к самым последним. Traceback.format()
теперь принимает отрицательный лимит, усекая результат до abs(limit)
самых старых кадров. Чтобы получить старое поведение, используйте новый аргумент most_recent_first в Traceback.format()
. (Внесено Джесси Баккером в bpo-32121).
типы¶
Новые классы WrapperDescriptorType
, MethodWrapperType
, MethodDescriptorType
и ClassMethodDescriptorType
теперь доступны. (Вклад Мануэля Креббера и Гвидо ван Россума в bpo-29377, и Сергея Сторчака в bpo-32265).
Новая функция types.resolve_bases()
разрешает записи MRO динамически, как указано в PEP 560. (Внесено Иваном Левкивским в bpo-32717).
unicodedata¶
Внутренняя база данных unicodedata
была обновлена для использования Unicode 11. (Внесено Бенджамином Петерсоном.)
unittest¶
Новая опция командной строки -k
позволяет фильтровать тесты по подстроке имени или шаблону, подобному Unix shell. Например, python -m unittest -k foo
запускает foo_tests.SomeTest.test_something
, bar_tests.SomeTest.test_foo
, но не bar_tests.FooTest.test_something
. (Внесено Йонасом Хаагом в bpo-32071).
unittest.mock¶
Атрибуты sentinel
теперь сохраняют свою идентичность, когда они являются copied
или pickled
. (Внесено Сергеем Сторчакой в bpo-20804).
Новая функция seal()
позволяет запечатывать экземпляры Mock
, что запрещает дальнейшее создание макетов атрибутов. Печать применяется рекурсивно ко всем атрибутам, которые сами являются макетами. (Внесено Марио Корчеро в bpo-30541).
urllib.parse¶
urllib.parse.quote()
был обновлен с RFC 2396 до RFC 3986, добавив ~
к набору символов, которые по умолчанию никогда не берутся в кавычки. (Вклад Кристиана Теуна и Ратнадипа Дебната в bpo-16285).
uu¶
Функция uu.encode()
теперь принимает необязательный аргумент backtick. Когда он истинен, нули представляются символами '`'
вместо пробелов. (Внесено Сянь Чжаном в bpo-30103).
uuid¶
Новый атрибут UUID.is_safe
передает информацию от платформы о том, генерируются ли генерируемые UUID безопасным для мультипроцессинга методом. (Вклад Барри Варшава в bpo-22807).
uuid.getnode()
теперь предпочитает универсально администрируемые MAC-адреса локально администрируемым MAC-адресам. Это позволяет лучше гарантировать глобальную уникальность UUID, возвращаемых из uuid.uuid1()
. Если доступны только локально администрируемые MAC-адреса, возвращается первый найденный MAC-адрес. (Внесено Барри Варшавом в bpo-32107).
предупреждения¶
Инициализация фильтров предупреждений по умолчанию была изменена следующим образом:
предупреждения, включенные с помощью опций командной строки (включая опции
-b
и новую специфическую для CPython опцию-X
dev
), всегда передаются в механизм предупреждений через атрибутsys.warnoptions
.Фильтры предупреждений, включенные через командную строку или окружение, теперь имеют следующий порядок приоритета:
фильтр
BytesWarning
для-b
(или-bb
)любые фильтры, указанные с помощью опции
-W
любые фильтры, заданные с помощью переменной окружения
PYTHONWARNINGS
любые другие фильтры, специфичные для CPython (например, фильтр
default
, добавленный для нового режима-X dev
)любые неявные фильтры, определенные непосредственно механизмом предупреждения
в CPython debug builds теперь все предупреждения отображаются по умолчанию (список неявных фильтров пуст)
(Вклад Ника Коглана и Виктора Стиннера в bpo-20361, bpo-32043 и bpo-32230).
Предупреждения об износе снова показываются по умолчанию в однофайловых сценариях и в интерактивном приглашении. Подробности см. в PEP 565: Показывать предупреждение об устаревании в __main__. (Внесено Ником Когланом в bpo-31975).
xml.etree¶
Предикаты ElementPath в методах find()
теперь могут сравнивать текст текущего узла с [. = "text"]
, а не только текст в дочерних узлах. Предикаты также позволяют добавлять пробелы для лучшей читабельности. (Внесено Стефаном Бехнелем в bpo-31648).
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function
теперь можно использовать в качестве декоратора. (Внесено Сянь Чжаном в bpo-7769).
zipapp¶
Функция create_archive()
теперь принимает необязательный аргумент filter, позволяющий пользователю выбрать, какие файлы должны быть включены в архив. (Внесено Ирменом де Йонгом в bpo-31072).
Функция create_archive()
теперь принимает необязательный аргумент compressed для создания сжатого архива. Опция командной строки --compress
также была добавлена для поддержки сжатия. (Внесено Zhiming Wang в bpo-31638).
zipfile¶
ZipFile
теперь принимает новый параметр compresslevel для управления уровнем сжатия. (Внесено Бо Бэйлсом в bpo-21417).
Подкаталоги в архивах, созданных с помощью ZipFile
, теперь хранятся в алфавитном порядке. (Внесено Бернхардом М. Видеманном из bpo-30693).
Изменения в API C¶
Реализован новый API для потоково-локального хранения данных. Смотрите PEP 539: Новый C API для локального хранения потоков для обзора и API Thread Specific Storage (TSS) для полной справки. (Внесено Масаюки Ямамото в bpo-25658).
Новая функциональность context variables раскрывает ряд new C APIs.
Новая функция PyImport_GetModule()
возвращает ранее импортированный модуль с заданным именем. (Внесено Эриком Сноу в bpo-28411).
Новый макрос Py_RETURN_RICHCOMPARE
облегчает написание богатых функций сравнения. (Внесено Петром Викторином в bpo-23699).
Новый макрос Py_UNREACHABLE
можно использовать для пометки недостижимых путей кода. (Вклад Барри Варшава в bpo-31338).
tracemalloc
теперь предоставляет API на языке C через новые функции PyTraceMalloc_Track()
и PyTraceMalloc_Untrack()
. (Вклад Виктора Стиннера в bpo-30054).
Новые статические маркеры import__find__load__start()
и import__find__load__done()
можно использовать для отслеживания импорта модулей. (Внесено Кристианом Хаймсом в bpo-31574).
Поля name
и doc
структур PyMemberDef
, PyGetSetDef
, PyStructSequence_Field
, PyStructSequence_Desc
и wrapperbase
теперь имеют тип const char *
, а не char *
. (Внесено Сергеем Сторчакой в bpo-28761).
Результат PyUnicode_AsUTF8AndSize()
и PyUnicode_AsUTF8()
теперь имеет тип const char *
, а не char *
. (Внесено Сергеем Сторчакой в bpo-28769).
Результатом PyMapping_Keys()
, PyMapping_Values()
и PyMapping_Items()
теперь всегда является список, а не список или кортеж. (Внесено Ореном Милманом в bpo-28280).
Добавлены функции PySlice_Unpack()
и PySlice_AdjustIndices()
. (Внесено Сергеем Сторчакой в bpo-27867).
Функция PyOS_AfterFork()
устарела в пользу новых функций PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
и PyOS_AfterFork_Child()
. (Внесено Антуаном Питру в bpo-16500).
Синглтон PyExc_RecursionErrorInst
, который был частью публичного API, был удален, так как его члены, которые никогда не очищаются, могут вызвать сегфаулт во время финализации интерпретатора. Вклад Ксавье де Гайе в bpo-22898 и bpo-30697.
Добавлена поддержка таймзонов в C API с конструкторами таймзонов PyTimeZone_FromOffset()
и PyTimeZone_FromOffsetAndName()
, а также доступ к синглтону UTC с помощью PyDateTime_TimeZone_UTC
. Внесено Полом Ганслом в bpo-10381.
Тип результатов PyThread_start_new_thread()
и PyThread_get_thread_ident()
, а также параметр id в PyThreadState_SetAsyncExc()
изменился с long на unsigned long. (Внесено Сергеем Сторчакой в bpo-6532).
PyUnicode_AsWideCharString()
теперь вызывает ошибку ValueError
, если второй аргумент NULL
и строка wchar_t* содержит нулевые символы. (Внесено Сергеем Сторчакой в bpo-30708).
Изменения в последовательности запуска и управлении динамическими распределителями памяти означают, что давно документированное требование вызывать Py_Initialize()
перед вызовом большинства функций C API теперь используется более активно, и несоблюдение этого требования может привести к сегфаултам во встраиваемых приложениях. Подробнее см. раздел Перенос на Python 3.7 в этом документе и раздел Перед инициализацией Python в документации по C API.
Новая функция PyInterpreterState_GetID()
возвращает уникальный идентификатор для данного интерпретатора. (Внесено Эриком Сноу в bpo-29102).
Py_DecodeLocale()
, Py_EncodeLocale()
теперь используют кодировку UTF-8, когда включен UTF-8 mode. (Внесено Виктором Стиннером в bpo-29240).
PyUnicode_DecodeLocaleAndSize()
и PyUnicode_EncodeLocale()
теперь используют текущую кодировку локали для обработчика ошибок surrogateescape
. (Внесено Виктором Стиннером в bpo-29240).
Параметры start и end в PyUnicode_FindChar()
теперь настроены так, чтобы вести себя как строковые фрагменты. (Внесено Сянь Чжаном в bpo-28822).
Изменения в конструкции¶
Поддержка построения --without-threads
была удалена. Модуль threading
теперь всегда доступен. (Вклад Антуана Питру в bpo-31370).
Полная копия libffi больше не поставляется для использования при сборке модуля _ctypes
на UNIX-платформах, отличных от OSX. Теперь при сборке _ctypes
на таких платформах требуется установленная копия libffi. (Внесено Закари Уэйром в bpo-27979).
Процесс сборки Windows больше не зависит от Subversion для получения внешних источников, вместо этого используется сценарий Python для загрузки zip-файлов с GitHub. Если Python 3.6 не найден в системе (через py -3.6
), NuGet используется для загрузки копии 32-битного Python для этой цели. (Внесено Закари Уэйром в bpo-30450).
Для работы модуля ssl
требуется OpenSSL 1.0.2 или 1.1, совместимый с libssl. OpenSSL 1.0.1 достиг конца срока службы 2016-12-31 и больше не поддерживается. LibreSSL также временно не поддерживается. В релизах LibreSSL до версии 2.6.4 отсутствуют необходимые API OpenSSL 1.0.2.
Оптимизации¶
Накладные расходы на вызов многих методов различных классов стандартной библиотеки, реализованных на языке C, были значительно снижены за счет переноса большего количества кода для использования соглашения METH_FASTCALL
. (Вклад Виктора Стиннера в bpo-29300, bpo-29507, bpo-29452 и bpo-29286).
Различные оптимизации позволили сократить время запуска Python на 10% в Linux и до 30% в macOS. (Вклад внесли Виктор Стиннер, Инада Наоки в bpo-29585 и Иван Левкивский в bpo-31333).
Вызовы методов теперь выполняются на 20% быстрее благодаря изменениям в байткоде, которые позволяют избежать создания связанных экземпляров методов. (Вклад Юрия Селиванова и INADA Naoki в bpo-26110).
Модуль asyncio
получил ряд заметных оптимизаций для часто используемых функций:
Функция
asyncio.get_event_loop()
была переделана на языке C, чтобы сделать ее в 15 раз быстрее. (Вклад Юрия Селиванова в bpo-32296).Оптимизировано управление обратными вызовами
asyncio.Future
. (Вклад Юрия Селиванова в bpo-32348).asyncio.gather()
теперь работает на 15% быстрее. (Внесено Юрием Селивановым в bpo-32355).asyncio.sleep()
теперь работает в 2 раза быстрее, когда аргумент delay равен нулю или отрицателен. (Внесено Андреем Светловым в bpo-32351).Уменьшены накладные расходы на производительность режима отладки asyncio. (Внесено Антуаном Питру из bpo-31970).
В результате использования PEP 560 work время импорта typing
сократилось в 7 раз, и многие операции по набору текста теперь выполняются быстрее. (Внесено Иваном Левкивским в bpo-32226).
sorted()
и list.sort()
были оптимизированы для обычных случаев, чтобы быть на 40-75% быстрее. (Вклад Эллиота Гороховского в bpo-28685).
dict.copy()
теперь работает в 5,5 раз быстрее. (Внесено Юрием Селивановым из bpo-31179).
hasattr()
и getattr()
теперь работают примерно в 4 раза быстрее, если name не найдено и obj не переопределяет object.__getattr__()
или object.__getattribute__()
. (Внесено INADA Naoki в bpo-32544).
Поиск определенных символов Unicode (например, украинской заглавной буквы «Є») в строке был в 25 раз медленнее, чем поиск других символов. Теперь в худшем случае это всего лишь в 3 раза медленнее. (Внесено Сергеем Сторчакой из bpo-24821).
Фабрика collections.namedtuple()
была переработана, чтобы сделать создание именованных кортежей в 4-6 раз быстрее. (Внесено Джелле Зилстра (Jelle Zijlstra) с дальнейшими улучшениями, внесенными Инада Наоки (INADA Naoki), Сергеем Сторчака и Раймондом Хеттингером в bpo-28638).
date.fromordinal()
и date.fromtimestamp()
теперь работают на 30% быстрее в общем случае. (Внесено Полом Ганслом в bpo-32403).
Функция os.fwalk()
теперь работает в 2 раза быстрее благодаря использованию os.scandir()
. (Внесено Сергеем Сторчакой в bpo-25996).
Скорость работы функции shutil.rmtree()
была улучшена на 20-40% благодаря использованию функции os.scandir()
. (Внесено Сергеем Сторчакой в bpo-28564).
Оптимизировано нечувствительное к регистру сопоставление и поиск regular expressions
. Поиск некоторых шаблонов теперь может быть в 20 раз быстрее. (Внесено Сергеем Сторчакой в bpo-30285).
re.compile()
теперь преобразует параметр flags
в объект int, если он RegexFlag
. Теперь он работает так же быстро, как Python 3.5, и быстрее Python 3.6 примерно на 10% в зависимости от шаблона. (Внесено INADA Naoki в bpo-31671).
Методы modify()
классов selectors.EpollSelector
, selectors.PollSelector
и selectors.DevpollSelector
могут работать примерно на 10% быстрее при больших нагрузках. (Внесено Джампаоло Родола“ в bpo-30014)
Сложение констант было перенесено из оптимизатора peephole в новый оптимизатор AST, который способен выполнять оптимизацию более последовательно. (Вклад Евгения Тодера и Наоки Инада в bpo-29469 и bpo-11549).
Большинство функций и методов в abc
были переписаны на C. Это позволяет создавать абстрактные базовые классы и вызывать isinstance()
и issubclass()
на них в 1,5 раза быстрее. Это также сокращает время запуска Python на 10%. (Вклад Ивана Левкивского и INADA Naoki в bpo-31333)
Значительное повышение скорости работы альтернативных конструкторов для datetime.date
и datetime.datetime
за счет использования конструкторов быстрого пути, когда не конструируются подклассы. (Внесено Полом Ганслом в bpo-32403)
Скорость сравнения экземпляров array.array
в некоторых случаях была значительно улучшена. Теперь она составляет от 10x до 70x при сравнении массивов, содержащих значения одного и того же целочисленного типа. (Внесено Адрианом Вельгосиком в bpo-24700).
Функции math.erf()
и math.erfc()
теперь используют (более быструю) реализацию библиотеки C на большинстве платформ. (Внесено Сергеем Сторчакой в bpo-26121).
Другие изменения в реализации CPython¶
Теперь крючки трассировки могут отказаться от получения
line
и согласиться на получениеopcode
событий от интерпретатора, установив соответствующие новые атрибутыf_trace_lines
иf_trace_opcodes
на отслеживаемом кадре. (Внесено Ником Когланом в bpo-31344).Исправлены некоторые проблемы согласованности с атрибутами модулей пакетов пространства имен. Объекты модуля пространства имен теперь имеют
__file__
, который устанавливается вNone
(ранее не устанавливался), а их__spec__.origin
также устанавливается вNone
(ранее строка"namespace"
). См. bpo-32305. Кроме того, значение__spec__.loader
объекта модуля пространства имен устанавливается равным__loader__
(ранее было установлено значениеNone
). См. bpo-32303.Словарь
locals()
теперь отображается в том лексическом порядке, в котором были определены переменные. Ранее порядок был неопределен. (Внесено Раймондом Хеттингером в bpo-32690).Команда
distutils
upload
больше не пытается заменить символы конца строки CR на CRLF. Это исправляет проблему повреждения sdist’ов, которые заканчивались байтом, эквивалентным CR. (Внесено Бо Бэйлзом в bpo-32304).
Устаревшее поведение Python¶
Выражения Yield (как yield
, так и yield from
) теперь не используются в осмыслениях и генераторных выражениях (за исключением выражения iterable в крайнем левом предложении for
). Это гарантирует, что comprehensions всегда немедленно возвращает контейнер соответствующего типа (а не потенциально возвращает объект generator iterator), а выражения-генераторы не будут пытаться совместить свой неявный вывод с выводом любых явных выражений yield. В Python 3.7 такие выражения выдают DeprecationWarning
при компиляции, в Python 3.8 это будет SyntaxError
. (Вклад Сергея Сторчака в bpo-10544).
Возврат подкласса complex
из object.__complex__()
является устаревшим и будет ошибкой в будущих версиях Python. Это делает __complex__()
согласованным с object.__int__()
и object.__float__()
. (Внесено Сергеем Сторчакой в bpo-28894).
Устаревшие модули, функции и методы Python¶
aifc¶
aifc.openfp()
был устаревшим и будет удален в Python 3.9. Вместо этого используйте aifc.open()
. (Внесено Брайаном Кертином в bpo-31985).
asyncio¶
Поддержка прямого использования await
экземпляров asyncio.Lock
и других примитивов синхронизации asyncio была упразднена. Для получения и освобождения ресурса синхронизации необходимо использовать асинхронный менеджер контекста. (Внесено Андреем Светловым в bpo-32253).
Методы asyncio.Task.current_task()
и asyncio.Task.all_tasks()
были устаревшими. (Внесено Андреем Светловым в bpo-32250).
коллекции¶
В Python 3.8 абстрактные базовые классы в collections.abc
больше не будут раскрываться в обычном модуле collections
. Это поможет создать более четкое различие между конкретными классами и абстрактными базовыми классами. (Внесено Сергеем Сторчакой в bpo-25988).
dbm¶
dbm.dumb
теперь поддерживает чтение файлов только для чтения и больше не записывает индексный файл, если он не изменен. Предупреждение об устаревании теперь выдается, если индексный файл отсутствует и создается заново в режимах 'r'
и 'w'
(это будет ошибкой в будущих выпусках Python). (Внесено Сергеем Сторчакой в bpo-28847).
enum¶
В Python 3.8 попытка проверить наличие объектов не-Enum в классах Enum
вызовет ошибку TypeError
(например, 1 in Color
); аналогично, попытка проверить наличие объектов не-Flag в членах Flag
вызовет ошибку TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции возвращают False
. (Внесено Итаном Фурманом в bpo-33217).
gettext¶
Использование нецелого значения для выбора формы множественного числа в gettext
теперь устарело. Оно никогда не работало корректно. (Внесено Сергеем Сторчакой в bpo-28692).
importlib¶
Методы MetaPathFinder.find_module()
(заменен на MetaPathFinder.find_spec()
) и PathEntryFinder.find_loader()
(заменен на PathEntryFinder.find_spec()
), которые были устаревшими в Python 3.4, теперь выдают DeprecationWarning
. (Внесено Матиасом Буссонье в bpo-29576)
ABC importlib.abc.ResourceLoader
был устаревшим в пользу importlib.abc.ResourceReader
.
локаль¶
locale.format()
был устаревшим, вместо него используйте locale.format_string()
. (Внесено Гарвитом в bpo-10379).
macpath¶
macpath
теперь устарел и будет удален в Python 3.8. (Вклад Чи Хсуан Ена в bpo-9850).
нарезание резьбы¶
dummy_threading
и _dummy_thread
были устаревшими. Больше невозможно собрать Python с отключенной многопоточностью. Вместо этого используйте threading
. (Внесено Антуаном Питру в bpo-31370).
розетка¶
Молчаливое усечение значения аргумента в socket.htons()
и socket.ntohs()
было устаревшим. В будущих версиях Python, если переданный аргумент больше 16 бит, будет вызвано исключение. (Внесено Ореном Милманом в bpo-28332).
ssl¶
ssl.wrap_socket()
является устаревшим. Вместо этого используйте ssl.SSLContext.wrap_socket()
. (Внесено Кристианом Хаймсом в bpo-28124).
сунау¶
sunau.openfp()
был устаревшим и будет удален в Python 3.9. Вместо этого используйте sunau.open()
. (Внесено Брайаном Кертином в bpo-31985).
sys¶
Утратили силу sys.set_coroutine_wrapper()
и sys.get_coroutine_wrapper()
.
Недокументированная функция sys.callstats()
была устаревшей и будет удалена в одной из будущих версий Python. (Внесено Виктором Стиннером в bpo-28799).
волна¶
wave.openfp()
был устаревшим и будет удален в Python 3.9. Вместо этого используйте wave.open()
. (Внесено Брайаном Кертином в bpo-31985).
Устаревшие функции и типы API языка C¶
Функция PySlice_GetIndicesEx()
устарела и заменяется макросом, если Py_LIMITED_API
не установлена или установлена в значение в диапазоне между 0x03050400
и 0x03060000
(не включительно), или равна 0x03060100
или выше. (Внесено Сергеем Сторчакой в bpo-27867).
PyOS_AfterFork()
был устаревшим. Вместо этого используйте PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
или PyOS_AfterFork_Child()
. (Внесено Антуаном Питру в bpo-16500).
Удаление опор платформы¶
FreeBSD 9 и старше больше официально не поддерживается.
Для полной поддержки Unicode, в том числе в модулях расширения, *nix платформы теперь должны предоставлять по крайней мере одну из
C.UTF-8
(полная локаль),C.utf8
(полная локаль) илиUTF-8
(LC_CTYPE
только локаль) в качестве альтернативы унаследованнойASCII
, основанной наC
локали.OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются, что означает, что сборка CPython 3.7 с поддержкой SSL/TLS на старых платформах, все еще использующих эти версии, требует пользовательских опций сборки, которые ссылаются на более свежую версию OpenSSL.
Примечательно, что эта проблема затрагивает дистрибутивы Debian 8 (он же «jessie») и Ubuntu 14.04 (он же «Trusty») LTS Linux, поскольку они по-прежнему используют OpenSSL 1.0.1 по умолчанию.
Debian 9 («stretch») и Ubuntu 16.04 («xenial»), а также недавние выпуски других LTS Linux (например, RHEL/CentOS 7.5, SLES 12-SP3), используют OpenSSL 1.0.2 или более позднюю версию и остаются поддерживаемыми в конфигурации сборки по умолчанию.
Собственный CI configuration file CPython предоставляет пример использования SSL compatibility testing infrastructure в наборе тестов CPython для сборки и соединения с OpenSSL 1.1.0, а не с устаревшим OpenSSL, предоставляемым системой.
Удаление API и функций¶
Следующие функции и API были удалены из Python 3.7:
Функция
os.stat_float_times()
была удалена. Она была введена в Python 2.3 для обратной совместимости с Python 2.2, а с Python 3.1 стала неактуальной.Неизвестные экраны, состоящие из
'\'
и буквы ASCII в шаблонах замены дляre.sub()
, были устаревшими в Python 3.5, и теперь будут вызывать ошибку.Удалена поддержка аргумента exclude в
tarfile.TarFile.add()
. Он был устаревшим в Python 2.7 и 3.2. Вместо него используйте аргумент filter.Функция
splitunc()
в модулеntpath
была устаревшей в Python 3.1 и теперь удалена. Вместо нее используйте функциюsplitdrive()
.collections.namedtuple()
больше не поддерживает параметр verbose или атрибут_source
, который показывал сгенерированный исходный код для именованного класса tuple. Это было частью оптимизации, направленной на ускорение создания классов. (Вклад внес Jelle Zijlstra с дальнейшими улучшениями INADA Naoki, Serhiy Storchaka и Raymond Hettinger в bpo-28638).Функции
bool()
,float()
,list()
иtuple()
больше не принимают аргументы в виде ключевых слов. Первый аргумент функцииint()
теперь может передаваться только как позиционный аргумент.Удалены ранее deprecated в Python 2.4 классы
Plist
,Dict
и_InternalDict
в модулеplistlib
. Значения диктов в результатах функцийreadPlist()
иreadPlistFromBytes()
теперь являются обычными диктами. Вы больше не можете использовать доступ к атрибутам для доступа к элементам этих словарей.Функция
asyncio.windows_utils.socketpair()
была удалена. Вместо нее используйте функциюsocket.socketpair()
, она доступна на всех платформах, начиная с Python 3.5.asyncio.windows_utils.socketpair
была просто псевдонимом дляsocket.socketpair
на Python 3.5 и новее.asyncio
больше не экспортирует модулиselectors
и_overlapped
какasyncio.selectors
иasyncio._overlapped
. Заменитеfrom asyncio import selectors
наimport selectors
.Прямое инстанцирование объектов
ssl.SSLSocket
иssl.SSLObject
теперь запрещено. Эти конструкторы никогда не документировались, не тестировались и не проектировались как публичные конструкторы. Предполагалось, что пользователи должны использоватьssl.wrap_socket()
илиssl.SSLContext
. (Внесено Кристианом Хаймсом из bpo-32951).Неиспользуемая команда
distutils
install_misc
была удалена. (Внесено Эриком Н. Вандер Виле в bpo-29218).
Удаление модулей¶
Модуль fpectl
был удален. Он никогда не был включен по умолчанию, никогда не работал корректно на x86-64, и изменял ABI Python таким образом, что вызывал неожиданные поломки расширений C. (Внесено Натаниэлем Дж. Смитом в bpo-29137).
Изменения только для Windows¶
Программа запуска python (py.exe) может принимать 32 и 64-битные спецификаторы **без необходимости указывать минорную версию. Таким образом, py -3-32
и py -3-64
становятся допустимыми, также как и py -3.7-32
, также формы -m-64 и -m.n-64 теперь принимаются для принудительного использования 64-битного python, даже если в противном случае использовалась бы 32-битная версия. Если указанная версия недоступна, py.exe завершит работу с ошибкой. (Внесено Стивом Барнсом в bpo-30291).
Программа запуска может быть запущена как py -0
для получения списка установленных питонов, по умолчанию помеченных звездочкой. При запуске py -0p
будут указаны пути. Если py запущен со спецификатором версии, который не может быть подобран, он также выведет краткий список доступных спецификаторов. (Внесено Стивом Барнсом в bpo-30362).
Перенос на Python 3.7¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении Python¶
Имена
async
иawait
теперь являются зарезервированными ключевыми словами. Код, использующий эти имена в качестве идентификаторов, теперь будет выдавать ошибкуSyntaxError
. (Внесено Jelle Zijlstra в bpo-30406).PEP 479 включен для всего кода в Python 3.7, что означает, что исключения
StopIteration
, прямо или косвенно вызванные в короутинах и генераторах, преобразуются в исключенияRuntimeError
. (Внесено Юрием Селивановым в bpo-32670).Методы
object.__aiter__()
больше не могут быть объявлены как асинхронные. (Вклад Юрия Селиванова в bpo-31709).По недосмотру более ранние версии Python ошибочно принимали следующий синтаксис:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 теперь корректно вызывает ошибку
SyntaxError
, поскольку выражение генератора всегда должно находиться непосредственно внутри набора круглых скобок и не может иметь запятую с обеих сторон, а дублирование круглых скобок может быть опущено только при вызове. (Внесено Сергеем Сторчакой в bpo-32012 и bpo-32023).При использовании переключателя
-m
начальный рабочий каталог теперь добавляется вsys.path
, а не в пустую строку (которая динамически обозначала текущий рабочий каталог во время каждого импорта). Любые программы, которые проверяют пустую строку или иным образом полагаются на предыдущее поведение, должны быть соответствующим образом обновлены (например, путем проверки наos.getcwd()
илиos.path.dirname(__main__.__file__)
, в зависимости от того, почему код проверял пустую строку в первую очередь).
Изменения в API Python¶
socketserver.ThreadingMixIn.server_close()
теперь ожидает завершения всех потоков, не являющихся демонами. Установите новый атрибут классаsocketserver.ThreadingMixIn.block_on_close
вFalse
, чтобы получить поведение, существовавшее до версии 3.7. (Внесено Виктором Стиннером в bpo-31233 и bpo-33540).socketserver.ForkingMixIn.server_close()
теперь ожидает завершения всех дочерних процессов. Установите новый атрибут классаsocketserver.ForkingMixIn.block_on_close
вFalse
, чтобы получить поведение, существовавшее до версии 3.7. (Внесено Виктором Стиннером в bpo-31151 и bpo-33540).Функция
locale.localeconv()
теперь в некоторых случаях временно устанавливает локальLC_CTYPE
в значениеLC_NUMERIC
. (Внесено Виктором Стиннером в bpo-31900).pkgutil.walk_packages()
теперь возвращаетValueError
, если path является строкой. Ранее возвращался пустой список. (Внесено Саньямом Кхураной в bpo-24744).Аргументом форматной строки для
string.Formatter.format()
теперь является positional-only. Передача его в качестве аргумента ключевого слова была устаревшей в Python 3.5. (Внесено Сергеем Сторчакой в bpo-29193).Атрибуты
key
,value
иcoded_value
классаhttp.cookies.Morsel
теперь доступны только для чтения. Присвоение им атрибутов было устаревшим в Python 3.5. Для их задания используйте методset()
. (Внесено Сергеем Сторчакой в bpo-29192).Аргумент mode в
os.makedirs()
больше не влияет на биты разрешения файлов вновь созданных каталогов промежуточного уровня. Чтобы установить их биты разрешения файлов, вы можете установить umask перед вызовомmakedirs()
. (Внесено Сергеем Сторчакой в bpo-19930).Тип
struct.Struct.format
теперьstr
вместоbytes
. (Внесено Виктором Стиннером в bpo-21071).parse_multipart()
теперь принимает аргументы encoding и errors и возвращает те же результаты, что иFieldStorage
: для нефайловых полей значение, связанное с ключом, представляет собой список строк, а не байтов. (Внесено Пьером Квентелом в bpo-29979).Из-за внутренних изменений в
socket
вызовsocket.fromshare()
на сокете, созданномsocket.share
в старых версиях Python, не поддерживается.repr
дляBaseException
изменилось так, чтобы не включать запятую после запятой. Это изменение затрагивает большинство исключений. (Внесено Сергеем Сторчакой в bpo-30399).repr
дляdatetime.timedelta
изменился, чтобы включить аргументы ключевых слов в вывод. (Внесено Уткаршем Упадхьяем в bpo-30302).Поскольку функция
shutil.rmtree()
теперь реализована с помощью функцииos.scandir()
, при неудачном листинге каталога указанный пользователем обработчик onerror теперь вызывается с первым аргументомos.scandir
вместоos.listdir
.В будущем может быть добавлена поддержка вложенных множеств и операций с множествами в регулярных выражениях, как в Unicode Technical Standard #18. Это изменит синтаксис. Чтобы облегчить это будущее изменение, пока что в неоднозначных случаях будет выдаваться
FutureWarning
. К ним относятся наборы, начинающиеся с литерала'['
или содержащие последовательности символов'--'
,'&&'
,'~~'
и'||'
. Чтобы избежать предупреждения, экранируйте их обратной косой чертой. (Внесено Сергеем Сторчакой в bpo-30349).Изменен результат разбиения строки на
regular expression
, который может совпасть с пустой строкой. Например, при разбиении наr'\s*'
теперь разбиение будет происходить не только на пробельные символы, как раньше, но и на пустые строки перед всеми не пробельными символами и непосредственно перед концом строки. Прежнее поведение можно восстановить, изменив шаблон наr'\s+'
. Начиная с Python 3.5 для таких шаблонов выдавался символFutureWarning
.Для шаблонов, которые соответствуют как пустым, так и непустым строкам, результат поиска всех совпадений может быть изменен и в других случаях. Например, в строке
'a\n\n'
шаблонr'(?m)^\s*?$'
будет соответствовать не только пустым строкам в позициях 2 и 3, но и строке'\n'
в позициях 2–3. Чтобы соответствовать только пустым строкам, шаблон должен быть переписан какr'(?m)^[^\S\n]*$'
.re.sub()
теперь заменяет пустые совпадения, примыкающие к предыдущему непустому совпадению. Например,re.sub('x*', '-', 'abxd')
теперь возвращает'-a-b--d-'
вместо'-a-b-d-'
(первый минус между „b“ и „d“ заменяет „x“, а второй минус заменяет пустую строку между „x“ и „d“).Измените
re.escape()
так, чтобы он экранировал только специальные символы regex вместо экранирования всех символов, кроме букв ASCII, цифр и'_'
. (Внесено Сергеем Сторчакой в bpo-29995).Фреймы
tracemalloc.Traceback
теперь сортируются от самых старых к самым последним, чтобы быть более согласованными сtraceback
. (Внесено Джесси Баккером в bpo-32121).В ОС, поддерживающих битовые флаги
socket.SOCK_NONBLOCK
илиsocket.SOCK_CLOEXEC
, флагиsocket.type
больше не применяются. Поэтому проверки типаif sock.type == socket.SOCK_STREAM
работают, как и ожидалось, на всех платформах. (Вклад Юрия Селиванова в bpo-32331).В Windows значение по умолчанию для аргумента close_fds в
subprocess.Popen
было изменено сFalse
наTrue
при перенаправлении стандартных хэндлов. Если вы ранее полагались на наследование хэндлов при использованииsubprocess.Popen
со стандартным перенаправлением io, вам придется передатьclose_fds=False
, чтобы сохранить прежнее поведение, или использоватьSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
- который неявно влияет наimportlib.invalidate_caches()
- теперь удаляет записи вsys.path_importer_cache
, которые установлены вNone
. (Внесено Бреттом Кэнноном в bpo-33169).В
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
были изменены методы, чтобы они были надлежащими методами coroutine в соответствии с их документацией. Ранее эти методы возвращали экземплярыasyncio.Future
. (Внесено Юрием Селивановым в bpo-32327).asyncio.Server.sockets
теперь возвращает копию внутреннего списка серверных сокетов, вместо того, чтобы возвращать его напрямую. (Внесено Юрием Селивановым в bpo-32662).Struct.format
теперь является экземпляромstr
вместо экземпляраbytes
. (Внесено Виктором Стиннером в bpo-21071).Подпарсеры
argparse
теперь можно сделать обязательными, передавrequired=True
вArgumentParser.add_subparsers()
. (Внесено Энтони Соттилом в bpo-26510).ast.literal_eval()
теперь более строгий. Сложение и вычитание произвольных чисел больше не допускается. (Внесено Сергеем Сторчакой в bpo-31778).Calendar.itermonthdates
теперь будет постоянно вызывать исключение, когда дата выходит за пределы диапазона0001-01-01
-9999-12-31
. Для поддержки приложений, не терпящих таких исключений, можно использовать новые методыCalendar.itermonthdays3
иCalendar.itermonthdays4
. Новые методы возвращают кортежи и не ограничены диапазоном, поддерживаемымdatetime.date
. (Внесено Александром Белопольским в bpo-28292).collections.ChainMap
теперь сохраняет порядок базовых отображений. (Внесено Раймондом Хеттингером в bpo-32792).Метод
submit()
вconcurrent.futures.ThreadPoolExecutor
иconcurrent.futures.ProcessPoolExecutor
теперь вызывает ошибкуRuntimeError
, если вызывается во время выключения интерпретатора. (Внесено Марком Немеком в bpo-33097).Конструктор
configparser.ConfigParser
теперь используетread_dict()
для обработки значений по умолчанию, что делает его поведение согласованным с остальной частью парсера. Нестроковые ключи и значения в словаре defaults теперь неявно преобразуются в строки. (Внесено Джеймсом Токнеллом в bpo-23835).Несколько недокументированных внутренних импортов были удалены. Например,
os.errno
больше не доступен; вместо него следует использоватьimport errno
. Обратите внимание, что такие недокументированные внутренние импорты могут быть удалены в любое время без уведомления, даже в микро-версиях.
Изменения в API языка C¶
Функция PySlice_GetIndicesEx()
считается небезопасной для изменяемых по размеру последовательностей. Если индексами срезов являются не экземпляры int
, а объекты, реализующие метод __index__()
, то после передачи длины последовательности в !PySlice_GetIndicesEx ее размер может быть изменен. Это может привести к возврату индексов, выходящих за пределы длины последовательности. Для предотвращения возможных проблем используйте новые функции PySlice_Unpack()
и PySlice_AdjustIndices()
. (Внесено Сергеем Сторчакой в bpo-27867).
Изменения в байткоде CPython¶
Есть два новых опкода: LOAD_METHOD
и CALL_METHOD
. (Вклад Юрия Селиванова и INADA Naoki в bpo-26110).
Опкод STORE_ANNOTATION
был удален. (Внесено Марком Шенноном в bpo-32550).
Изменения только для Windows¶
Файл, используемый для переопределения sys.path
, теперь называется <python-executable>._pth
вместо 'sys.path'
. Дополнительную информацию см. в Поиск модулей. (Внесено Стивом Дауэром в bpo-28137).
Другие изменения в реализации CPython¶
В рамках подготовки к возможным будущим изменениям в публичном API инициализации среды выполнения CPython (см. PEP 432 для первоначального, но несколько устаревшего проекта), внутренняя логика запуска и управления конфигурацией CPython была значительно рефакторингована. Хотя эти обновления должны быть полностью прозрачными как для внедряемых приложений, так и для пользователей обычного CPython CLI, они упоминаются здесь, поскольку рефакторинг изменяет внутренний порядок различных операций при запуске интерпретатора и, следовательно, может обнаружить ранее скрытые дефекты либо во внедряемых приложениях, либо в самом CPython. (Первоначально было внесено Ником Когланом и Эриком Сноу в рамках bpo-22257, а затем обновлено Ником, Эриком и Виктором Стиннером в ряде других выпусков). Затронуты некоторые известные детали:
PySys_AddWarnOptionUnicode()
в настоящее время не используется встраиваемыми приложениями из-за требования создать объект Unicode перед вызовом Py_Initialize. Вместо этого используйтеPySys_AddWarnOption()
.фильтры предупреждений, добавленные встраиваемым приложением с помощью
PySys_AddWarnOption()
, теперь должны более последовательно иметь приоритет над фильтрами по умолчанию, установленными интерпретатором
В связи с изменениями в настройке фильтров предупреждений по умолчанию, установка Py_BytesWarningFlag
в значение больше единицы больше не является достаточной для выдачи BytesWarning
сообщений и их преобразования в исключения. Вместо этого необходимо установить флаг (чтобы предупреждения выдавались в первую очередь) и добавить явный фильтр предупреждений error::BytesWarning
, чтобы преобразовать их в исключения.
В связи с изменением способа обработки doc-строк компилятором, неявное return None
в теле функции, состоящем только из doc-строки, теперь помечается как встречающееся в той же строке, что и doc-строка, а не в строке заголовка функции.
Текущее состояние исключения было перенесено из объекта фрейма в ко-программу. Это упростило интерпретатор и исправило пару неясных ошибок, вызванных наличием подменного состояния исключения при входе или выходе из генератора. (Внесено Марком Шенноном в bpo-25612).
Заметные изменения в Python 3.7.1¶
Начиная с версии 3.7.1, Py_Initialize()
теперь последовательно читает и соблюдает все те же параметры окружения, что и Py_Main()
(в более ранних версиях Python он соблюдал неопределенное подмножество этих переменных окружения, а в Python 3.7.0 не читал ни одной из них из-за bpo-34247). Если такое поведение нежелательно, установите Py_IgnoreEnvironmentFlag
в 1 перед вызовом Py_Initialize()
.
В 3.7.1 C API для контекстных переменных was updated использовать указатели PyObject
. См. также bpo-34762.
В версии 3.7.1 модуль tokenize
теперь неявно выдает токен NEWLINE
, когда на вход подается информация, не содержащая новой строки. Такое поведение теперь соответствует тому, что делает внутренний маркер языка C. (Внесено Аммаром Аскаром в bpo-33899).
Заметные изменения в Python 3.7.2¶
В версии 3.7.2 venv
на Windows больше не копирует оригинальные двоичные файлы, а создает вместо них перенаправляющие скрипты с именами python.exe
и pythonw.exe
. Это решает давнюю проблему, когда все виртуальные среды должны были обновляться или создаваться заново при каждом обновлении Python. Тем не менее, обратите внимание, что в этом выпуске все еще потребуется пересоздание виртуальных сред для получения новых скриптов.
Заметные изменения в Python 3.7.6¶
В связи с серьезными проблемами безопасности параметр reuse_address в asyncio.loop.create_datagram_endpoint()
больше не поддерживается. Это связано с поведением параметра сокета SO_REUSEADDR
в UDP. Для получения более подробной информации смотрите документацию для loop.create_datagram_endpoint()
. (Вклад Кайла Стэнли, Антуана Питру и Юрия Селиванова в bpo-37228).
Заметные изменения в Python 3.7.10¶
Более ранние версии Python позволяли использовать ;
и &
в качестве разделителей параметров запроса в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, с &
по умолчанию. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют соответствующие функции внутри. Для получения более подробной информации, пожалуйста, обратитесь к соответствующей документации. (Вклад внесли Адам Голдшмидт, Сентхил Кумаран и Кен Джин в bpo-42967).