Що нового в Python 3.7

редактор:

Elvis Pranskevichus <elvis@magic.io>

У цій статті пояснюється нові функції в Python 3.7 порівняно з 3.6. Python 3.7 було випущено 27 червня 2018 року. Щоб отримати повну інформацію, перегляньте журнал змін.

Підсумок – Основні моменти випуску

Нові функції синтаксису:

  • PEP 563, відкладена оцінка анотацій типу.

Зворотно несумісні зміни синтаксису:

  • async і await тепер є зарезервованими ключовими словами.

Нові бібліотечні модулі:

Нові вбудовані функції:

Покращення моделі даних Python:

  • PEP 562, налаштування доступу до атрибутів модуля.

  • PEP 560, основна підтримка модуля введення тексту та загальних типів.

  • природа збереження порядку вставки dict об’єктів була оголошена (has been declared) офіційною частиною специфікації мови Python.

Значні вдосконалення стандартної бібліотеки:

Покращення реалізації CPython:

Покращення C API:

  • 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: Застаріле C Локальний примус

Постійним завданням у серії Python 3 було визначення розумної стратегії за замовчуванням для обробки припущення про кодування тексту «7-bit 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.

У режимі 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 для потокового локального зберігання

While Python provides a C API for thread-local storage support; the existing Thread Local Storage (TLS) API has used int to represent TLS keys across all platforms. This has not generally been a problem for officially support platforms, but that is neither POSIX-compliant, nor portable in any practical sense.

PEP 539 changes this by providing a new Thread Specific Storage (TSS) API to CPython which supersedes use of the existing TLS API within the CPython interpreter, while deprecating the existing API. The TSS API uses a new type Py_tss_t instead of int to represent TSS keys–an opaque type the definition of which may depend on the underlying TLS implementation. Therefore, this will allow to build CPython on platforms where the native TLS key is defined in a way that cannot be safely cast to int.

Note that on platforms where the native TLS key is defined in a way that cannot be safely cast to int, all functions of the existing TLS API will be no-op and immediately return failure. This indicates clearly that the old API is not supported on platforms where it cannot be used reliably, and that no effort will be made to add such support.

Дивись також

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 show that on Linux and Windows the resolution of time.time_ns() is approximately 3 times better than that of time.time().

Дивись також

PEP 564 – Додайте нові функції часу з роздільною здатністю наносекунд

PEP написав і реалізував Віктор Стіннер

PEP 565: Показати DeprecationWarning у __main__

Стандартну обробку DeprecationWarning було змінено таким чином, що ці попередження знову відображаються за замовчуванням, але лише тоді, коли код, який їх ініціює, виконується безпосередньо в модулі __main__. Як наслідок, розробники однофайлових сценаріїв і ті, хто використовує Python в інтерактивному режимі, повинні знову почати бачити попередження про застаріння для API, які вони використовують, але попередження про застаріння, викликані імпортованими програмними, бібліотечними та фреймворковими модулями, будуть і надалі приховані за замовчуванням.

У результаті цієї зміни стандартна бібліотека тепер дозволяє розробникам вибирати між трьома різними способами попередження про застарілу дію:

  • FutureWarning: завжди відображається за умовчанням, рекомендовано для попереджень, призначених для перегляду кінцевими користувачами програми (наприклад, для застарілих налаштувань конфігурації програми).

  • DeprecationWarning: відображається за замовчуванням лише в __main__ і під час виконання тестів, рекомендовано для попереджень, призначених для перегляду іншими розробниками Python, коли оновлення версії може призвести до зміни поведінки або помилки.

  • PendingDeprecationWarning: відображається за замовчуванням лише під час виконання тестів, призначених для випадків, коли майбутнє оновлення версії змінить категорію попередження на DeprecationWarning або FutureWarning.

Раніше і DeprecationWarning, і PendingDeprecationWarning були видимі лише під час виконання тестів, що означало, що розробники, які переважно пишуть однофайлові сценарії або використовують Python в інтерактивному режимі, можуть бути здивовані несправними змінами в API, які вони використовували.

Дивись також

PEP 565 – Показати DeprecationWarning у __main__

PEP написав і реалізував Нік Коглан

PEP 560: Основна підтримка модуля введення і загальних типів

Спочатку PEP 484 було розроблено таким чином, щоб не вносити жодних змін до основного інтерпретатора CPython. Тепер підказки щодо типів і модуль typing широко використовуються спільнотою, тому це обмеження знято. PEP представляє два спеціальні методи __class_getitem__() і __mro_entries__, ці методи тепер використовуються більшістю класів і спеціальних конструкцій у typing. В результаті швидкість різних операцій з типами зросла до 7 разів, загальні типи можна використовувати без конфліктів метакласів, а також виправлено кілька давніх помилок в модулі typing.

Дивись також

PEP 560 – Основна підтримка модуля введення тексту та загальних типів

PEP написав і реалізував Іван Левківський

PEP 552: Файли .pyc на основі хешу

Python традиційно перевіряє актуальність файлів кешу байт-кодів (тобто файлів .pyc), порівнюючи метадані джерела (мітку часу та розмір останньої зміни) із метаданими джерела, збереженими в заголовку файлу кешу, коли він був створений. Хоча цей метод визнання недійсним ефективний, він має свої недоліки. Якщо мітки часу файлової системи занадто грубі, Python може пропустити вихідні оновлення, що призведе до плутанини користувачів. Крім того, наявність мітки часу у файлі кешу є проблематичною для відтворюваності збірки і систем збірки на основі вмісту.

PEP 552 розширює формат pyc, дозволяючи використовувати хеш вихідного файлу для визнання недійсним замість мітки часу джерела. Такі файли .pyc називаються «на основі хешу». За замовчуванням Python усе ще використовує недійсність на основі мітки часу та не створює файли .pyc на основі хешу під час виконання. Файли .pyc на основі хешу можуть бути згенеровані за допомогою py_compile або compileall.

Файли .pyc на основі хешу бувають двох варіантів: позначені та не позначені. Python перевіряє перевірені хеш-файли .pyc на відповідність вихідним файлам під час виконання, але не робить цього для неперевірених хеш-файлів pycs. Файли .pyc на основі неперевірених хешів є корисною оптимізацією продуктивності для середовищ, де зовнішня по відношенню до Python система (наприклад, система збірки) відповідає за підтримку файлів .pyc в актуальному стані.

Перегляньте Анулювання кешованого байт-коду для отримання додаткової інформації.

Дивись також

PEP 552 – Детерміновані зображення

PEP написав і реалізував Бенджамін Петерсон

PEP 545: Переклади документації Python

PEP 545 описує процес створення та підтримки перекладів документації Python.

Додано три нові переклади:

Дивись також

PEP 545 – Переклади документації Python

PEP написаний і реалізований Жульєном Палардом, Інадою Наокі та Віктором Стіннером.

Режим розробки Python (-X dev)

Новий параметр командного рядка -X dev або нову змінну середовища PYTHONDEVMODE можна використовувати, щоб увімкнути Режим розробки Python. У режимі розробки Python виконує додаткові перевірки під час виконання, які занадто дорогі, щоб їх можна було ввімкнути за замовчуванням. Дивіться документацію Python Development Mode для повного опису.

Інші зміни мови

  • Вираз await і розуміння, що містять пункт async for, були незаконними у виразах у форматованих рядкових літералах через проблему з реалізацією. У 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.)

  • In order to better support dynamic creation of stack traces, types.TracebackType can now be instantiated from Python code, and the tb_next attribute on tracebacks is now writable. (Contributed by Nathaniel J. Smith in bpo-30579.)

  • Якщо використовується перемикач -m, sys.path[0] тепер швидко розгортається до повного початкового шляху каталогу, а не залишається порожнім каталогом (що дозволяє імпортувати з поточного робочий каталог під час імпорту) (Надано Ніком Когланом у bpo-33053.)

  • Новий параметр -X importtime або змінну середовища PYTHONPROFILEIMPORTTIME можна використовувати для відображення часу імпорту кожного модуля. (Надано Інадою Наокі в bpo-31415.)

Нові модулі

контекстні змінні

Новий модуль contextvars і набір нових API C запроваджують підтримку контекстних змінних. Змінні контексту концептуально подібні до локальних змінних потоку. На відміну від TLS, контекстні змінні правильно підтримують асинхронний код.

Модулі asyncio і decimal оновлено для використання та підтримки контекстних змінних із коробки. Зокрема, активний десятковий контекст тепер зберігається в контекстній змінній, що дозволяє десятковим операціям працювати з правильним контекстом в асинхронному коді.

Дивись також

PEP 567 – Контекстні змінні

PEP написав і реалізував Юрій Селіванов

класи даних

Новий декоратор 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 – a PyPI backport for earlier Python versions.

Покращені модулі

argparse

Новий метод ArgumentParser.parse_intermixed_args() дозволяє змішувати параметри та позиційні аргументи. (Надано paul.j3 у bpo-14191.)

asyncio

Модуль asyncio отримав багато нових функцій, зручність використання та покращення продуктивності. Помітні зміни включають:

  • Нову функцію provisional asyncio.run() можна використовувати для запуску співпрограми з синхронного коду шляхом автоматичного створення та знищення циклу подій. (Надав Юрій Селіванов у bpo-32314.)

  • asyncio отримав підтримку для contextvars. loop.call_soon(), loop.call_soon_threadsafe(), loop.call_later(), loop.call_at(), and 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.)

  • Новий тимчасовий клас 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.)

  • Методи циклу, які приймають шляхи до сокетів, тепер підтримують передачу path-подібних об’єктів. (Надав Юрій Селіванов у bpo-32066.)

  • У asyncio TCP-сокети в Linux тепер створюються з прапорцем TCP_NODELAY, установленим за замовчуванням. (Надано Юрієм Селівановим і Віктором Стіннером у bpo-27456.)

  • Винятки, що виникають у скасованих завданнях, більше не реєструються. (Надав Юрій Селіванов у bpo-30508.)

  • Нові класи WindowsSelectorEventLoopPolicy і WindowsProactorEventLoopPolicy. (Надав Юрій Селіванов у bpo-33792.)

Кілька asyncio API були застарілими.

binascii

Функція b2a_uu() тепер приймає додатковий аргумент ключового слова backtick. Коли це істина, нулі представлені '`' замість пробілів. (Надав Xiang Zhang у bpo-30103.)

календар

Клас HTMLCalendar має нові атрибути класу, які спрощують налаштування класів CSS у створеному HTML-календарі. (Надав Оз Тірам у bpo-30095.)

колекції

collections.namedtuple() тепер підтримує значення за замовчуванням. (Надав Реймонд Геттінгер у bpo-32320.)

compileall

compileall.compile_dir() отримав новий параметр invalidation_mode, який можна використовувати для ввімкнення анулювання .pyc на основі хешу. Режим недійсності також можна вказати в командному рядку за допомогою нового аргументу --invalidation-mode. (Надав Бенджамін Петерсон у bpo-31650.)

concurrent.futures

ProcessPoolExecutor і ThreadPoolExecutor тепер підтримують нові аргументи конструктора initializer і initargs. (Надав Антуан Пітру в bpo-21423.)

ProcessPoolExecutor тепер може приймати багатопроцесорний контекст за допомогою нового аргументу mp_context. (Надав Томас Моро в bpo-31540.)

contextlib

Новий nullcontext() є простішим і швидшим безопераційним менеджером контексту, ніж ExitStack. (Надано Jesse-Bakker у bpo-10049.)

Нові asynccontextmanager(), AbstractAsyncContextManager і AsyncExitStack додано, щоб доповнити їх синхронні аналоги. (Надано Джелле Зійлстра в bpo-29679 і bpo-30241, а також Олександром Мором та Іллею Кулаковим у bpo-29302.)

cProfile

Командний рядок cProfile тепер приймає -m module_name як альтернативу шляху сценарію. (Надано Sanyam Khurana в bpo-21862.)

склеп

Модуль crypt тепер підтримує метод хешування Blowfish. (Надав Сергій Сторчака в bpo-31664.)

Функція mksalt() тепер дозволяє вказувати кількість раундів для хешування. (Надав Сергій Сторчака в bpo-31702.)

дата, час

Новий метод datetime.fromisoformat() створює об’єкт datetime із рядка в одному з форматів, виведених datetime.isoformat(). (Надав Пол Ганссле в bpo-15873.)

Клас tzinfo тепер підтримує субхвилинні зсуви. (Надав Олександр Бєлопольський у bpo-5288.)

dbm

dbm.dumb тепер підтримує читання файлів лише для читання та більше не записує файл індексу, якщо він не змінений.

десятковий

Модуль decimal тепер використовує контекстні змінні для зберігання десяткового контексту. (Надав Юрій Селіванов у bpo-32630.)

дис

Функція dis() тепер може розбирати об’єкти вкладеного коду (код розуміння, вирази генератора та вкладені функції, а також код, який використовується для створення вкладених класів). Максимальна глибина рекурсії розбирання контролюється новим параметром depth. (Надав Сергій Сторчака в bpo-11822.)

distutils

README.rst тепер включено до списку стандартних файлів README Distutils і, отже, включено до вихідних дистрибутивів. (Надав Райан Гонзалес у bpo-11913.)

перелік

Enum отримав нову властивість класу _ignore_, яка дозволяє перераховувати назви властивостей, які не повинні стати членами переліку. (Надав Ітан Фурман у bpo-31801.)

У Python 3.8 спроба перевірити об’єкти, відмінні від Enum, у класах Enum викличе TypeError (наприклад, 1 in Color); аналогічно спроба перевірити об’єкти без прапорців у члені Flag викличе TypeError (наприклад, 1 in Perm.RW); наразі обидві операції замість цього повертають False і є застарілими. (Надав Ітан Фурман у bpo-33217.)

functools

functools.singledispatch() тепер підтримує реєстрацію реалізацій за допомогою анотацій типів. (Надав Łukasz Langa в 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.сервер

SimpleHTTPRequestHandler тепер підтримує заголовок HTTP If-Modified-Since. Сервер повертає статус відповіді 304, якщо цільовий файл не було змінено після часу, зазначеного в заголовку. (Надано П’єром Квентелем у bpo-29654.)

SimpleHTTPRequestHandler приймає новий аргумент directory на додаток до нового аргументу командного рядка --directory. З цим параметром сервер обслуговує вказаний каталог, за замовчуванням він використовує поточний робочий каталог. (Надано Стефаном Віртелем і Жюльєном Палардом у bpo-28707.)

Новий клас ThreadingHTTPServer використовує потоки для обробки запитів за допомогою ThreadingMixin. Він використовується, коли http.server запускається з -m. (Надав Жюльєн Палард у bpo-31639.)

idlelib і IDLE

Кілька виправлень для автозавершення. (Надав Луї Лу в bpo-15786.)

Браузер модулів (у меню «Файл», раніше називався «Браузер класів») тепер відображає вкладені функції та класи на додаток до функцій і класів верхнього рівня. (Надано Гільєрме Поло, Шеріл Сабелла та Террі Ян Ріді в bpo-1612262.)

Діалогове вікно налаштувань (параметри, налаштування IDLE) було частково переписано, щоб покращити зовнішній вигляд і функції. (Надано Шеріл Сабеллою та Террі Джен Ріді в кількох випусках.)

Зразок шрифту тепер містить вибірку нелатинських символів, щоб користувачі могли краще побачити ефект від вибору певного шрифту. (Надав Террі Ян Ріді в bpo-13802.) Зразок можна редагувати, щоб включити інші символи. (Надав Сергій Сторчака в bpo-31860.)

Функції IDLE, раніше реалізовані як розширення, були повторно реалізовані як звичайні функції. Їх налаштування переміщено з вкладки «Розширення» на інші вкладки діалогу. (Надано Чарльзом Волгангером і Террі Джаном Ріді в bpo-27099.)

Опцію контексту коду редактора переглянуто. Box відображає всі контекстні рядки до 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. Вікна відкриваються без номерів рядків, якщо не встановлено інше на вкладці «Загальні» діалогового вікна налаштування. Номери рядків для існуючого вікна відображаються та ховаються в меню «Параметри». (Надано Тал Ейнат і Саймадхав Геблікар у bpo-17535.)

importlib

importlib.abc.ResourceReader ABC було представлено для підтримки завантаження ресурсів із пакетів. Дивіться також importlib.resources. (Надано Баррі Варшау, Бреттом Кенноном у bpo-32248.)

importlib.reload() тепер викликає ModuleNotFoundError, якщо модуль не має специфікації. (Надав Гарвіт Хатрі в bpo-29851.)

importlib.find_spec() тепер викликає ModuleNotFoundError замість AttributeError, якщо вказаний батьківський модуль не є пакетом (тобто не має атрибута __path__). (Надав Мілан Оберкірх у bpo-30436.)

Новий importlib.source_hash() можна використовувати для обчислення хешу переданого джерела. файл .pyc на основі хешу вбудовує значення, яке повертає ця функція.

io

Новий метод TextIOWrapper.reconfigure() можна використовувати для переналаштування текстового потоку з новими налаштуваннями. (Надано Антуаном Пітру в bpo-30526 та INADA Naoki в bpo-15216.)

IP-адреса

Нові методи subnet_of() і supernet_of() ipaddress.IPv6Network і ipaddress.IPv4Network можна використовувати для перевірки обмеження мережі. (Надано Мішелем Альбертом і Шеріл Сабеллою в bpo-20825.)

itertools

itertools.islice() тепер приймає цілочисельні об’єкти як аргументи запуску, зупинки та фрагмента. (Надав Вілл Робертс у bpo-30537.)

локаль

Новий аргумент monetary для locale.format_string() можна використовувати, щоб перетворення використовувало грошові розділювачі тисяч і рядки групування. (Надано Гарвітом у bpo-10379.)

Функція locale.getpreferredencoding() тепер завжди повертає 'UTF-8' на Android або в примусовому режимі UTF-8.

лісозаготівля

Тепер екземпляри Logger можна маринувати. (Надав Віней Саджип у bpo-30520.)

Новий метод StreamHandler.setStream() можна використовувати для заміни потоку реєстратора після створення обробника. (Надав Віней Саджип у bpo-30522.)

Тепер можна вказати ключові аргументи для конструкторів обробників у конфігурації, переданій у logging.config.fileConfig(). (Надано Престоном Лендерсом у bpo-31080.)

математика

Нова функція math.remainder() реалізує операцію залишку у стилі IEEE 754. (Надав Марк Дікінсон у bpo-29962.)

міметипи

Тип MIME .bmp змінено з 'image/x-ms-bmp на 'image/bmp'. (Надано Nitish Chandra в bpo-22589.)

msilib

Новий метод Database.Close() можна використовувати для закриття бази даних MSI. (Надано Berker Peksag у bpo-20486.)

багатопроцесорність

Новий метод Process.close() явно закриває об’єкт процесу та звільняє всі пов’язані з ним ресурси. ValueError виникає, якщо основний процес все ще виконується. (Надав Антуан Пітру в bpo-30596.)

Новий метод Process.kill() можна використовувати для завершення процесу за допомогою сигналу SIGKILL в Unix. (Надав Вітор Перейра в bpo-30794.)

Недемонічні потоки, створені Process, тепер об’єднуються після виходу з процесу. (Надав Антуан Пітру в bpo-18966.)

ос

os.fwalk() тепер приймає аргумент path як bytes. (Надав Сергій Сторчака в bpo-28682.)

os.scandir() отримав підтримку для дескрипторів файлів. (Надав Сергій Сторчака в bpo-25996.)

Нова функція register_at_fork() дозволяє реєструвати зворотні виклики Python для виконання в розгалуженні процесу. (Надав Антуан Пітру в bpo-16500.)

Додано функції os.preadv() (поєднує функції os.readv() і os.pread()) і os.pwritev() (поєднує функції os.writev() і os.pwrite()). (Надав Пабло Галіндо в bpo-31368.)

The mode argument of os.makedirs() no longer affects the file permission bits of newly created intermediate-level directories. (Contributed by Serhiy Storchaka in bpo-19930.)

os.dup2() тепер повертає новий дескриптор файлу. Раніше завжди повертався None. (Надав Бенджамін Петерсон у bpo-32441.)

Структура, яку повертає os.stat(), тепер містить атрибут st_fstype у Solaris та його похідних. (Надав Jesús Cea Avión у bpo-32659.)

pathlib

Новий метод Path.is_mount() тепер доступний у системах POSIX і може використовуватися для визначення того, чи є шлях точкою монтування. (Надав Купер Рай Ліз у bpo-30897.)

pdb

pdb.set_trace() тепер приймає необов’язковий аргумент заголовок, що містить лише ключове слово. Якщо вказано, воно друкується на консолі безпосередньо перед початком налагодження. (Надав Баррі Варшау у bpo-31389.)

pdb командний рядок тепер приймає -m module_name як альтернативу файлу сценарію. (Надав Маріо Корчеро в bpo-32206.)

py_compile

py_compile.compile() – і за розширенням compileall – тепер поважає змінну середовища SOURCE_DATE_EPOCH шляхом безумовного створення файлів .pyc для перевірки на основі хешу. Це дозволяє гарантувати відтворювані збірки файлів .pyc, коли вони створюються з бажанням. (Надав Бернхард М. Відеманн у bpo-29708.)

pydoc

Сервер pydoc тепер може прив’язуватися до довільного імені хоста, визначеного новим аргументом командного рядка -n. (Надав Feanil Patel у bpo-31128.)

чергу

Новий клас SimpleQueue є необмеженою чергою FIFO. (Надав Антуан Пітру в bpo-14976.)

повторно

Прапори 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.)

The socket module now exposes the socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37), and socket.TCP_NOTSENT_LOWAT (Linux 3.12) constants. (Contributed by Omar Sandoval in bpo-26273 and Nathaniel J. Smith in bpo-29728.)

Support for socket.AF_VSOCK sockets has been added to allow communication between virtual machines and their hosts. (Contributed by Cathy Avery in bpo-27584.)

Тепер сокети за замовчуванням автоматично визначають сімейство, тип і протокол із файлового дескриптора. (Надав Крістіан Хеймс у bpo-28134.)

сокетсервер

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. Новий виняток містить додаткову інформацію. Перевірку імені хоста можна налаштувати за допомогою 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.)

Added ssl.SSLContext.post_handshake_auth to enable and ssl.SSLSocket.verify_client_post_handshake() to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in gh-78851.)

рядок

string.Template тепер дозволяє вам окремо змінювати шаблон регулярного виразу для заповнювачів у дужках і без дужок. (Надав Баррі Варшава в bpo-1198569.)

підпроцес

The subprocess.run() function accepts the new capture_output keyword argument. When true, stdout and stderr will be captured. This is equivalent to passing subprocess.PIPE as stdout and stderr arguments. (Contributed by Bo Bayles in 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.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): Identical to time.CLOCK_MONOTONIC, except it also includes any time that the system is suspended.

  • time.CLOCK_PROF (FreeBSD, NetBSD and OpenBSD): High-resolution per-process CPU timer.

  • time.CLOCK_UPTIME (FreeBSD, OpenBSD): Time whose absolute value is the time the system has been running and not suspended, providing accurate uptime measurement.

Нові функції 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

The internal unicodedata database has been upgraded to use Unicode 11. (Contributed by Benjamin Peterson.)

unittest

Новий параметр командного рядка -k command-line option allows filtering tests by a name substring or a Unix shell-like pattern. For example, python -m unittest -k foo runs foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo, but not bar_tests.FooTest.test_something. (Надав by Jonas Haag in bpo-32071.)

unittest.mock

Атрибути sentinel тепер зберігають свою ідентичність, коли їх скопіюють або маринують. (Надав Сергій Сторчака в bpo-20804.)

Нова функція seal() дозволяє запечатувати екземпляри Mock, що забороняє подальше створення макетів атрибутів. Печатка застосовується рекурсивно до всіх атрибутів, які самі по собі є макетами. (Надав Маріо Корчеро в bpo-30541.)

urllib.parse

urllib.parse.quote() було оновлено з RFC 2396 до RFC 3986, додавши ~ до набору символів, які за замовчуванням ніколи не беруться в лапки. (Надано Крістіаном Теуном і Ратнадіпом Дебнатом у bpo-16285.)

uu

Функція uu.encode() тепер приймає додатковий аргумент ключового слова backtick. Коли це істина, нулі представлені '`' замість пробілів. (Надав Xiang Zhang у bpo-30103.)

uuid

Новий атрибут UUID.is_safe передає інформацію з платформи про те, чи згенеровані UUID генеруються за допомогою багатопроцесорного безпечного методу. (Надав Баррі Варшау у bpo-22807.)

uuid.getnode() тепер надає перевагу універсально адміністрованим MAC-адресам над локально адміністрованими MAC-адресами. Це забезпечує кращу гарантію глобальної унікальності UUID, що повертається з uuid.uuid1(). Якщо доступні лише локально адміністровані MAC-адреси, повертається перша така знайдена. (Надав Баррі Варшау у bpo-32107.)

попередження

Ініціалізація стандартних фільтрів попереджень змінена таким чином:

  • попередження, увімкнені за допомогою параметрів командного рядка (включно з параметрами -b і новим параметром -X dev) завжди передаються механізму попереджень через атрибут sys.warnoptions.

  • фільтри попереджень, увімкнені через командний рядок або середовище, тепер мають такий порядок пріоритету:

    • фільтр BytesWarning для -b (або -bb)

    • будь-які фільтри, визначені параметром -W

    • будь-які фільтри, указані за допомогою змінної середовища PYTHONWARNINGS

    • будь-які інші спеціальні фільтри CPython (наприклад, фільтр за замовчуванням, доданий для нового режиму -X dev)

    • будь-які неявні фільтри, визначені безпосередньо механізмом попереджень

  • у CPython debug builds, усі попередження тепер відображаються за замовчуванням (неявний список фільтрів порожній)

(Надано Ніком Когланом і Віктором Стіннером у bpo-20361, bpo-32043 і bpo-32230.)

Попередження про застарілу знову відображаються за замовчуванням в однофайлових сценаріях та в інтерактивному запиті. Докладніше див. PEP 565: Показати DeprecationWarning у __main__. (Надав Нік Коглан у bpo-31975.)

xml

As mitigation against DTD and external entity retrieval, the xml.dom.minidom and xml.sax modules no longer process external entities by default. (Contributed by Christian Heimes in gh-61441.)

xml.etree

Предикати ElementPath в методах find() тепер можуть порівнювати текст поточного вузла з [. = "текст"], не тільки текст у дітей. Предикати також дозволяють додавати пробіли для кращої читабельності. (Надав Стефан Бенель у bpo-31648.)

xmlrpc.server

SimpleXMLRPCDispatcher.register_function тепер можна використовувати як декоратор. (Надав Xiang Zhang у bpo-7769.)

zipap

Функція create_archive() тепер приймає додатковий аргумент filter, щоб дозволити користувачеві вибрати, які файли слід включити в архів. (Надано Irmen de Jong у bpo-31072.)

Функція create_archive() тепер приймає додатковий аргумент compressed для створення стисненого архіву. Для підтримки стиснення також додано параметр командного рядка --compress. (Надав Zhiming Wang у bpo-31638.)

zip-файл

ZipFile тепер приймає новий параметр compresslevel для керування рівнем стиснення. (Надав Бо Бейлс у bpo-21417.)

Підкаталоги в архівах, створених ZipFile, тепер зберігаються в алфавітному порядку. (Надав Bernhard M. Wiedemann у bpo-30693.)

Зміни C API

Реалізовано новий API для локального зберігання потоків. Перегляньте PEP 539: новий C API для потокового локального зберігання для огляду та API для спеціального зберігання потоків (TSS). для повної довідки. (Надав Масаюкі Ямамото в bpo-25658.)

Нова функція контекстних змінних відкриває ряд нових API C.

Нова функція PyImport_GetModule() повертає попередньо імпортований модуль із вказаною назвою. (Надав Ерік Сноу в bpo-28411.)

Новий макрос Py_RETURN_RICHCOMPARE полегшує написання розширених функцій порівняння. (Надав Петро Вікторін у bpo-23699.)

Новий макрос Py_UNREACHABLE можна використовувати для позначення недоступних шляхів коду. (Надав Баррі Варшау у bpo-31338.)

tracemalloc тепер відкриває C API за допомогою нових функцій PyTraceMalloc_Track() і PyTraceMalloc_Untrack(). (Надав Віктор Стіннер у bpo-30054.)

Нові статичні маркери import__find__load__start() і import__find__load__done() можна використовувати для відстеження імпорту модуля. (Надав Крістіан Хеймс у bpo-31574.)

The fields name and doc of structures PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of type const char * rather of char *. (Contributed by Serhiy Storchaka in 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.

The type of results of PyThread_start_new_thread() and PyThread_get_thread_ident(), and the id parameter of PyThreadState_SetAsyncExc() changed from long to unsigned long. (Contributed by Serhiy Storchaka in bpo-6532.)

PyUnicode_AsWideCharString() now raises a ValueError if the second argument is NULL and the wchar_t* string contains null characters. (Contributed by Serhiy Storchaka in bpo-30708.)

Зміни в послідовності запуску та управлінні розподільниками динамічної пам’яті означають, що давно задокументована вимога виклику Py_Initialize() перед викликом більшості функцій C API тепер покладається більшою мірою, і її недотримання може призвести до segfaults у програмах для вбудовування. Додаткову інформацію див. у розділі Перенесення на Python 3.7 у цьому документі та розділі Перед ініціалізацією Python в документації C API.

Новий PyInterpreterState_GetID() повертає унікальний ідентифікатор для заданого інтерпретатора. (Надав Ерік Сноу в bpo-29102.)

Py_DecodeLocale(), Py_EncodeLocale() тепер використовують кодування UTF-8, коли ввімкнено режим UTF-8. (Надав Віктор Стіннер у bpo-29240.)

PyUnicode_DecodeLocaleAndSize() і PyUnicode_EncodeLocale() тепер використовують поточне кодування мови для обробника помилок surrogateescape. (Надав Віктор Стіннер у bpo-29240.)

Параметри start і end PyUnicode_FindChar() тепер налаштовані так, щоб поводитися як фрагменти рядків. (Надав Xiang Zhang у bpo-28822.)

Зміни збірки

Підтримку створення --without-threads видалено. Модуль threading тепер завжди доступний. (Надав Антуан Пітру в bpo-31370.).

Повна копія libffi більше не додається для використання під час створення модуля _ctypes на платформах UNIX, відмінних від OSX. Тепер для створення _ctypes на таких платформах потрібна встановлена копія libffi. (Надано Zachary Ware у bpo-27979.)

Процес збирання Windows більше не залежить від Subversion для залучення зовнішніх джерел, замість цього для завантаження zip-файлів із GitHub використовується сценарій Python. Якщо Python 3.6 не знайдено в системі (через py -3.6), NuGet використовується для завантаження копії 32-розрядної версії Python для цієї мети. (Надано Zachary Ware у bpo-30450.)

Для модуля ssl потрібен OpenSSL 1.0.2 або 1.1, сумісний libssl. Термін експлуатації OpenSSL 1.0.1 завершився 31 грудня 2016 року, тому він більше не підтримується. 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. (Надано Віктором Стіннером, INADA Naoki у 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.)

  • Накладні витрати на продуктивність асинхронного режиму налагодження зменшено. (Надав Антуан Пітру в 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, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)

date.fromordinal() і date.fromtimestamp() тепер на 30% швидше в звичайному регістрі. (Надав Пол Ганссле в bpo-32403.)

Функція os.fwalk() тепер у 2 рази швидша завдяки використанню os.scandir(). (Надав Сергій Сторчака в bpo-25996.)

Швидкість функції shutil.rmtree() покращено на 20–40% завдяки використанню функції os.scandir(). (Надав Сергій Сторчака в bpo-28564.)

Оптимізовано без урахування регістру зіставлення та пошук регулярних виразів. Тепер пошук деяких шаблонів може бути в 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)

Постійне згортання було перенесено з оптимізатора вічка в новий оптимізатор AST, який може виконувати оптимізацію більш послідовно. (Надано Євгеном Тодером та INADA Naoki у bpo-29469 та bpo-11549.)

Більшість функцій і методів у abc було переписано на C. Це робить створення абстрактних базових класів і виклик isinstance() і issubclass() на них у 1,5 рази швидшим. Це також скорочує час запуску Python до 10%. (Надано Іваном Левківським та INADA Naoki у bpo-31333)

Значні покращення швидкості альтернативних конструкторів для datetime.date і datetime.datetime завдяки використанню конструкторів швидкого шляху, коли не створюються підкласи. (Надав Пол Ганссле в bpo-32403)

Швидкість порівняння екземплярів array.array була значно покращена в деяких випадках. Тепер це від 10 до 70 разів швидше під час порівняння масивів, що містять значення одного цілого типу. (Надав Adrian Wielgosik у bpo-24700.)

Функції math.erf() і math.erfc() тепер використовують (швидшу) реалізацію бібліотеки C на більшості платформ. (Надав Сергій Сторчака в bpo-26121.)

Інші зміни в реалізації CPython

  • Trace hooks may now opt out of receiving the line and opt into receiving the opcode events from the interpreter by setting the corresponding new f_trace_lines and f_trace_opcodes attributes on the frame being traced. (Contributed by Nick Coghlan in bpo-31344.)

  • Виправлено деякі проблеми узгодженості з атрибутами модуля пакета простору імен. Об’єкти модуля простору імен тепер мають __file__, для якого встановлено значення None (раніше не було встановлено), а для їх __spec__.origin також встановлено значення None (раніше це був рядок " простір імен"). Див. bpo-32305. Крім того, об’єкт модуля простору імен __spec__.loader має те саме значення, що і __loader__ (раніше для першого було встановлено значення None). Див. bpo-32303.

  • Словник locals() тепер відображається в лексичному порядку, у якому були визначені змінні. Раніше порядок був невизначеним. (Надав Реймонд Геттінгер у bpo-32690.)

  • Команда distutils upload більше не намагається змінити символи кінця рядка CR на CRLF. Це вирішує проблему пошкодження sdists, які закінчуються байтом, еквівалентним CR. (Надав Бо Бейлс у bpo-32304.)

Застаріла поведінка Python

Вирази yield (як yield, так і yield from пункти) тепер застаріли у виразах розуміння та генераторі (окрім ітераційного виразу в крайньому лівому пункті for). Це гарантує, що розуміння завжди негайно повертатиме контейнер відповідного типу (замість потенційного повернення об’єкта 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

Підтримка для очікування екземплярів 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.)

перелік

У Python 3.8 спроба перевірити об’єкти, що не належать до Enum, у класах Enum викличе TypeError (наприклад, 1 in Color); аналогічно спроба перевірити об’єкти без прапорців у члені 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)

importlib.abc.ResourceLoader ABC застаріло на користь 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

sunau.openfp() визнано застарілим і буде видалено в Python 3.9. Замість цього використовуйте sunau.open(). (Надав Браян Кертін у bpo-31985.)

система

Застаріли sys.set_coroutine_wrapper() і sys.get_coroutine_wrapper().

Недокументована функція sys.callstats() застаріла та буде видалена в майбутній версії Python. (Надав Віктор Стіннер у bpo-28799.)

хвиля

wave.openfp() визнано застарілим і буде видалено в Python 3.9. Натомість використовуйте wave.open(). (Надав Браян Кертін у bpo-31985.)

Застарілі функції та типи C API

Функція 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-only locale) як альтернатива застарілому ASCII на основі C локалі.

  • OpenSSL 0.9.8 і 1.0.1 більше не підтримуються, що означає, що створення CPython 3.7 із підтримкою SSL/TLS на старіших платформах, які все ще використовують ці версії, потребує спеціальних параметрів збірки, які посилаються на новішу версію OpenSSL.

    Зокрема, ця проблема стосується дистрибутивів LTS Linux Debian 8 (він же «jessie») і Ubuntu 14.04 (він же «Trusty»), оскільки вони все ще використовують OpenSSL 1.0.1 за замовчуванням.

    Debian 9 («stretch») і Ubuntu 16.04 («xenial»), а також останні випуски інших версій LTS Linux (наприклад, RHEL/CentOS 7.5, SLES 12-SP3) використовують OpenSSL 1.0.2 або пізнішої версії та залишаються підтримуваними у конфігурації збірки за замовчуванням.

    CPython’s own CI configuration file provides an example of using the SSL compatibility testing infrastructure in CPython’s test suite to build and link against OpenSSL 1.1.0 rather than an outdated system provided OpenSSL.

Видалення API та функцій

З Python 3.7 видалено наступні функції та API:

  • Функцію 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.

  • The ntpath.splitunc() function was deprecated in Python 3.1, and has now been removed. Use splitdrive() instead.

  • collections.namedtuple() більше не підтримує параметр verbose або атрибут _source, який показував згенерований вихідний код для іменованого класу кортежу. Це було частиною оптимізації, спрямованої на прискорення створення класів. (Надано Jelle Zijlstra з подальшими вдосконаленнями INADA Naoki, Сергієм Сторчакою та Raymond Hettinger у bpo-28638.)

  • Функції bool(), float(), list() і tuple() більше не приймають аргументи ключових слів. Перший аргумент int() тепер можна передати лише як позиційний аргумент.

  • Вилучено раніше застарілі в Python 2.4 класи Plist, Dict і _InternalDict у модулі plistlib. Значення Dict у результатах функцій readPlist() і readPlistFromBytes() тепер є звичайними dicts. Ви більше не можете використовувати доступ до атрибутів для доступу до елементів цих словників.

  • Функцію 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, і він змінював Python ABI таким чином, що викликав неочікувану поломку розширень 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 є рядком. Раніше повертався порожній список. (Надано Sanyam Khurana в 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.)

  • The mode argument of os.makedirs() no longer affects the file permission bits of newly created intermediate-level directories. To set their file permission bits you can set the umask before invoking makedirs(). (Contributed by Serhiy Storchaka in 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 змінено, щоб включити ключові аргументи у вивід. (Надав Utkarsh Upadhyay у bpo-30302.)

  • Оскільки shutil.rmtree() тепер реалізовано за допомогою функції os.scandir(), вказаний користувачем обробник onerror тепер викликається з першим аргументом os.scandir замість os .listdir під час перерахування каталогу не вдається.

  • У майбутньому може бути додано підтримку вкладених наборів і операцій із наборами в регулярних виразах, як у Технічному стандарті Unicode #18. Це змінило б синтаксис. Для сприяння цій майбутній зміні FutureWarning на даний момент буде викликано у неоднозначних випадках. Це включає в себе набори, що починаються з літерала '[' або містять літеральні послідовності символів '--', '&&', '~~' і '| |'. Щоб уникнути попередження, екрануйте їх за допомогою зворотної косої риски. (Надав Сергій Сторчака в bpo-30349.)

  • Результат поділу рядка на регулярний вираз, який міг відповідати порожньому рядку, було змінено. Наприклад, розділення на r'\s*' тепер розділятиметься не лише на пробіли, як це було раніше, але також на порожні рядки перед усіма символами, які не є пробілами, і безпосередньо перед кінцем рядка. Попередню поведінку можна відновити, змінивши шаблон на r'\s+'. FutureWarning було видано для таких шаблонів, починаючи з Python 3.5.

    Для шаблонів, які відповідають як порожнім, так і непорожнім рядкам, результат пошуку всіх збігів також може бути змінений в інших випадках. Наприклад, у рядку '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“).

    (Надав Сергій Сторчака в bpo-25054 і bpo-32308.)

  • Змініть re.escape(), щоб екранувати лише спеціальні символи регулярних виразів замість екранування всіх символів, крім літер 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() були змінені на належні методи співпрограми відповідно до їх документації. Раніше ці методи повертали екземпляри 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() для обробки значень за замовчуванням, роблячи його поведінку узгодженою з рештою синтаксичного аналізатора. Нерядкові ключі та значення в словнику за замовчуванням тепер неявно перетворюються на рядки. (Надав Джеймс Токнелл у bpo-23835.)

  • Кілька незадокументованих внутрішніх імпортів було вилучено. Одним із прикладів є те, що os.errno більше не доступний; натомість використовуйте import errno безпосередньо. Зауважте, що такий незадокументований внутрішній імпорт може бути видалено будь-коли без попередження, навіть у випусках мікроверсій.

Зміни в C API

Функція 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

The file used to override sys.path is now called <python-executable>._pth instead of 'sys.path'. See Пошук модулів for more information. (Contributed by Steve Dower in bpo-28137.)

Інші зміни реалізації CPython

Готуючись до потенційних майбутніх змін у загальнодоступному API ініціалізації середовища виконання CPython (перегляньте PEP 432 для початкового, але дещо застарілого чернетки), внутрішню логіку запуску та керування конфігурацією CPython було значно перероблено. Хоча ці оновлення мають бути повністю прозорими як для програм для вбудовування, так і для користувачів звичайного CLI CPython, вони згадуються тут, оскільки рефакторинг змінює внутрішній порядок різних операцій під час запуску інтерпретатора, і, отже, може виявити раніше приховані дефекти, або у програмах для вбудовування або в самому CPython. (Спочатку створено Ніком Когланом і Еріком Сноу як частину bpo-22257, а потім оновлено Ніком, Еріком і Віктором Стіннером у ряді інших випусків). Впливають деякі відомі деталі:

  • PySys_AddWarnOptionUnicode() is not currently usable by embedding applications due to the requirement to create a Unicode object prior to calling Py_Initialize. Use PySys_AddWarnOption() instead.

  • фільтри попереджень, додані програмою для вбудовування за допомогою PySys_AddWarnOption(), тепер мають більш узгоджено мати перевагу над фільтрами за замовчуванням, установленими інтерпретатором

Через зміни в способі налаштування фільтрів попереджень за замовчуванням встановлення Py_BytesWarningFlag значення, більшого за одиницю, більше не є достатнім для видачі повідомлень BytesWarning і їх перетворення на винятки. Натомість потрібно встановити прапорець (щоб спершу видавати попередження) і додати явний фільтр попереджень error::BytesWarning, щоб перетворити їх на винятки.

У зв’язку зі зміною способу обробки рядків документації компілятором неявне «повернення None» у тілі функції, що складається виключно з рядка документації, тепер позначається як таке, що міститься в тому самому рядку, що й рядок документації, а не в рядку заголовка функції. .

Поточний винятковий стан було переміщено з об’єкта кадру до спільної процедури. Це спростило інтерпретатор і виправило кілька незрозумілих помилок, спричинених зміною виняткового стану під час входу або виходу з генератора. (Надав Марк Шеннон у 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 для змінних контексту було оновлено для використання покажчиків PyObject. Дивіться також bpo-34762.

У версії 3.7.1 модуль tokenize тепер неявно видає маркер NEWLINE, коли надходить із введенням, яке не має кінцевого нового рядка. Ця поведінка тепер відповідає внутрішнім функціям C tokenizer. (Надав Аммар Аскар у 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.)

Notable changes in Python 3.7.11

A security fix alters the ftplib.FTP behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a trust_server_pasv_ipv4_address attribute on your FTP instance to True. (See gh-87451)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline \n, \r and tab \t characters are stripped from the URL by the parser urllib.parse() preventing such attacks. The removal characters are controlled by a new module level variable urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (See gh-88048)

Notable security feature in 3.7.14

Converting between int and str in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a ValueError if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE-2020-10735. This limit can be configured or disabled by environment variable, command line flag, or sys APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.