Що нового в 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.)
Значні вдосконалення стандартної бібліотеки:
collections.OrderedDict
тепер реалізовано в C, що робить його від 4 до 100 разів швидшим.Модуль
ssl
отримав підтримку Memory BIO, що відокремлює обробку протоколу SSL від мережевого введення-виведення.Нова функція
os.scandir()
забезпечує кращий і значно швидший спосіб обходу каталогу.functools.lru_cache()
був здебільшого перереалізований у C, що дало набагато кращу продуктивність.Нова функція
subprocess.run()
забезпечує впорядкований спосіб запуску підпроцесів.Модуль
traceback
був значно покращений для покращення продуктивності та зручності для розробників.
Покращення безпеки:
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
, який узгоджується з усіма типами (тобто призначається до них і від них).
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 розробник мав два варіанти:
Ігноруйте
InterruptedError
.Обробити
InterruptedError
і спробувати перезапустити перерваний системний виклик на кожному місці виклику.
Перший варіант призводить до періодичного збою програми. Другий варіант додає велику кількість шаблонів, що робить код майже нечитабельним. Порівняти:
print("Hello World")
і:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 реалізує автоматичний повтор системних викликів на EINTR
. Це знімає тягар роботи з EINTR
або InterruptedError
у коді користувача в більшості ситуацій і робить програми Python, включаючи стандартну бібліотеку, більш надійними. Зауважте, що повторна спроба системного виклику виконується, лише якщо обробник сигналу не викликає виняткової ситуації.
Нижче наведено список функцій, які зараз виконуються повторно, коли їх перериває сигнал:
функції модуля
faulthandler
;os
функції:fchdir()
,fchmod()
,fchown()
,fdatasync()
,fstat()
,fstatvfs()
,fsync()
,ftruncate()
,mkfifo()
,mknod()
,open()
,posix_fadvise()
,posix_fallocate()
,pread()
,pwrite()
,read()
,readv()
,sendfile()
,wait3()
,wait4()
,wait()
,waitid()
,waitpid()
,write()
,writev()
;спеціальні випадки:
os.close()
іos.dup2()
тепер ігнорують помилкиEINTR
; системний виклик не повторюється (обґрунтування див. у PEP);select
функції:devpoll.poll()
,epoll.poll()
,kqueue.control()
,poll. poll()
,select()
;методи класу
socket
:accept()
,connect()
(крім неблокуючих сокетів),recv()
,recvfrom()
,recvmsg()
,send()
,sendall()
,sendmsg()
,sendto()
;
Дивись також
- 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 .
імапліб¶
Клас 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.)
Нові допоміжні функції кодування/декодування:
Py_DecodeLocale()
(замінено_Py_char2wchar()
),Py_EncodeLocale()
(замінено_Py_wchar2char()
).
(Надав Віктор Стіннер у 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_charrefsHTMLParser
тепер за умовчанням має значення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()
тепер викличе виняток, якщо будь-який із ключів у словнику оновлення недійсний. Крім того, недокументований параметр LegalCharsset()
застарів і тепер ігнорується. (Надав Деміан Брехт у bpo-2211.)PEP 488 has removed
.pyo
files from Python and introduced the optionalopt-
tag in.pyc
file names. Theimportlib.util.cache_from_source()
has gained an optimization parameter to help control theopt-
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.