Що нового в Python 3.5

Редактори

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

У цій статті пояснюється нові функції в Python 3.5 порівняно з 3.4. Python 3.5 було випущено 13 вересня 2015 року. Повний список змін див. у журналі змін.

Дивись також

PEP 478 - Графік випуску Python 3.5

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

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

  • PEP 492, співпрограми з синтаксисом async і await.

  • PEP 465, новий оператор множення матриці: a @ b.

  • PEP 448, додаткові узагальнення розпакування.

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

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

  • bytes % args, bytearray % args: PEP 461 – Додано форматування % до байтів і bytearray.

  • Нові методи bytes.hex(), bytearray.hex() і memoryview.hex(). (Надав Арнон Яарі в bpo-9951.)

  • memoryview тепер підтримує індексування кортежів (включаючи багатовимірне). (Надав Антуан Пітру в bpo-23632.)

  • Генератори мають новий атрибут gi_yieldfrom, який повертає об’єкт, який повторюється виразами yield from. (Надано Бенно Леслі та Юрієм Селівановим у bpo-24450.)

  • Новий виняток RecursionError тепер викликається, коли досягається максимальна глибина рекурсії. (Надав Георг Брандл у bpo-19235.)

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

  • Якщо локаль LC_TYPE є локаллю POSIX (C локаль), sys.stdin і sys.stdout тепер використовують surrogateescape обробник помилок замість строгого обробника помилок. (Надав Віктор Стіннер у bpo-19977.)

  • Файли .pyo більше не використовуються і були замінені більш гнучкою схемою, яка включає рівень оптимізації явно в назві .pyc. (Див. Огляд PEP 488.)

  • Вбудовані модулі та модулі розширення тепер ініціалізуються в багатофазному процесі, який подібний до того, як завантажуються модулі Python. (Див. Огляд PEP 489.)

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

Покращення безпеки:

  • SSLv3 тепер вимкнено в стандартній бібліотеці. Його все ще можна ввімкнути, створивши екземпляр ssl.SSLContext вручну. (Докладніше див. bpo-22638; цю зміну було перенесено до CPython 3.4 і 2.7.)

  • Синтаксичний аналіз файлів cookie HTTP тепер суворіший, щоб захистити від потенційних ін’єкційних атак. (Надав Антуан Пітру в bpo-22796.)

Покращення Windows:

  • Новий інсталятор для Windows замінив старий MSI. Перегляньте Використання Python у Windows для отримання додаткової інформації.

  • Збірки Windows тепер використовують Microsoft Visual C++ 14.0, і модулі розширення мають використовувати те саме.

Будь ласка, прочитайте повний список змін, які стосуються користувачів, включаючи багато інших менших покращень, оптимізацію CPython, застарілі та потенційні проблеми з перенесенням.

Нові можливості

PEP 492 – співпрограми з синтаксисом async і await

PEP 492 значно покращує підтримку асинхронного програмування в Python, додаючи очікувані об’єкти, функції співпрограми, асинхронну ітерацію та асинхронну контекст менеджери.

Функції співпрограми оголошено за допомогою нового синтаксису async def:

>>> async def coro():
...     return 'spam'

Усередині функції співпрограми новий вираз await можна використовувати для призупинення виконання співпрограми, доки не буде доступний результат. Будь-який об’єкт може бути очікуваним, якщо він реалізує протокол awaitable шляхом визначення методу __await__().

PEP 492 також додає оператор async for для зручної ітерації над асинхронними ітераціями.

Приклад елементарного клієнта HTTP, написаного з використанням нового синтаксису:

import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'', b''
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()

Подібно до асинхронної ітерації, існує новий синтаксис для менеджерів асинхронного контексту. Наступний сценарій:

import asyncio

async def coro(name, lock):
    print('coro {}: waiting for lock'.format(name))
    async with lock:
        print('coro {}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro {}: releasing the lock'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()

виведе:

coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock

Зауважте, що як async for, так і async with можна використовувати лише всередині функції співпрограми, оголошеної за допомогою async def.

Функції співпрограми призначені для виконання всередині сумісного циклу подій, такого як асинхронний цикл.

Примітка

Змінено в версії 3.5.2: Починаючи з CPython 3.5.2, __aiter__ може безпосередньо повертати асинхронні ітератори. Повернення об’єкта awaitable призведе до появи PendingDeprecationWarning.

Дивіться більше деталей у розділі документації Асинхронні ітератори.

Дивись також

PEP 492 – Співпрограми з синтаксисом async і await

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

PEP 465 – спеціальний інфіксний оператор для множення матриць

PEP 465 додає інфіксний оператор @ для множення матриць. Наразі жодні вбудовані типи Python не реалізують новий оператор, однак його можна реалізувати, визначивши __matmul__(), __rmatmul__() і __imatmul__() для звичайної, відображеної та на місці матриці множення. Семантика цих методів подібна до методів, що визначають інші інфіксні арифметичні оператори.

Матричне множення є досить поширеною операцією в багатьох галузях математики, науки, техніки, а додавання @ дозволяє писати чистіший код:

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

замість:

S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))

NumPy 1.10 підтримує новий оператор:

>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
array([ 1., 1., 1.])

Дивись також

PEP 465 – Спеціальний інфіксний оператор для множення матриць

PEP, написаний Натаніелем Дж. Смітом; реалізований Бенджаміном Петерсоном.

PEP 448 - Додаткові узагальнення розпакування

PEP 448 розширює дозволене використання оператора ітераційного розпакування * та оператора розпакування словника **. Тепер можна використовувати довільну кількість розпакувань у викликах функцій:

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

Так само відображення кортежів, списків, наборів і словників дозволяють багаторазове розпакування (див. Списки виразів і Відображення словника):

>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

Дивись також

PEP 448 – Додаткові узагальнення розпакування

PEP, написаний Джошуа Ландау; реалізували Ніл Ґірдхар, Томас Воутерс і Джошуа Ландау.

PEP 461 - підтримка відсоткового форматування для байтів і байтового масиву

PEP 461 додає підтримку для % оператора інтерполяції до bytes і bytearray.

Хоча інтерполяція зазвичай розглядається як рядкова операція, є випадки, коли інтерполяція на bytes або bytearrays має сенс, і робота, необхідна для компенсації цієї відсутньої функції, погіршує загальну читабельність коду. . Ця проблема особливо важлива при роботі з протоколами дротового формату, які часто є сумішшю двійкового та ASCII-сумісного тексту.

Приклади:

>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'

Юнікод не дозволяється для %b, але він приймається %a (еквівалент repr(obj).encode('ascii', 'backslashreplace'):

>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"

Зауважте, що типи перетворення %s і %r, хоча й підтримуються, слід використовувати лише в кодових базах, які потребують сумісності з Python 2.

Дивись також

PEP 461 – Додано форматування % до байтів і масиву байтів

PEP, написаний Ітаном Фурманом; реалізували Ніл Шеменауер та Ітан Фурман.

PEP 484 – Типові підказки

Синтаксис анотації функції є функцією Python з версії 3.0 (PEP 3107), однак семантика анотацій залишилася невизначеною.

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

PEP 484 представляє тимчасовий модуль, щоб надати ці стандартні визначення та інструменти, а також деякі умовності для ситуацій, коли анотації недоступні.

Наприклад, ось проста функція, чий аргумент і тип повернення оголошено в анотаціях:

def greeting(name: str) -> str:
    return 'Hello ' + name

Хоча ці анотації доступні під час виконання через звичайний атрибут __annotations__, автоматична перевірка типу не відбувається під час виконання. Натомість передбачається, що для аналізу вихідного коду на вимогу використовуватиметься окремий автономний засіб перевірки типу (наприклад, mypy).

Система типів підтримує об’єднання, загальні типи та спеціальний тип під назвою Any, який узгоджується з усіма типами (тобто призначається до них і від них).

Дивись також

  • документація модуля typing

  • PEP 484 – Підказки щодо типу

    PEP, написаний Гвідо ван Россумом, Юккою Лехтосало та Лукашем Лангою; реалізований Гвідо ван Россумом.

  • PEP 483 – Теорія підказок типів

    PEP, написаний Гвідо ван Россумом

PEP 471 — функція os.scandir() — кращий і швидший ітератор каталогу

PEP 471 додає нову функцію ітерації каталогу, os.scandir(), до стандартної бібліотеки. Крім того, os.walk() тепер реалізовано за допомогою scandir, що робить його в 3-5 разів швидшим у системах POSIX і в 7-20 разів швидшим у системах Windows. Це значною мірою досягається за рахунок значного зменшення кількості викликів os.stat(), необхідних для перегляду дерева каталогів.

Крім того, scandir повертає ітератор, на відміну від повернення списку імен файлів, що покращує ефективність пам’яті під час повторення дуже великих каталогів.

У наступному прикладі показано просте використання os.scandir() для відображення всіх файлів (за винятком каталогів) у заданому шляху, які не починаються з '.'. Виклик entry.is_file() зазвичай не виконує додаткових системних викликів:

for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)

Дивись також

PEP 471 – функція os.scandir() – кращий і швидший ітератор каталогу

PEP написаний і реалізований Беном Хойтом за допомогою Віктора Стіннера.

PEP 475: повторна спроба системних викликів, які не вдалися з EINTR

Код помилки errno.EINTR повертається щоразу, коли системний виклик, який очікує на введення/виведення, переривається сигналом. Раніше в таких випадках Python викликав InterruptedError. Це означало, що під час написання програми Python розробник мав два варіанти:

  1. Ігноруйте InterruptedError.

  2. Обробити InterruptedError і спробувати перезапустити перерваний системний виклик на кожному місці виклику.

Перший варіант призводить до періодичного збою програми. Другий варіант додає велику кількість шаблонів, що робить код майже нечитабельним. Порівняти:

print("Hello World")

і:

while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue

PEP 475 реалізує автоматичний повтор системних викликів на EINTR. Це знімає тягар роботи з EINTR або InterruptedError у коді користувача в більшості ситуацій і робить програми Python, включаючи стандартну бібліотеку, більш надійними. Зауважте, що повторна спроба системного виклику виконується, лише якщо обробник сигналу не викликає виняткової ситуації.

Нижче наведено список функцій, які зараз виконуються повторно, коли їх перериває сигнал:

Дивись також

PEP 475 – Повторити системні виклики, які не вдалися з EINTR

PEP та реалізація написані Шарлем-Франсуа Наталі та Віктором Стіннером за допомогою Антуана Пітру (французький зв’язок).

PEP 479: змініть обробку StopIteration всередині генераторів

Взаємодія генераторів і StopIteration в Python 3.4 і раніших версіях іноді була несподіваною і могла приховувати незрозумілі помилки. Раніше StopIteration, викликаний випадково у функції генератора, інтерпретувався як кінець ітерації конструкцією циклу, що керує генератором.

PEP 479 змінює поведінку генераторів: коли всередині генератора виникає виняткова ситуація StopIteration, вона замінюється на RuntimeError перед тим, як вийти з кадру генератора. Основна мета цієї зміни полягає в тому, щоб полегшити налагодження в ситуації, коли незахищений виклик next() викликає StopIteration і змушує ітерацію, керовану генератором, мовчки завершувати. Це особливо згубно в поєднанні з конструкцією вихід від.

Це зворотно несумісна зміна, тому, щоб увімкнути нову поведінку, потрібен імпорт __future__:

>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration

Без імпорту __future__ PendingDeprecationWarning буде викликано щоразу, коли всередині генератора буде викликано виключення StopIteration.

Дивись також

PEP 479 – Змінити обробку StopIteration всередині генераторів

PEP, написаний Крісом Анджеліко та Гвідо ван Россумом. Реалізували Кріс Анжеліко, Юрій Селіванов та Нік Коглан.

PEP 485: функція для перевірки приблизної рівності

PEP 485 додає функції math.isclose() і cmath.isclose(), які повідомляють, чи є два значення приблизно рівними або «близькими» одне до одного. Чи вважаються два значення близькими чи ні, визначається відповідно до заданих абсолютних і відносних допусків. Відносний допуск — це максимально дозволена різниця між аргументами isclose відносно більшого абсолютного значення:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False

Також можна порівняти два значення, використовуючи абсолютний допуск, який має бути невід’ємним значенням:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

Дивись також

PEP 485 – Функція для перевірки приблизної рівності

PEP, написаний Крістофером Баркером; реалізували Кріс Баркер і Тал Ейнат.

PEP 486: інформуйте програму запуску Python про віртуальні середовища

PEP 486 повідомляє програму запуску Windows (див. PEP 397) про активне віртуальне середовище. Якщо використовуватиметься інтерпретатор за замовчуванням і встановлено змінну середовища VIRTUAL_ENV, використовуватиметься інтерпретатор у віртуальному середовищі.

Дивись також

PEP 486 – Зробіть програму запуску Python інформованою про віртуальні середовища

PEP написаний і реалізований Полом Муром.

PEP 488: видалення файлів PYO

PEP 488 скасовує концепцію файлів .pyo. Це означає, що файли .pyc представляють як неоптимізований, так і оптимізований байт-код. Щоб уникнути необхідності постійного відновлення файлів байт-коду, файли .pyc тепер мають додатковий тег opt- у своїй назві, коли байт-код оптимізується. Побічним ефектом цього є відсутність зіткнень імен файлів байт-кодів під час роботи з -O або -OO. Отже, файли байт-коду, створені за допомогою -O і -OO, тепер можуть існувати одночасно. importlib.util.cache_from_source() має оновлений API, щоб допомогти з цією зміною.

Дивись також

PEP 488 – Видалення файлів PYO

PEP написаний і реалізований Бреттом Кенноном.

PEP 489: Ініціалізація багатофазного модуля розширення

PEP 489 оновлює ініціалізацію модуля розширення, щоб скористатися двоетапним механізмом завантаження модуля, представленим PEP 451 у Python 3.4.

Ця зміна наближає семантику імпорту модулів розширення, які вибирають використання нового механізму, до семантики вихідного коду Python і модулів байт-коду, включаючи можливість використовувати будь-який дійсний ідентифікатор як ім’я модуля, а не обмеження ASCII.

Дивись також

PEP 489 – Ініціалізація багатофазного модуля розширення

PEP, написаний Петром Вікторіним, Стефаном Бенелем і Ніком Когланом; реалізував Петро Вікторін.

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

Деякі менші зміни, внесені до основної мови Python:

  • Додано обробники помилок "namereplace". Обробники помилок "backslashreplace" тепер працюють з декодуванням і перекладом. (Надав Сергій Сторчака в bpo-19676 і bpo-22286.)

  • Параметр -b тепер впливає на порівняння bytes з int. (Надав Сергій Сторчака в bpo-23681.)

  • Нові казахські kz1048 і таджицькі koi8_t кодеки. (Надав Сергій Сторчака в bpo-22682 і bpo-22681.)

  • Документаційні рядки властивостей тепер доступні для запису. Це особливо корисно для рядків документів collections.namedtuple(). (Надано Berker Peksag у bpo-24064.)

  • Тепер підтримується циклічний імпорт із відносним імпортом. (Надано Бреттом Кенноном і Антуаном Пітру в bpo-17636.)

Нові модулі

введення тексту

Новий модуль typing provisional надає стандартні визначення та інструменти для анотацій типів функцій. Дивіться Підказки типу для отримання додаткової інформації.

zipap

Новий модуль zipapp (зазначений у PEP 441) надає API та інструмент командного рядка для створення виконуваних програм Python Zip, які були представлені в Python 2.6 у bpo-1739468, але які були не було широко розголошено ні в той час, ні після.

З новим модулем об’єднати вашу програму так само просто, як помістити всі файли, включно з файлом __main__.py, у каталог myapp і запустити:

$ python -m zipapp myapp
$ python myapp.pyz

Реалізацію модуля надав Пол Мур у bpo-23491.

Дивись також

PEP 441 – Покращення підтримки програм Python ZIP

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

argparse

Клас ArgumentParser тепер дозволяє вимкнути скорочене використання довгих параметрів, встановивши дозволити_скорочене значення False. (Надано Джонатаном По, Стівеном Бетардом, Полом j3 і Даніелем Ерікссоном у bpo-14910.)

asyncio

Оскільки модуль asyncio є тимчасовим, усі зміни, внесені в Python 3.5, також було перенесено до Python 3.4.x.

Помітні зміни в модулі asyncio з Python 3.4.0:

  • Нові API налагодження: методи loop.set_debug() і loop.get_debug(). (Надав Віктор Стіннер.)

  • Цикл подій proactor тепер підтримує SSL. (Надано Антуаном Пітру та Віктором Стіннером у bpo-22560.)

  • Новий метод loop.is_closed() для перевірки, чи замкнутий цикл подій. (Надав Віктор Стіннер у bpo-21326.)

  • Новий loop.create_task() для зручного створення та планування нового Task для співпрограми. Метод create_task також використовується всіма асинхронними функціями, які об’єднують співпрограми в завдання, наприклад asyncio.wait(), asyncio.gather() тощо (Надано Віктором Стіннером.)

  • Новий метод transport.get_write_buffer_limits() для запиту високих і низьких обмежень води для керування потоком. (Надав Віктор Стіннер.)

  • Функція async() застаріла на користь ensure_future(). (Уклав Юрій Селіванов.)

  • Нові методи loop.set_task_factory() і loop.get_task_factory() для налаштування фабрики завдань, яку використовує метод loop.create_task(). (Уклав Юрій Селіванов.)

  • Нові методи черги Queue.join() і Queue.task_done(). (Надав Віктор Стіннер.)

  • Клас JoinableQueue було видалено на користь класу asyncio.Queue. (Надав Віктор Стіннер.)

Оновлення в 3.5.1:

  • Функція ensure_future() і всі функції, які її використовують, такі як loop.run_until_complete(), тепер приймають усі типи awaitable об’єктів. (Уклав Юрій Селіванов.)

  • Нова функція run_coroutine_threadsafe() для надсилання співпрограм до циклів подій з інших потоків. (Надав Вінсент Мішель.)

  • Новий метод Transport.is_closing() для перевірки, закривається чи закривається транспорт. (Уклав Юрій Селіванов.)

  • Метод loop.create_server() тепер може приймати список хостів. (Надав Ян Сіно.)

Оновлення в 3.5.2:

  • Новий метод loop.create_future() для створення об’єктів Future. Це дозволяє альтернативним реалізаціям циклу подій, таким як uvloop, забезпечити швидшу реалізацію asyncio.Future. (Уклав Юрій Селіванов.)

  • Новий метод loop.get_exception_handler() для отримання поточного обробника винятків. (Уклав Юрій Селіванов.)

  • Новий метод StreamReader.readuntil() для читання даних із потоку, доки не з’явиться послідовність байтів-роздільників. (Надав Марк Коренберг.)

  • Методи loop.create_connection() і loop.create_server() оптимізовано, щоб уникнути виклику системної функції getaddrinfo, якщо адресу вже визначено. (Надав А. Джессі Джірю Девіс.)

  • loop.sock_connect(sock, address) більше не вимагає визначення адреси перед викликом. (Надав А. Джессі Джірю Девіс.)

bz2

Метод BZ2Decompressor.decompress тепер приймає додатковий аргумент max_length для обмеження максимального розміру розпакованих даних. (Надав Ніколаус Рат у bpo-15955.)

cgi

Клас FieldStorage тепер підтримує протокол context manager. (Надано Berker Peksag у bpo-20289.)

cmath

Нова функція isclose() надає спосіб перевірити приблизну рівність. (Надано Крісом Баркером і Тал Ейнатом у bpo-24270.)

код

Метод InteractiveInterpreter.showtraceback() тепер друкує повний ланцюжок трасування, як і інтерактивний інтерпретатор. (Надав Клаудіу Попа в bpo-17442.)

колекції

Клас OrderedDict тепер реалізовано в C, що робить його від 4 до 100 разів швидшим. (Надав Ерік Сноу в bpo-16991.)

OrderedDict.items(), OrderedDict.keys(), OrderedDict.values() представлення тепер підтримують reversed() ітерацію. (Надав Сергій Сторчака в bpo-19505.)

Клас deque тепер визначає index(), insert() і copy(), і підтримує оператори + і *. Це дозволяє розпізнавати двокомпонентні послідовності як MutableSequence і покращує їх замінність списками. (Надав Реймонд Геттінгер у bpo-23704.)

Рядки документів, створені namedtuple(), тепер можна оновлювати:

Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

(Надано Berker Peksag у bpo-24064.)

Клас UserString тепер реалізує __getnewargs__(), __rmod__(), casefold(), format_map(), isprintable(), і maketrans() методи для відповідності відповідним методам str. (Надав Джо Джевнік у bpo-22189.)

колекції.abc

Метод Sequence.index() тепер приймає аргументи start і stop для відповідності відповідним методам tuple, list тощо (надано Девіном Жанп’єром в bpo-23086.)

Новий Generator абстрактний базовий клас. (Надав Стефан Бенель у bpo-24018.)

Нові Awaitable, Coroutine, AsyncIterator і AsyncIterable анотація базові класи. (Надав Юрій Селіванов у bpo-24184.)

Для попередніх версій Python бекпорт нових ABC доступний у зовнішньому пакеті PyPI.

compileall

Нова опція compileall, -j N, дозволяє запускати N робочих процесів одночасно для виконання паралельної компіляції байт-коду. Функція compile_dir() має відповідний параметр workers. (Надав Клаудіу Попа в bpo-16104.)

Ще один новий параметр, -r, дозволяє контролювати максимальний рівень рекурсії для підкаталогів. (Надав Клаудіу Попа в bpo-19628.)

Параметр командного рядка -q тепер можна вказувати кілька разів, у цьому випадку всі виведення, включаючи помилки, будуть придушені. Відповідний параметр quiet у compile_dir(), compile_file() і compile_path() тепер може приймати ціле значення, що вказує на рівень виведення придушення. (Надав Томас Клюйвер у bpo-21338.)

concurrent.futures

Метод Executor.map() тепер приймає аргумент chunksize, щоб дозволити групування завдань для підвищення продуктивності, коли використовується ProcessPoolExecutor(). (Надав Ден О’Райлі в bpo-11271.)

Кількість робітників у конструкторі ThreadPoolExecutor тепер необов’язкова. Значення за замовчуванням у 5 разів перевищує кількість ЦП. (Надав Клаудіу Попа в bpo-21527.)

аналізатор конфігурації

configparser тепер надає можливість налаштувати перетворення значень, вказавши словник перетворювачів у конструкторі ConfigParser або визначивши їх як методи в підкласах ConfigParser. Конвертери, визначені в екземплярі аналізатора, успадковуються його проксі-серверами розділів.

Приклад:

>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']

(Надав Łukasz Langa в bpo-18159.)

contextlib

Новий redirect_stderr() context manager (схожий на redirect_stdout()) спрощує роботу сценаріїв утиліт з негнучкими API, які записують свій вихід до sys.stderr і не надає жодних опцій для його перенаправлення:

>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'

(Надано Berker Peksag у bpo-22389.)

csv

Метод writerow() тепер підтримує довільні ітерації, а не лише послідовності. (Надав Сергій Сторчака в bpo-23171.)

прокльони

Нова функція update_lines_cols() оновлює змінні середовища LINES і COLS. Це корисно для виявлення зміни розміру екрана вручну. (Надав Арнон Яарі в bpo-4254.)

dbm

dumb.open завжди створює нову базу даних, якщо прапорець має значення "n". (Надав Клаудіу Попа в bpo-18039.)

difflib

Набір символів HTML-документів, згенерованих HtmlDiff.make_file(), тепер можна налаштувати за допомогою нового аргументу charset, що містить лише ключове слово. Стандартний набір кодів HTML-документа змінено з "ISO-8859-1" на "utf-8". (Надано Berker Peksag у bpo-2052.)

Функція diff_bytes() тепер може порівнювати списки рядків байтів. Це виправляє регресію з Python 2. (Надано Terry J. Reedy і Greg Ward у bpo-17445.)

distutils

Обидві команди build і build_ext тепер приймають опцію -j, щоб увімкнути паралельне створення модулів розширення. (Надав Антуан Пітру в bpo-5309.)

Модуль distutils тепер підтримує стиснення xz, і його можна ввімкнути, передавши xztar як аргумент bdist --format. (Надав Сергій Сторчака в bpo-16314.)

doctest

Функція DocTestSuite() повертає порожній unittest.TestSuite, якщо module не містить рядків документації, замість того, щоб викликати ValueError. (Надав Гленн Джонс у bpo-15916.)

електронною поштою

Нова опція політики Policy.mangle_from_ контролює, чи додають генератори до рядків, які починаються з "From ", у тексті електронної пошти префікс ">". За замовчуванням для compat32 є True і False для всіх інших політик. (Надано Міланом Оберкірхом у bpo-20098.)

Новий метод Message.get_content_disposition() забезпечує легкий доступ до канонічного значення для заголовка Content-Disposition. (Надав Абхілаш Радж у bpo-21083.)

Для нового параметра політики EmailPolicy.utf8 можна встановити значення True для кодування заголовків електронної пошти за допомогою набору символів UTF-8 замість використання закодованих слів. Це дозволяє форматувати повідомлення відповідно до RFC 6532 і використовувати їх із сервером SMTP, який підтримує RFC 6531 розширення SMTPUTF8. (Надав Р. Девід Мюррей у bpo-24211.)

Конструктор mime.text.MIMEText тепер приймає екземпляр charset.Charset. (Надано Клодом Парозом і Беркером Пексагом у bpo-16324.)

enum

Викликаний Enum має новий параметр start для визначення початкової кількості значень переліку, якщо надано лише імена:

>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>

(Надав Ітан Фурман у bpo-21706.)

обробник помилок

Функції enable(), register(), dump_traceback() і dump_traceback_later() тепер приймають дескриптори файлів на додаток до file- як предмети. (Надав Вей Ву в bpo-23566.)

functools

Більшість механізмів lru_cache() тепер реалізовано на C, що робить його значно швидшим. (Надано Метом Джойнером, Олексієм Качаєвим і Сергієм Сторчакою в bpo-14373.)

глоб

Функції iglob() і glob() тепер підтримують рекурсивний пошук у підкаталогах за шаблоном "**". (Надав Сергій Сторчака в bpo-13968.)

gzip

Аргумент mode конструктора GzipFile тепер приймає "x" для запиту ексклюзивного створення. (Надав Тім Хіні в bpo-19222.)

heapq

Порівняння елементів у merge() тепер можна налаштувати, передавши key function в новий необов’язковий аргумент ключового слова key, а новий додатковий аргумент ключового слова reverse можна використовувати для зворотного порівняння елементів:

>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']

(Надав Реймонд Геттінгер у bpo-13742.)

http

Новий перелік HTTPStatus, який визначає набір кодів стану HTTP, фраз причин і довгих описів, написаних англійською мовою. (Надав Деміан Брехт у bpo-21793.)

http.client

HTTPConnection.getresponse() тепер викликає виняток RemoteDisconnected, коли з’єднання з віддаленим сервером неочікувано закривається. Крім того, якщо виникає ConnectionError (підкласом якого є RemoteDisconnected), клієнтський сокет тепер автоматично закривається та підключатиметься за наступним запитом:

import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass

(Надав Мартін Пантер у bpo-3566.)

idlelib і IDLE

Оскільки idlelib реалізує оболонку та редактор IDLE і не призначений для імпорту іншими програмами, він отримує покращення з кожним випуском. Дивіться Lib/idlelib/NEWS.txt для сукупного списку змін, внесених після версії 3.4.0, а також змін, внесених у майбутніх версіях 3.5.x. Цей файл також доступний у діалоговому вікні IDLE Довідка ‣ Про IDLE.

імапліб

Клас IMAP4 тепер підтримує протокол context manager. У разі використання в операторі with команда LOGOUT IMAP4 буде викликана автоматично в кінці блоку. (Надано Тареком Зіаде та Сергієм Сторчакою в bpo-4972.)

Модуль imaplib тепер підтримує RFC 5161 (розширення ENABLE) і RFC 6855 (підтримка UTF-8) через метод IMAP4.enable(). Новий атрибут IMAP4.utf8_enabled відстежує, чи ввімкнено підтримку RFC 6855. (Надано Міланом Оберкірхом, Р. Девідом Мюрреєм і Мацеєм Шуліком у bpo-21800.)

Модуль imaplib тепер автоматично кодує рядкові імена користувачів і паролі, відмінні від ASCII, за допомогою UTF-8, як рекомендовано RFC. (Надав Мілан Оберкірх у bpo-21800.)

imghdr

The what() function now recognizes the OpenEXR format (contributed by Martin Vignali and Claudiu Popa in bpo-20295), and the WebP format (contributed by Fabrice Aneche and Claudiu Popa in bpo-20197.)

importlib

Клас util.LazyLoader дозволяє відкладено завантажувати модулі в програмах, де важливий час запуску. (Надано Бреттом Кенноном у bpo-17621.)

Метод abc.InspectLoader.source_to_code() тепер є статичним методом. Це полегшує ініціалізацію об’єкта модуля кодом, скомпільованим із рядка, запустивши exec(code, module.__dict__). (Надано Бреттом Кенноном у bpo-21156.)

Нова функція util.module_from_spec() тепер є кращим способом створення нового модуля. На відміну від безпосереднього створення екземпляра types.ModuleType, ця нова функція встановлюватиме різні контрольовані імпортом атрибути на основі переданого специфікаційного об’єкта. (Надано Бреттом Кенноном у bpo-20383.)

оглядати

Обидва класи Signature і Parameter тепер можна вибирати та хешувати. (Надав Юрій Селіванов у bpo-20726 і bpo-20334.)

Новий метод BoundArguments.apply_defaults() забезпечує спосіб встановлення значень за замовчуванням для відсутніх аргументів:

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

(Надав Юрій Селіванов у bpo-24190.)

Новий метод класу Signature.from_callable() полегшує створення підкласів Signature. (Надано Юрієм Селівановим та Еріком Сноу в bpo-17373.)

Функція signature() тепер приймає необов’язковий аргумент ключового слова follow_wrapped, який, якщо встановлено значення False, вимикає автоматичне перехід за посиланнями __wrapped__. (Надав Юрій Селіванов у bpo-20691.)

Додано набір нових функцій для перевірки функцій співпрограми та об’єктів співпрограми: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals() і getcoroutinestate(). (Надав Юрій Селіванов у bpo-24017 та bpo-24400.)

Функції stack(), trace(), getouterframes() і getinnerframes() тепер повертають список іменованих кортежів. (Надав Даніель Шахаф у bpo-16808.)

io

Новий метод BufferedIOBase.readinto1(), який використовує не більше одного виклику базового необробленого потоку методів RawIOBase.read() або RawIOBase.readinto() a0c114382bc`922z0 . (Надав Ніколаус Рат у :issue:`20578().)

IP-адреса

Обидва класи IPv4Network і IPv6Network тепер приймають аргумент кортежу (адреса, маска мережі), щоб легко створювати мережеві об’єкти з існуючих адрес:

>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')

(Надано Пітером Муді та Антуаном Пітру в bpo-16531.)

Новий атрибут reverse_pointer для класів IPv4Network і IPv6Network повертає назву зворотного запису DNS PTR:

>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(Надав Леон Вебер у bpo-20480.)

json

Інтерфейс командного рядка json.tool тепер зберігає порядок ключів в об’єктах JSON, переданих у вхідних даних. Новий параметр --sort-keys можна використовувати для сортування ключів за алфавітом. (Надано Berker Peksag у bpo-21650.)

Декодер JSON тепер викликає JSONDecodeError замість ValueError, щоб надати кращу контекстну інформацію про помилку. (Надав Сергій Сторчака в bpo-19361.)

лінійний кеш

Нову функцію lazycache() можна використовувати для захоплення інформації про нефайловий модуль, щоб дозволити отримати його рядки пізніше через getline(). Це дозволяє уникнути введення/виведення, доки рядок дійсно не знадобиться, без необхідності носити глобальні модулі безкінечно. (Надав Роберт Коллінз у bpo-17911.)

локаль

Нову функцію delocalize() можна використовувати для перетворення рядка в нормалізований рядок чисел, враховуючи параметри LC_NUMERIC:

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'

(Надав Седрик Крієр у bpo-13918.)

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

Усі методи журналювання (Logger log(), exception(), critical(), debug() тощо), тепер приймають випадки винятків як аргумент exc_info на додаток до логічних значень і кортежів винятків:

>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception

(Надав Юрій Селіванов у bpo-20537.)

Клас handlers.HTTPHandler тепер приймає додатковий екземпляр ssl.SSLContext для налаштування параметрів SSL, які використовуються в HTTP-з’єднанні. (Надав Алекс Гейнор у bpo-22788.)

Клас handlers.QueueListener тепер приймає аргумент ключового слова respect_handler_level, який, якщо встановити значення True, передаватиме повідомлення обробникам з урахуванням рівнів обробників. (Надав Віней Саджип.)

lzma

Метод LZMADecompressor.decompress() тепер приймає додатковий аргумент max_length для обмеження максимального розміру розпакованих даних. (Надав Мартін Пантер у bpo-15955.)

математика

До модуля math додано дві нові константи: inf і nan. (Надав Марк Дікінсон у bpo-23185.)

Нова функція isclose() надає спосіб перевірити приблизну рівність. (Надано Крісом Баркером і Тал Ейнатом у bpo-24270.)

Додано нову функцію gcd(). Функція fractions.gcd() тепер застаріла. (Надано Марком Дікінсоном і Сергієм Сторчакою в bpo-22486.)

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

sharedctypes.synchronized() об’єкти тепер підтримують протокол context manager. (Надав Шарль-Франсуа Наталі в bpo-21565.)

оператор

Об’єкти attrgetter(), itemgetter() і methodcaller() тепер підтримують травлення. (Надано Джошем Розенбергом і Сергієм Сторчакою в bpo-22955.)

Нові функції matmul() і imatmul() для виконання множення матриць. (Надав Бенджамін Петерсон у bpo-21176.)

ос

Додано нову функцію scandir(), яка повертає ітератор об’єктів DirEntry. Якщо можливо, scandir() витягує атрибути файлів під час сканування каталогу, усуваючи необхідність виконувати наступні системні виклики для визначення типу файлу або атрибутів, що може значно покращити продуктивність. (Надано Беном Хойтом за допомогою Віктора Стіннера в bpo-22524.)

У Windows тепер доступний новий атрибут stat_result.st_file_attributes. Він відповідає члену dwFileAttributes структури BY_HANDLE_FILE_INFORMATION, яку повертає GetFileInformationByHandle(). (Надав Бен Хойт у bpo-21719.)

Функція urandom() тепер використовує системний виклик getrandom() у Linux 3.17 або новіших версіях і getentropy() в OpenBSD 5.6 і новіших версіях, усуваючи необхідність використовувати / dev/urandom та уникнення збоїв через потенційне вичерпання дескриптора файлу. (Надав Віктор Стіннер у bpo-22181.)

Нові функції get_blocking() і set_blocking() дозволяють отримати та встановити режим блокування дескриптора файлу (O_NONBLOCK.) (Надано Віктором Стіннером у bpo-22054.)

Функції truncate() і ftruncate() тепер підтримуються в Windows. (Надав Стів Дауер у bpo-23668.)

Існує нова функція os.path.commonpath(), яка повертає найдовший загальний підшлях кожного переданого шляху. На відміну від функції os.path.commonprefix(), вона завжди повертає дійсний шлях:

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

(Надано Рафіком Драуї та Сергієм Сторчакою в bpo-10395.)

pathlib

Новий метод Path.samefile() можна використовувати, щоб перевірити, чи шлях вказує на той самий файл, що й інший шлях, який може бути іншим об’єктом Path або рядком

>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True

(Надано Vajrasky Kok і Antoine Pitrou у bpo-19775.)

Метод Path.mkdir() тепер приймає новий необов’язковий аргумент exist_ok для відповідності mkdir -p і функції os.makedirs(). (Надано Berker Peksag у bpo-21539.)

Існує новий метод Path.expanduser() для розширення префіксів ~ і ~user. (Надано Сергієм Сторчакою та Клаудіу Попою в bpo-19776.)

Новий метод класу Path.home() можна використовувати для отримання екземпляра Path, який представляє домашній каталог користувача. (Надано Віктором Сальгадо та Маянком Тріпаті в bpo-19777.)

Нові методи Path.write_text(), Path.read_text(), Path.write_bytes(), Path.read_bytes() для спрощення операцій читання/запису файлів.

Наступний фрагмент коду створить або перепише існуючий файл ~/spam42:

>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3

(Надав Крістофер Велборн у bpo-20218.)

маринований огірок

Вкладені об’єкти, такі як незв’язані методи чи вкладені класи, тепер можна вибирати за допомогою протоколів pickle, старших за протокол версії 4. Протокол версії 4 уже підтримує ці випадки. (Надав Сергій Сторчака в bpo-23611.)

попліб

Нова команда POP3.utf8() вмикає підтримку RFC 6856 (інтернаціоналізованої електронної пошти), якщо це підтримує POP-сервер. (Надано Milan OberKirch у bpo-21804.)

повторно

Посилання та умовні посилання на групи з фіксованою довжиною тепер дозволені в ретроспективних твердженнях:

>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>

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

Кількість груп захоплення в регулярних виразах більше не обмежується 100. (Надано Сергієм Сторчакою в bpo-22437.)

Функції sub() і subn() тепер замінюють невідповідні групи порожніми рядками замість того, щоб викликати виключення. (Надав Сергій Сторчака в bpo-1519638.)

Винятки re.error мають нові атрибути, msg, pattern, pos, lineno і colno, які надають кращу контекстну інформацію про помилку:

>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)

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

readline

Нову функцію append_history_file() можна використовувати для додавання вказаної кількості кінцевих елементів в історії до даного файлу. (Надав Бруно Кауе в bpo-22940.)

селектори

Новий DevpollSelector підтримує ефективне опитування /dev/poll у Solaris. (Надав Джампаоло Родола в bpo-18931.)

шутил

Функція move() тепер приймає аргумент copy_function, що дозволяє, наприклад, використовувати функцію copy() замість стандартного copy2() якщо необхідно ігнорувати метадані файлу під час переміщення. (Надав Клаудіу Попа в bpo-19840.)

Функція make_archive() тепер підтримує формат xztar. (Надав Сергій Сторчака в bpo-5411.)

сигнал

У Windows функція set_wakeup_fd() тепер також підтримує дескриптори сокетів. (Надав Віктор Стіннер у bpo-22018.)

Різні константи SIG* в модулі signal були перетворені в Enums. Це дозволяє друкувати осмислені імена під час налагодження замість цілих «магічних чисел». (Надав Джампаоло Родола в bpo-21076.)

smtpd

Обидва класи SMTPServer і SMTPChannel тепер приймають аргумент ключового слова decode_data, щоб визначити, чи частина DATA транзакції SMTP декодується за допомогою кодек "utf-8" або замість цього надається методу SMTPServer.process_message() як рядок байтів. За замовчуванням встановлено True з міркувань зворотної сумісності, але зміниться на False у Python 3.6. Якщо decode_data має значення False, метод process_message має бути готовий приймати аргументи ключового слова. (Надав Мацей Шулік у bpo-19662.)

Клас SMTPServer тепер рекламує розширення 8BITMIME (RFC 6152), якщо для decode_data встановлено True. Якщо клієнт вказує BODY=8BITMIME у команді MAIL, вона передається до SMTPServer.process_message() через ключове слово mail_options. (Надано Міланом Оберкірхом і Р. Девідом Мюрреєм у bpo-21795.)

Клас SMTPServer тепер також підтримує розширення SMTPUTF8 (RFC 6531: інтернаціоналізована електронна пошта). Якщо клієнт вказав SMTPUTF8 BODY=8BITMIME у команді MAIL, вони передаються до SMTPServer.process_message() через ключове слово mail_options. Метод process_message відповідає за правильну обробку даних SMTPUTF8. (Надав Мілан Оберкірх у bpo-21725.)

Тепер можна надати, безпосередньо або через розпізнавання імен, IPv6-адреси в конструкторі SMTPServer і забезпечити його успішне підключення. (Надав Мілан Оберкірх у bpo-14758.)

smtplib

Новий метод SMTP.auth() забезпечує зручний спосіб реалізації спеціальних механізмів автентифікації. (Надав Мілан Оберкірх у bpo-15014.)

Метод SMTP.set_debuglevel() тепер приймає додатковий рівень налагодження (2), який умикає мітки часу в повідомленнях налагодження. (Надано Гевіном Чаппеллом і Мацеєм Шуліком у bpo-16914.)

Обидва методи SMTP.sendmail() і SMTP.send_message() тепер підтримують RFC 6531 (SMTPUTF8). (Надано Міланом Оберкірхом і Р. Девідом Мюрреєм у bpo-22027.)

sndhdr

Функції what() і whathdr() тепер повертають namedtuple(). (Надав Клаудіу Попа в bpo-18615.)

гніздо

Функції з тайм-аутами тепер використовують монотонний годинник замість системного. (Надав Віктор Стіннер у bpo-22043.)

Новий метод socket.sendfile() дозволяє надсилати файл через сокет за допомогою високопродуктивної функції os.sendfile() в UNIX, що призводить до завантаження в 2-3 рази швидше, ніж при використанні простого socket.send(). (Надав Джампаоло Родола в bpo-17552.)

Метод socket.sendall() більше не скидає тайм-аут сокета кожного разу, коли байти надходять або надсилаються. Час очікування сокета тепер є максимальною загальною тривалістю надсилання всіх даних. (Надав Віктор Стіннер у bpo-23853.)

Аргумент backlog методу socket.listen() тепер необов’язковий. За замовчуванням встановлено SOMAXCONN або 128, залежно від того, що менше. (Надав Шарль-Франсуа Наталі в bpo-21455.)

ssl

Підтримка BIO пам’яті

(Надав Герт Янсен у bpo-21965.)

Новий клас SSLObject було додано, щоб забезпечити підтримку протоколу SSL у випадках, коли можливості мережевого вводу/виводу SSLSocket не потрібні або неоптимальні. SSLObject представляє екземпляр протоколу SSL, але не реалізує жодних мережевих методів вводу/виводу, натомість надає інтерфейс буфера пам’яті. Новий клас MemoryBIO можна використовувати для передачі даних між Python і екземпляром протоколу SSL.

Підтримка SSL BIO пам’яті в першу чергу призначена для використання в структурах, що реалізують асинхронний ввід-вивід, для яких модель готовності SSLSocket («вибір/опитування») неефективна.

Новий метод SSLContext.wrap_bio() можна використати для створення нового екземпляра SSLObject.

Підтримка узгодження протоколу прикладного рівня

(Надав Бенджамін Петерсон у bpo-20188.)

Там, де є підтримка OpenSSL, модуль ssl тепер реалізує розширення TLS Application-Layer Protocol Negotiation, як описано в RFC 7301.

Новий SSLContext.set_alpn_protocols() можна використовувати, щоб вказати, які протоколи сокет має оголосити під час рукостискання TLS.

Новий SSLSocket.selected_alpn_protocol() повертає протокол, який було вибрано під час рукостискання TLS. Прапор HAS_ALPN вказує на наявність підтримки ALPN.

Інші зміни

Існує новий метод SSLSocket.version() для запиту фактичної версії протоколу, що використовується. (Надав Антуан Пітру в bpo-20421.)

Клас SSLSocket тепер реалізує метод SSLSocket.sendfile(). (Надав Джампаоло Родола в bpo-17552.)

Метод SSLSocket.send() тепер викликає виняток ssl.SSLWantReadError або ssl.SSLWantWriteError у неблокуючому сокеті, якщо операція буде заблокована. Раніше він повертав 0. (Надав Ніколаус Рат у bpo-20951.)

Функція cert_time_to_seconds() тепер інтерпретує введений час як UTC, а не як місцевий час відповідно до RFC 5280. Крім того, повертається значення завжди int. (Надав Акіра Лі в bpo-19940.)

Нові методи SSLObject.shared_ciphers() і SSLSocket.shared_ciphers() повертають список шифрів, надісланих клієнтом під час рукостискання. (Надав Бенджамін Петерсон у bpo-23186.)

Методи SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown(), and SSLSocket.write() класу SSLSocket більше не скидає тайм-аут сокета кожного разу, коли байти надходять або надсилаються. Час очікування сокета тепер є максимальною загальною тривалістю методу. (Надав Віктор Стіннер у bpo-23853.)

Функція match_hostname() тепер підтримує зіставлення IP-адрес. (Надав Антуан Пітру в bpo-23239.)

sqlite3

Клас Row тепер повністю підтримує протокол послідовності, зокрема reversed() ітерацію та індексування фрагментів. (Надано Клаудіу Попою в bpo-10203; Лукасом Сінклером, Джесікою Маккеллар і Сергієм Сторчакою в bpo-13583.)

підпроцес

Додано нову функцію run(). Він виконує вказану команду та повертає об’єкт CompletedProcess, який описує завершений процес. Новий API є більш послідовним і є рекомендованим підходом до виклику підпроцесів у коді Python, якому не потрібно підтримувати сумісність із попередніми версіями Python. (Надав Томас Клюйвер у bpo-23342.)

Приклади:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

система

Нова функція set_coroutine_wrapper() дозволяє встановити глобальний хук, який буде викликатися щоразу, коли об’єкт coroutine створюється функцією async def. Відповідний get_coroutine_wrapper() можна використовувати для отримання поточної встановленої оболонки. Обидві функції є тимчасовими і призначені лише для цілей налагодження. (Надав Юрій Селіванов у bpo-24017.)

Нову функцію is_finalizing() можна використати, щоб перевірити, чи інтерпретатор Python вимикає. (Надав Антуан Пітру в bpo-22696.)

sysconfig

Назва каталогу сценаріїв користувача в Windows тепер включає перші два компоненти версії Python. (Надав Пол Мур у bpo-23437.)

tarfile

Аргумент mode функції open() тепер приймає "x" для запиту ексклюзивного створення. (Надано Berker Peksag у bpo-21717.)

Методи TarFile.extractall() і TarFile.extract() тепер приймають аргумент ключового слова numeric_owner. Якщо встановлено значення True, витягнуті файли та каталоги будуть належати числовим uid і gid з tarfile. Якщо встановлено значення False (за умовчанням і поведінка у версіях до 3.5), вони належатимуть вказаному користувачеві та групі в tar-файлі. (Надано Майклом Фогтом і Еріком Смітом у bpo-23193.)

TarFile.list() тепер приймає необов’язковий аргумент ключового слова members, який можна встановити як підмножину списку, який повертає TarFile.getmembers(). (Надав Сергій Сторчака в bpo-21549.)

різьблення

Обидва методи Lock.acquire() і RLock.acquire() тепер використовують монотонний годинник для керування часом очікування. (Надав Віктор Стіннер у bpo-22043.)

час

Функція monotonic() тепер доступна завжди. (Надав Віктор Стіннер у bpo-22043.)

timeit

Новий параметр командного рядка -u або --unit=U можна використовувати для визначення одиниці часу для виведення таймером. Підтримувані параметри: usec, msec або sec. (Надав Джуліан Гінді в bpo-18983.)

Функція timeit() має новий параметр globals для визначення простору імен, у якому виконуватиметься код. (Надав Бен Робертс у bpo-2527.)

tkinter

Модуль tkinter._fix, який використовувався для налаштування середовища Tcl/Tk у Windows, було замінено на приватну функцію в модулі _tkinter, яка не вносить постійних змін до змінних середовища. (Надано Zachary Ware у bpo-20035.)

простежити

Нові функції walk_stack() і walk_tb() для зручного перегляду кадрів і об’єктів трасування. (Надав Роберт Коллінз у bpo-17911.)

Нові спрощені класи: TracebackException, StackSummary і FrameSummary. (Надав Роберт Коллінз у bpo-17911.)

Функції print_tb() і print_stack() тепер підтримують від’ємні значення для аргументу limit. (Надав Дмитро Казаков у bpo-22619.)

види

Нова функція coroutine() для перетворення об’єктів generator і generator-like в awaitables. (Надав Юрій Селіванов у bpo-24017.)

Новий тип під назвою CoroutineType, який використовується для об’єктів coroutine, створених функціями async def. (Надав Юрій Селіванов у bpo-24400.)

unicodedata

The unicodedata module now uses data from Unicode 8.0.0.

unittest

Метод TestLoader.loadTestsFromModule() тепер приймає аргумент pattern лише з ключовим словом, який передається в load_tests як третій аргумент. Знайдені пакунки тепер перевіряються на load_tests незалежно від того, чи відповідає їхній шлях шаблону, оскільки назва пакета не може відповідати шаблону за замовчуванням. (Надано Робертом Коллінзом і Баррі А. Варшавою в bpo-16662.)

Помилки виявлення Unittest тепер виявляються в атрибуті TestLoader.errors екземпляра TestLoader. (Надано Робертом Коллінзом у bpo-19746.)

Новий параметр командного рядка --locals для відображення локальних змінних у відстеженнях. (Надав Роберт Коллінз у bpo-22936.)

unittest.mock

Клас Mock має наступні покращення:

  • Конструктор класу має новий параметр unsafe, який змушує фіктивні об’єкти викликати помилку AttributeError для імен атрибутів, що починаються з "assert". (Надав Кушал Дас у bpo-21238.)

  • Новий метод Mock.assert_not_ called() для перевірки, чи був викликаний макетний об’єкт. (Надав Кушал Дас у bpo-21262.)

Клас MagicMock тепер підтримує оператори __truediv__(), __divmod__() і __matmul__(). (Надано Йоханнесом Байтером у bpo-20968 та Хоканом Льовдалем у bpo-23581 та bpo-23568.)

Більше не потрібно явно передавати create=True функції patch() під час виправлення вбудованих імен. (Надав Кушал Дас у bpo-17660.)

urllib

Новий клас request.HTTPPasswordMgrWithPriorAuth дозволяє керувати обліковими даними базової автентифікації HTTP, щоб усунути непотрібну обробку відповіді 401 або безумовно надсилати облікові дані на перший запит для зв’язку з серверами, які повертають відповідь 404 замість 401, якщо заголовок Authorization не надіслано. (Надано Матеєм Чеплем у bpo-19494 та Akshit Khurana у bpo-7159.)

Новий аргумент quote_via для функції parse.urlencode() забезпечує спосіб керування кодуванням частин запиту, якщо це необхідно. (Надано Samwyse та Arnon Yaari у bpo-13866.)

Функція request.urlopen() приймає об’єкт ssl.SSLContext як аргумент context, який використовуватиметься для з’єднання HTTPS. (Надав Алекс Гейнор у bpo-22366.)

parse.urljoin() було оновлено, щоб використовувати семантику RFC 3986 для розділення відносних URL-адрес замість RFC 1808 і RFC 2396. (Надано Деміаном Брехтом і Сентилом Кумараном у bpo-22118.)

wsgiref

Аргумент headers конструктора класу headers.Headers тепер необов’язковий. (Надано Пабло Торресом Наваррете та SilentGhost у bpo-5800.)

xmlrpc

Клас client.ServerProxy тепер підтримує протокол context manager. (Надав Клаудіу Попа в bpo-20627.)

Конструктор client.ServerProxy тепер приймає додатковий екземпляр ssl.SSLContext. (Надав Алекс Гейнор у bpo-22960.)

xml.sax

Синтаксичні аналізатори SAX тепер підтримують потік символів об’єкта xmlreader.InputSource. (Надав Сергій Сторчака в bpo-2175.)

parseString() тепер приймає екземпляр str. (Надав Сергій Сторчака в bpo-10590.)

zip-файл

Вихідний файл ZIP тепер можна записувати в потоки, які неможливо шукати. (Надав Сергій Сторчака в bpo-23252.)

Аргумент mode методу ZipFile.open() тепер приймає "x" для запиту ексклюзивного створення. (Надав Сергій Сторчака в bpo-21717.)

Інші зміни на рівні модуля

Багато функцій у модулях mmap, ossaudiodev, socket, ssl і codecs тепер можуть записувати байт-подібно об’єкти. (Надав Сергій Сторчака в bpo-23001.)

Оптимізації

Функцію os.walk() було прискорено в 3-5 разів на системах POSIX і в 7-20 разів на Windows. Це було зроблено за допомогою нової функції os.scandir(), яка відкриває інформацію про файл із базових системних викликів readdir або FindFirstFile/FindNextFile. (Надано Беном Хойтом за допомогою Віктора Стіннера в bpo-23605.)

Створення bytes(int) (заповненого нульовими байтами) відбувається швидше та використовує менше пам’яті для великих об’єктів. calloc() використовується замість malloc() для виділення пам’яті для цих об’єктів. (Надав Віктор Стіннер у bpo-21233.)

Деякі операції в ipaddress IPv4Network і IPv6Network були значно прискорені, наприклад subnets(), supernet(), summarize_address_range(), collapse_addresses(). Прискорення може бути від 3 до 15 разів. (Надано Антуаном Пітру, Мішелем Альбертом і Маркусом у bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

Видалення об’єктів ipaddress було оптимізовано для отримання значно менших результатів. (Надав Сергій Сторчака в bpo-23133.)

Багато операцій на io.BytesIO тепер на 50% до 100% швидше. (Надано Сергієм Сторчакою у bpo-15381 та Девідом Вілсоном у bpo-22003.)

Функція marshal.dumps() тепер працює швидше: 65–85% з версіями 3 і 4, 20–25% з версіями 0-2 на типових даних і до 5 разів у найкращих випадках. (Надав Сергій Сторчака в bpo-20416 і bpo-23344.)

Кодер UTF-32 тепер у 3-7 разів швидший. (Надав Сергій Сторчака в bpo-15027.)

Регулярні вирази тепер аналізуються на 10% швидше. (Надав Сергій Сторчака в bpo-19380.)

Функцію json.dumps() було оптимізовано для роботи з ensure_ascii=False так само швидко, як і з ensure_ascii=True. (Надав Наокі Інада в bpo-23206.)

Функції PyObject_IsInstance() і PyObject_IsSubclass() було пришвидшено у типовому випадку, коли другий аргумент має type як метаклас. (Надав Георг Брандл у bpo-22540.)

Кешування методів було дещо покращено, що дало підвищення продуктивності на 5% у деяких тестах. (Надав Антуан Пітру в bpo-22847.)

Об’єкти з модуля random тепер використовують на 50% менше пам’яті в 64-розрядних версіях. (Надав Сергій Сторчака в bpo-23488.)

Виклики методу отримання property() на 25% швидші. (Надав Джо Джевнік у bpo-23910.)

Створення екземпляра fractions.Fraction тепер на 30% швидше. (Надав Стефан Бенель у bpo-22464.)

Рядкові методи find(), rfind(), split(), partition() та рядок in тепер значно швидше для пошуку підрядків з 1 символу. (Надав Сергій Сторчака в bpo-23573.)

Зміни збірки та C API

Додано нові функції callloc:

(Надав Віктор Стіннер у bpo-21233.)

Нові допоміжні функції кодування/декодування:

(Надав Віктор Стіннер у bpo-18395.)

Нова функція PyCodec_NameReplaceErrors() замінює помилку кодування Unicode на \N{...}. (Надав Сергій Сторчака в bpo-19676.)

Нова функція PyErr_FormatV(), подібна до PyErr_Format(), але приймає аргумент va_list. (Надав Антуан Пітру в bpo-18711.)

Новий виняток PyExc_RecursionError. (Надав Георг Брандл у bpo-19235.)

Нові функції PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2() і PyModule_ExecDef(), представлені PEP 489 – багатофазова ініціалізація модуля розширення. (Надав Петро Вікторін у bpo-24268.)

Нові функції PyNumber_MatrixMultiply() і PyNumber_InPlaceMatrixMultiply() для виконання множення матриць. (Надано Бенджаміном Петерсоном у bpo-21176. Докладніше див. також PEP 465.)

Слот PyTypeObject.tp_finalize тепер є частиною стабільного ABI.

Для збірок Windows тепер потрібен Microsoft Visual C++ 14.0, який доступний як частина Visual Studio 2015.

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

  • У Linux імена файлів модулів розширення закінчуються на .cpython- <major> <minor> m- <architecture> - <os> .pyd:

    • <major> - головний номер версії Python; для Python 3.5 це 3.

    • <minor> є другорядним номером версії Python; для Python 3.5 це 5.

    • <architecture> - це апаратна архітектура, для роботи на якій створено модуль розширення. Найчастіше це i386 для 32-розрядних платформ Intel або x86_64 для 64-розрядних платформ Intel (і AMD).

    • <os> завжди linux-gnu, за винятком розширень, створених для спілкування з 32-розрядним ABI на 64-розрядних платформах, у цьому випадку це linux-gnu32<architecture> буде x86_64).

  • У Windows назви файлів модулів розширення закінчуються на <debug> .cp <major> <minor> - <platform> .pyd:

    • <major> - головний номер версії Python; для Python 3.5 це 3.

    • <minor> є другорядним номером версії Python; для Python 3.5 це 5.

    • <platform> — це платформа, для якої створено модуль розширення, або win32 для Win32, win_amd64 для Win64, win_ia64 для Windows Itanium 64 і win_arm для Windows на ARM.

    • Якщо створено в режимі налагодження, <debug> буде _d, інакше він буде порожнім.

  • На платформах OS X імена файлів модулів розширення тепер закінчуються на -darwin.so.

  • На всіх інших платформах імена файлів модулів розширення такі ж, як і в Python 3.4.

Застаріле

Нові ключові слова

async і await не рекомендується використовувати як імена змінних, класів, функцій або модулів. Представлені PEP 492 у Python 3.5, вони стануть правильними ключовими словами в Python 3.7.

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

Викликання винятку StopIteration всередині генератора тепер генеруватиме мовчазне PendingDeprecationWarning, яке стане немовчазним попередженням про застаріння в Python 3.6 і викличе RuntimeError у Python 3.7. Перегляньте PEP 479: Змініть обробку StopIteration всередині генераторів для деталей.

Непідтримувані операційні системи

Windows XP більше не підтримується корпорацією Майкрософт, тому, відповідно до PEP 11, CPython 3.5 більше не офіційно підтримується в цій ОС.

Застарілі модулі, функції та методи Python

Модуль formatter тепер повністю припинено, і його все ще планується видалити в Python 3.6.

Функція asyncio.async() застаріла на користь ensure_future().

Модуль smtpd раніше завжди декодував частину DATA повідомлень електронної пошти за допомогою кодека utf-8. Тепер цим можна керувати за допомогою нового ключового слова decode_data для SMTPServer. Значенням за замовчуванням є True, але це за замовчуванням застаріло. Укажіть ключове слово decode_data з відповідним значенням, щоб уникнути попередження про застаріле.

Пряме призначення значень key, value і coded_value Об’єкти http.cookies.Morsel застаріли. Натомість використовуйте метод set(). Крім того, незадокументований параметр LegalChars set() застарів і тепер ігнорується.

Передача рядка формату як аргументу ключового слова format_string у метод format() класу string.Formatter застаріла. (Надав Сергій Сторчака в bpo-23671.)

Функції platform.dist() і platform.linux_distribution() тепер застаріли. У дистрибутивах Linux використовується занадто багато різних способів опису, тому функціональність залишається за пакетом. (Надано Vajrasky Kok і Berker Peksag у bpo-1322.)

Раніше недокументовані методи from_function і from_builtin inspect.Signature застаріли. Натомість використовуйте новий метод Signature.from_callable(). (Надав Юрій Селіванов у bpo-24248.)

Функція inspect.getargspec() є застарілою та планується її видалення в Python 3.6. (Докладніше див. bpo-20438.)

Функції inspect getfullargspec(), getcallargs() і formatargspec() застаріли на користь inspect.signature() API. (Надав Юрій Селіванов у bpo-20438.)

Функції getargvalues() і formatargvalues() були ненавмисно позначені як застарілі з випуском Python 3.5.0.

Використання прапора re.LOCALE із шаблонами str або re.ASCII тепер застаріло. (Надав Сергій Сторчака в bpo-22407.)

Використання нерозпізнаних спеціальних послідовностей, що складаються з '\' і літери ASCII у шаблонах регулярних виразів і шаблонах заміни, тепер викликає попередження про застаріння та буде заборонено в Python 3.6. (Надав Сергій Сторчака в bpo-23622.)

Недокументований і неофіційний аргумент use_load_tests за замовчуванням методу unittest.TestLoader.loadTestsFromModule() тепер застарілий і ігнорується. (Надано Робертом Коллінзом і Баррі А. Варшавою в bpo-16662.)

Видалено

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

Наступні застарілі API та функції, які раніше не підтримувалися, видалено:

  • Атрибут __version__ видалено з пакета електронної пошти. Код електронної пошти не надсилався окремо від stdlib протягом тривалого часу, а рядок __version__ не оновлювався в останніх кількох випусках.

  • Внутрішній клас Netrc у модулі ftplib було визнано застарілим у версії 3.4 і тепер його видалено. (Надав Мет Чапут у bpo-6623.)

  • Поняття файлів .pyo було видалено.

  • Клас JoinableQueue у попередньому модулі asyncio був застарілим у версії 3.4.4 і тепер видалений. (Надав А. Джессі Джірю Девіс у bpo-23464.)

Перенесення на Python 3.5

У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.

Зміни в поведінці Python

  • Через помилку попередні версії Python помилково приймали такий синтаксис:

    f(1 for x in [1], *args)
    f(1 for x in [1], **kwargs)
    

    Python 3.5 тепер правильно викликає SyntaxError, оскільки вирази генератора потрібно поміщати в дужки, якщо вони не є єдиним аргументом функції.

Зміни в API Python

  • PEP 475: Системні виклики тепер повторюються, коли їх перериває сигнал, замість того, щоб викликати InterruptedError, якщо обробник сигналів Python не викликає виключення.

  • До Python 3.5 об’єкт datetime.time вважався хибним, якщо він представляв північ за UTC. Таку поведінку вважали незрозумілою та схильною до помилок, тому її було видалено в Python 3.5. Дивіться bpo-13936 для повної інформації.

  • Метод ssl.SSLSocket.send() тепер викликає ssl.SSLWantReadError або ssl.SSLWantWriteError на неблокуючому сокеті, якщо операція буде заблокована. Раніше він повертав 0. (Надав Ніколаус Рат у bpo-20951.)

  • Атрибут __name__ генераторів тепер встановлюється з імені функції, а не з кодового імені. Використовуйте gen.gi_code.co_name, щоб отримати кодову назву. Генератори також мають новий атрибут __qualname__, кваліфіковане ім’я, яке тепер використовується для представлення генератора (repr(gen)). (Надав Віктор Стіннер у bpo-21205.)

  • Застарілий «суворий» режим і аргумент HTMLParser, HTMLParser.error() і виняток HTMLParserError видалено. (Надано Еціо Мелотті в bpo-15114.) Аргумент convert_charrefs HTMLParser тепер за умовчанням має значення True. (Надано Berker Peksag у bpo-21047.)

  • Хоча це формально не є частиною API, варто зазначити, що для цілей перенесення (тобто: виправлення тестів) повідомлення про помилки, які раніше мали форму «„sometype“ не підтримує буферний протокол», тепер мають форму «a bytes-like object потрібен, а не „sometype“». (Надав Еціо Мелотті в bpo-16518.)

  • Якщо поточний каталог встановлено на каталог, який більше не існує, тоді FileNotFoundError більше не буде викликано, а замість цього find_spec() поверне None без кешування None у sys.path_importer_cache, що відрізняється від типового випадку (bpo-22834).

  • Код статусу HTTP та повідомлення від http.client і http.server були перетворені в загальний перелік HTTPStatus. Значення в http.client і http.server залишаються доступними для зворотної сумісності. (Надав Деміан Брехт у bpo-21793.)

  • Коли завантажувач імпорту визначає importlib.machinery.Loader.exec_module(), тепер очікується також визначення create_module() (зараз викликає DeprecationWarning, буде помилка в Python 3.6). Якщо завантажувач успадковує importlib.abc.Loader, тоді нічого не потрібно робити, інакше просто визначте create_module() для повернення None. (Надав Бретт Кеннон у bpo-23014.)

  • Функція re.split() завжди ігнорувала збіги порожнього шаблону, тому шаблон "x*" працював так само, як "x+", а шаблон "\b" ніколи не працював. Тепер re.split() викликає попередження, якщо шаблон може збігатися з порожнім рядком. Для сумісності використовуйте шаблони, які ніколи не відповідають порожньому рядку (наприклад, "x+" замість "x*"). Шаблони, які можуть відповідати лише порожньому рядку (наприклад, "\b"), тепер викликають помилку. (Надав Сергій Сторчака в bpo-22818.)

  • Dict-подібний інтерфейс http.cookies.Morsel був узгоджений: порівняння шматків тепер використовує key і value, copy() тепер призводить до екземпляра Morsel замість dict, і update() тепер викличе виняток, якщо будь-який із ключів у словнику оновлення недійсний. Крім того, недокументований параметр LegalChars set() застарів і тепер ігнорується. (Надав Деміан Брехт у bpo-2211.)

  • PEP 488 has removed .pyo files from Python and introduced the optional opt- tag in .pyc file names. The importlib.util.cache_from_source() has gained an optimization parameter to help control the opt- tag. Because of this, the debug_override parameter of the function is now deprecated. .pyo files are also no longer supported as a file argument to the Python interpreter and thus serve no purpose when distributed on their own (i.e. sourceless code distribution). Due to the fact that the magic number for bytecode has changed in Python 3.5, all old .pyo files from previous versions of Python are invalid regardless of this PEP.

  • Модуль socket тепер експортує константу CAN_RAW_FD_FRAMES у Linux 3.6 і новіших версіях.

  • Функція ssl.cert_time_to_seconds() тепер інтерпретує введений час як UTC, а не як місцевий час відповідно до RFC 5280. Крім того, повертається значення завжди int. (Надав Акіра Лі в bpo-19940.)

  • Інструмент pygettext.py тепер використовує стандартний формат +NNNN для часових поясів у заголовку POT-Creation-Date.

  • Модуль smtplib тепер використовує sys.stderr замість попередньої змінної рівня модуля stderr для виводу налагодження. Якщо ваша (тестова) програма залежить від виправлення змінної рівня модуля для захоплення вихідних даних налагодження, вам потрібно буде оновити її для захоплення sys.stderr.

  • Методи str.startswith() і str.endswith() більше не повертають значення True, коли знаходять порожній рядок, а індекси повністю виходять за межі діапазону. (Надав Сергій Сторчака в bpo-24284.)

  • Функція inspect.getdoc() тепер повертає рядки документації, успадковані від базових класів. Рядки документації більше не потрібно дублювати, якщо успадкована документація підходить. Щоб приховати успадкований рядок, необхідно вказати порожній рядок (або можна заповнити документацію). Ця зміна впливає на вихідні дані модуля pydoc і функції help(). (Надав Сергій Сторчака в bpo-15582.)

  • Вкладені виклики functools.partial() тепер зведені. Якщо ви покладалися на попередню поведінку, тепер ви можете додати атрибут до об’єкта functools.partial() або створити підклас functools.partial(). (Надав Олександр Бєлопольський у bpo-7830.)

Зміни в C API

  • Недокументований член format (непублічної) структури PyMemoryViewObject було видалено. Усі розширення, що покладаються на відповідні частини в memoryobject.h, необхідно перебудувати.

  • Структуру PyMemAllocator було перейменовано на PyMemAllocatorEx і додано нове поле calloc.

  • Видалено незадокументований макрос PyObject_REPR, який став джерелом посилань. Використовуйте символ форматування %R у PyUnicode_FromFormat()-подібних функціях, щоб відформатувати repr() об’єкта. (Надав Сергій Сторчака в bpo-22453.)

  • Оскільки відсутність атрибута __module__ порушує маринування та самоаналіз, для вбудованих типів без атрибута __module__ тепер видається попередження про застаріле. У майбутньому це буде AttributeError. (Надав Сергій Сторчака у bpo-20204.)

  • У рамках реалізації PEP 492 слот tp_reserved PyTypeObject було замінено на tp_as_async слот. Зверніться до Об’єкти співпрограми для нових типів, структур і функцій.

Помітні зміни в Python 3.5.4

Нова ціль збірки make regen-all

Щоб спростити крос-компіляцію та гарантувати, що CPython можна надійно скомпілювати без наявності наявної версії Python, система збирання на основі autotools більше не намагається неявно перекомпілювати згенеровані файли на основі часу модифікації файлу.

Натомість додано нову команду make regen-all, щоб примусово повторно генерувати ці файли за бажанням (наприклад, після того, як початкова версія Python вже була створена на основі попередньо згенерованих версій).

Також визначено більш вибіркові цілі регенерації - подробиці див. Makefile.pre.in.

(Надав Віктор Стіннер у bpo-23404.)

Нове в версії 3.5.4.

Видалення цілі збірки make touch

Ціль збірки make touch, яка раніше використовувалася для запиту неявної регенерації згенерованих файлів шляхом оновлення часу їх модифікації, видалено.

Його було замінено новою метою make regen-all.

(Надав Віктор Стіннер у bpo-23404.)

Змінено в версії 3.5.4.