Що нового в Python 3.4

Автор

R. David Murray <rdmurray@bitdance.com> (Редактор)

У цій статті пояснюється нові функції в Python 3.4 порівняно з 3.3. Python 3.4 було випущено 16 березня 2014 року. Щоб отримати повну інформацію, перегляньте журнал змін.

Дивись також

PEP 429 – Графік випуску Python 3.4

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

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

  • У Python 3.4 не було додано нових функцій синтаксису.

Інші нові функції:

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

Значно вдосконалені модулі бібліотеки:

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

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

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

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

PEP 453: Явне початкове завантаження PIP у встановленнях Python

За замовчуванням завантажувальний pip

Новий модуль ensurepip (визначений у PEP 453) забезпечує стандартний міжплатформний механізм для завантаження інсталятора pip у інсталяції Python і віртуальні середовища. Версія pip, що входить до складу Python 3.4.0, — це pip 1.5.4, і в майбутніх випусках технічного обслуговування 3.4.x оновлюватиметься пакетна версія до останньої версії pip, доступної за адресою час створення реліз-кандидата.

За замовчуванням команди pipX і pipX.Y будуть встановлені на всіх платформах (де X.Y означає версію інсталяції Python), а також пакет pip Python і його залежності . У Windows і у віртуальних середовищах на всіх платформах також буде встановлено неверсійну команду pip. На інших платформах загальносистемна неверсійна команда pip зазвичай відноситься до окремо встановленої версії Python 2.

Утиліта командного рядка pyvenv і модуль venv використовують модуль ensurepip, щоб зробити pip доступним у віртуальних середовищах. Під час використання утиліти командного рядка pip встановлено за замовчуванням, тоді як при використанні модуля venv API встановлення pip має бути запитане явно.

Для CPython source будується на системах POSIX, команди make install і make altinstall завантажують pip за замовчуванням. Цю поведінку можна контролювати за допомогою параметрів конфігурації та перевизначати за допомогою параметрів Makefile.

У Windows і Mac OS X інсталятори CPython тепер за замовчуванням встановлюють pip разом із самим CPython (користувачі можуть відмовитися від його встановлення під час процесу встановлення). Користувачам Windows потрібно буде ввімкнути автоматичні зміни PATH, щоб за замовчуванням мати pip доступним із командного рядка, інакше до нього можна отримати доступ через засіб запуску Python для Windows за допомогою py -m pip.

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

Примітка

Щоб уникнути конфліктів між паралельними інсталяціями Python 2 і Python 3, лише версії команд pip3 і pip3.4 завантажуються за замовчуванням, коли ensurepip викликається безпосередньо - --default- Опція pip потрібна для запиту неверсійної команди pip. ``pyvenv і інсталятор Windows забезпечують доступність некваліфікованої команди pip у цих середовищах, а pip завжди можна викликати за допомогою перемикача -m, а не безпосередньо, щоб уникнути неоднозначність у системах із кількома інсталяціями Python.

Зміни в документації

У рамках цієї зміни розділи Встановлення модулів Python і Розповсюдження модулів Python документації були повністю перероблені як короткі документи про початок роботи та FAQ. Більшість пакетної документації тепер переміщено до Python Packaging Authority, який підтримується Python Packaging User Guide і документація окремих проектів.

Однак, оскільки ця міграція ще не завершена, застарілі версії цих посібників залишаються доступними як Встановлення модулів Python (застаріла версія) і Розповсюдження модулів Python (застаріла версія).

Дивись також

PEP 453 – Явне початкове завантаження pip у інсталяціях Python

PEP, написаний Дональдом Стаффтом і Ніком Когланом, реалізований Дональдом Стаффтом, Ніком Когланом, Мартіном фон Льовісом і Недом Дейлі.

PEP 446: щойно створені дескриптори файлів не успадковуються

PEP 446 робить новостворені дескриптори файлів неуспадкованими. Загалом це те, чого захоче програма: під час запуску нового процесу наявність відкритих файлів, також відкритих у новому процесі, може призвести до різного роду помилок, які важко знайти, і потенційно до проблем безпеки.

Однак бувають випадки, коли бажано отримати спадок. Для підтримки цих випадків доступні такі нові функції та методи:

Дивись також

PEP 446 – Зробити новостворені дескриптори файлів неуспадковуваними

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

Покращення обробки кодеків

З моменту появи вперше модуль codecs завжди був призначений для роботи як нейтральна до типу система динамічного кодування та декодування. Однак його тісний зв’язок із текстовою моделлю Python, особливо зручні методи з обмеженим типом у вбудованих типах str, bytes і bytearray, історично приховав цей факт.

Як ключовий крок у проясненні ситуації, зручні функції codecs.encode() і codecs.decode() тепер належним чином задокументовані в Python 2.7, 3.3 і 3.4. Ці функції існували в модулі codecs (і були охоплені набором тестів регресії) з Python 2.4, але раніше їх можна було виявити лише під час самоаналізу.

На відміну від зручних методів str, bytes і bytearray, зручні функції codecs підтримують довільні кодеки в Python 2 і Python 3, а не обмежені у кодування тексту Unicode (у Python 3) або перетворення basestring <-> basestring (у Python 2).

У Python 3.4 інтерпретатор може ідентифікувати відомі нетекстові кодування, надані в стандартній бібліотеці, і спрямовувати користувачів до цих зручних функцій загального призначення, коли це необхідно:

>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

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

>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

Нарешті, як показують наведені вище приклади, ці вдосконалення дозволили відновити зручні псевдоніми для кодеків, відмінних від Unicode, які самі були відновлені в Python 3.2. Це означає, що кодування двійкових даних у їх шістнадцяткове представлення та з них (наприклад) тепер можна записати так:

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

Двійкові та текстові перетворення, надані в стандартній бібліотеці, детально описані в Двійкові перетворення і Перетворення тексту.

(Надано Ніком Когланом у bpo-7475, bpo-17827, bpo-17828 та bpo-19619.)

PEP 451: тип ModuleSpec для системи імпорту

PEP 451 забезпечує інкапсуляцію інформації про модуль, яку механізм імпорту використовуватиме для його завантаження (тобто специфікацію модуля). Це допомагає спростити як реалізацію імпорту, так і кілька пов’язаних з імпортом API. Ця зміна також є кроком до декількох майбутніх покращень, пов’язаних з імпортом.

Загальнодоступні зміни від PEP повністю сумісні з попередніми версіями. Крім того, вони мають бути прозорими для всіх, крім авторів-імпортерів. Методи пошуку та завантаження ключів застаріли, але вони продовжуватимуть працювати. Нові імпортери повинні використовувати нові методи, описані в PEP. Існуючі імпортери мають бути оновлені для впровадження нових методів. Перегляньте розділ Застаріле для списку методів, які слід замінити, і їх замін.

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

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

  • Базу даних Unicode оновлено до UCD версії 6.3.

  • min() і max() тепер приймають аргумент за замовчуванням, що містить лише ключове слово, яке можна використовувати для вказівки значення, яке вони повертають, якщо ітерація, яку вони оцінюють, не має елементів. (Надав Джуліан Берман у bpo-18111.)

  • Module objects are now weakref’able.

  • Атрибути модуля __file__ (та відповідні значення) тепер завжди повинні містити абсолютні шляхи за замовчуванням, за єдиним винятком __main__.__file__, коли сценарій виконується безпосередньо за допомогою відносного шляху. (Надано Бреттом Кенноном у bpo-18416.)

  • Усі кодеки UTF-* (крім UTF-7) тепер відхиляють сурогати як під час кодування, так і під час декодування, якщо не використовується обробник помилок surrogatepass, за винятком декодера UTF-16 (який приймає дійсні пари сурогатів) і кодувальник UTF-16 (який створює їх під час кодування символів, відмінних від BMP). (Надано Віктором Стіннером, Кан-Хао (Кенні) Лу та Сергієм Сторчакою в bpo-12892.)

  • Новий німецький EBCDIC codec cp273. (Надано Майклом Біренфельдом та Ендрю Кухлінгом у bpo-1097797.)

  • Новий український codec cp1125. (Надав Сергій Сторчака в bpo-19668.)

  • bytes.join() і bytearray.join() тепер приймають довільні буферні об’єкти як аргументи. (Надав Антуан Пітру в bpo-15958.)

  • Конструктор int тепер приймає будь-який об’єкт, який має метод __index__ для аргументу base. (Надав Марк Дікінсон у bpo-16772.)

  • Об’єкти фрейму тепер мають метод clear(), який очищає всі посилання на локальні змінні з фрейму. (Надав Антуан Пітру в bpo-17934.)

  • memoryview тепер зареєстровано як Sequence, і підтримує вбудований reversed(). (Надано Ніком Когланом і Клаудіу Попою в bpo-18690 і bpo-19078.)

  • Сигнатури, про які повідомляє help(), були змінені та покращені в кількох випадках у результаті впровадження Argument Clinic та інших змін до модулів inspect і pydoc.

  • __length_hint__() тепер є частиною формальної специфікації мови (див. PEP 424). (Надав Армін Роначер у bpo-16148.)

Нові модулі

asyncio

Новий модуль asyncio (визначений у PEP 3156) надає стандартну підключаючу модель циклу подій для Python, надаючи надійну підтримку асинхронного введення-виведення в стандартній бібліотеці та полегшуючи взаємодію інших реалізацій циклу подій. зі стандартною бібліотекою та один з одним.

Для Python 3.4 цей модуль вважається provisional API.

Дивись також

PEP 3156 – Перезавантажено підтримку асинхронного вводу-виводу: модуль «asyncio»

Написання PEP та впровадження під керівництвом Гвідо ван Россума.

securepip

Новий модуль ensurepip є основною інфраструктурою для реалізації PEP 453. У звичайному перебігу подій кінцевим користувачам не потрібно буде взаємодіяти з цим модулем, але його можна використовувати для ручного завантаження pip, якщо автоматичне завантаження у встановлене чи віртуальне середовище було відхилено.

ensurepip includes a bundled copy of pip, up-to-date as of the first release candidate of the release of CPython with which it ships (this applies to both maintenance releases and feature releases). ensurepip does not access the internet. If the installation has Internet access, after ensurepip is run the bundled pip can be used to upgrade pip to a more recent release than the bundled one. (Note that such an upgraded version of pip is considered to be a separately installed package and will not be removed if Python is uninstalled.)

Модуль називається ensurepip, тому що якщо його викликати, коли pip уже встановлено, він нічого не робить. Він також має опцію --upgrade, яка змусить його встановити пакетну копію pip, якщо наявна встановлена версія pip старіша за пакетну копію.

перелік

Новий модуль enum (визначений у PEP 435) забезпечує стандартну реалізацію типів перерахування, що дозволяє іншим модулям (таким як socket) надавати більш інформативні повідомлення про помилки та покращувати підтримку налагодження. шляхом заміни непрозорих цілочисельних констант на зворотно сумісні значення перерахування.

Дивись також

PEP 435 – Додавання типу Enum до стандартної бібліотеки Python

PEP, написаний Баррі Варшау, Елі Бендерскі та Ітаном Фурманом, реалізований Ітаном Фурманом.

pathlib

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

Для Python 3.4 цей модуль вважається provisional API.

Дивись також

PEP 428 – Модуль pathlib – шляхи об’єктно-орієнтованої файлової системи

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

селектори

Новий модуль selectors (створений як частина реалізації PEP 3156) забезпечує високорівневе й ефективне мультиплексування вводу/виводу, побудоване на основі примітивів модуля select.

статистика

Новий модуль statistics (визначений у PEP 450) пропонує деякі основні функції статистики безпосередньо в стандартній бібліотеці. Цей модуль підтримує обчислення середнього значення, медіани, моди, дисперсії та стандартного відхилення ряду даних.

Дивись також

PEP 450 – Додавання модуля статистики до стандартної бібліотеки

PEP написаний і реалізований Стівеном Д’Апрано

tracemalloc

Новий модуль tracemalloc (визначений у PEP 454) є інструментом налагодження для відстеження блоків пам’яті, виділених Python. Він надає таку інформацію:

  • Відстеження місця розміщення об’єкта

  • Статистика виділених блоків пам’яті на ім’я файлу та номер рядка: загальний розмір, кількість і середній розмір виділених блоків пам’яті

  • Обчисліть різницю між двома знімками, щоб виявити витоки пам’яті

Дивись також

PEP 454 – Додайте новий модуль tracemalloc для відстеження розподілу пам’яті Python

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

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

абв

Нову функцію abc.get_cache_token() можна використовувати, щоб знати, коли робити кеші недійсними, на які впливають зміни в графі об’єктів. (Надав Łukasz Langa в bpo-16832.)

Новий клас ABC має ABCMeta як мета-клас. Використання ABC як базового класу має по суті той самий ефект, що й визначення metaclass=abc.ABCMeta, але його простіше вводити та легше читати. (Надав Бруно Дюпюї в bpo-16049.)

aifc

Метод getparams() тепер повертає іменований кортеж, а не звичайний кортеж. (Надав Клаудіу Попа в bpo-17818.)

aifc.open() тепер підтримує протокол керування контекстом: при використанні в блоці with метод close() повернутого об’єкта буде викликано автоматично під час кінець блоку. (Надав Сергій Сторчача в bpo-16486.)

Методи writeframesraw() і writeframes() тепер приймають будь-які bytes-like object. (Надав Сергій Сторчака в bpo-8311.)

argparse

Клас FileType тепер приймає аргументи encoding і errors, які передаються до open(). (Надав Лукас Майстр у bpo-11175.)

аудіооп

audioop тепер підтримує 24-бітні семпли. (Надав Сергій Сторчака в bpo-12866.)

Нова функція byteswap() перетворює вибірки з порядковим порядком байтів у порядковий порядок байтів у порядковий порядок байтів і навпаки. (Надав Сергій Сторчака в bpo-19641.)

Усі функції audioop тепер приймають будь-які байт-подібні об’єкти. Рядки не приймаються: раніше не працювали, тепер відразу видають помилку. (Надав Сергій Сторчака в bpo-16685.)

база64

Функції кодування та декодування в base64 тепер приймають будь-які bytes-подібні об’єкти у випадках, коли раніше вимагали екземпляр bytes або bytearray. (Надав Нік Коглан у bpo-17839.)

Нові функції a85encode(), a85decode(), b85encode() та b85decode() надають можливість кодувати та декодувати двійкові дані з і до форматів Ascii85 і git/mercurial Base85 відповідно. Функції a85 мають параметри, за допомогою яких можна зробити їх сумісними з варіантами кодування Ascii85, включно з варіантом Adobe. (Надано Мартіном Моррісоном, проектом Mercurial, Сергієм Сторчакою та Антуаном Пітру в bpo-17618.)

колекції

Метод ChainMap.new_child() тепер приймає аргумент m, який визначає дочірню карту, яку потрібно додати до ланцюжка. Це дозволяє використовувати наявне зіставлення та/або настроюваний тип зіставлення для дочірнього елемента. (Надав Віней Саджип у bpo-16613.)

colorys

Кількість цифр у коефіцієнтах для перетворень RGB — YIQ було розширено, щоб вони відповідали версіям FCC NTSC. Зміна в результатах має бути менше 1% і може краще відповідати результатам, знайденим в інших місцях. (Надано Браяном Лендерсом і Сергієм Сторчакою в bpo-14323.)

contextlib

Новий контекстний менеджер contextlib.suppress допомагає прояснити призначення коду, який навмисно пригнічує винятки з одного оператора. (Надано Раймондом Хеттінгером у bpo-15806 та Zero Piraeus у bpo-19266.)

Новий контекстний менеджер contextlib.redirect_stdout() спрощує роботу сценаріїв утиліт з негнучкими API, які записують свої виведення в sys.stdout і не надають жодних опцій для його перенаправлення. За допомогою диспетчера контексту вихід sys.stdout можна перенаправити в будь-який інший потік або, у поєднанні з io.StringIO, у рядок. Останнє може бути особливо корисним, наприклад, для захоплення виводу з функції, яка була написана для реалізації інтерфейсу командного рядка. Рекомендовано лише для службових сценаріїв, оскільки це впливає на глобальний стан sys.stdout. (Надав Реймонд Геттінгер у bpo-15805.)

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

dbm

Об’єкти dbm.open() тепер підтримують протокол керування контекстом. При використанні в операторі with метод close об’єкта бази даних буде викликано автоматично в кінці блоку. (Надано Клаудіу Попою та Ніком Когланом у bpo-19282.)

дис

Функції show_code(), dis(), distb() і disassemble() тепер приймають файл лише з ключовими словами аргумент, який керує місцем запису результату.

Модуль dis тепер побудовано навколо класу Instruction, який забезпечує об’єктно-орієнтований доступ до деталей кожної окремої операції байт-коду.

Новий метод, get_instructions(), надає ітератор, який видає потік інструкцій для певної частини коду Python. Таким чином, тепер можна написати програму, яка перевіряє та обробляє об’єкт байт-коду способами, відмінними від тих, які надає сам модуль dis. Наприклад:

>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

Різні інструменти відображення в модулі dis було переписано для використання цих нових компонентів.

Крім того, новий зручний для додатків клас Bytecode надає об’єктно-орієнтований API для перевірки байт-коду як у зрозумілій людині формі, так і для повторення інструкцій. Конструктор Bytecode приймає ті самі аргументи, що і get_instruction() (плюс необов’язковий current_offset), і отриманий об’єкт можна повторювати для створення Об’єкти Instruction. Але він також має метод dis, еквівалентний виклику dis в аргументі конструктора, але повертається як багаторядковий рядок:

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()       
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

Bytecode також має метод класу, from_traceback(), який надає можливість маніпулювати трасуванням (тобто print(Bytecode.from_traceback(tb). dis()) еквівалентно distb(tb)).

(Надано Ніком Когланом, Раяном Келлі та Томасом Клайвером у bpo-11816 та Клаудіу Попою у bpo-17916.)

Нова функція stack_effect() обчислює вплив заданого коду операції та аргументу на стек Python, інформації, яка інакше недоступна. (Надано Ларрі Гастінгсом у bpo-19722.)

doctest

Новий прапор параметра, FAIL_FAST, зупиняє виконання тесту, як тільки виявлено першу помилку. (Надано Р. Девідом Мюрреєм і Деніелом Урбаном у bpo-16522.)

Інтерфейс командного рядка doctest тепер використовує argparse і має два нові параметри, -o і -f. -o дозволяє doctest options вказувати в командному рядку, а -f є скороченням -o FAIL_FAST (для паралельного аналогічного параметра, який підтримується unittest CLI). (Надав Р. Девід Мюррей у bpo-11390.)

doctest тепер знаходитиме doctests у рядках __doc__ модуля розширення. (Надано Zachary Ware у bpo-3158.)

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

as_string() тепер приймає аргумент policy для заміни політики за замовчуванням повідомлення під час генерації його представлення рядка. Це означає, що as_string тепер можна використовувати в більшій кількості обставин, замість того, щоб створювати та використовувати generator для передачі параметрів форматування його методу flatten. (Надав Р. Девід Мюррей у bpo-18600.)

Новий метод as_bytes() додано для створення представлення повідомлення в байтах подібно до того, як as_string створює представлення рядка. Він не приймає аргумент maxheaderlen, але приймає аргументи unixfrom і policy. Метод Message __bytes__() викликає його, що означає, що bytes(mymsg) тепер створюватиме інтуїтивно зрозумілий результат: об’єкт bytes, що містить повністю відформатованого повідомлення. (Надав Р. Девід Мюррей у bpo-18600.)

Повідомлення Message.set_param() тепер приймає аргумент ключового слова replace. Якщо вказано, пов’язаний заголовок буде оновлено без зміни його розташування в списку заголовків. Для зворотної сумісності стандартним значенням є False. (Надав Р. Девід Мюррей у bpo-18891.)

Додано пару нових підкласів Message (EmailMessage і MIMEPart), а також новий підмодуль contentmanager і новий атрибут policy content_manager. Уся документація зараз знаходиться в новому модулі, який додається як частина нового provisional API електронної пошти. Ці класи надають низку нових методів, які значно спрощують вилучення вмісту з повідомлень електронної пошти та вставлення вмісту в нього. Додаткову інформацію див. у документації contentmanager і email: Examples. Ці доповнення API завершують основну частину роботи, яка була запланована в рамках проекту email6. Наразі попередній API планується стати остаточним у Python 3.5 (можливо, з кількома незначними доповненнями в області обробки помилок). (Надав Р. Девід Мюррей у bpo-18891.)

filecmp

Нова функція clear_cache() надає можливість очистити кеш порівняння filecmp, який використовує інформацію os.stat(), щоб визначити, чи файл змінився з часу останнього порівняння. Це можна використати, наприклад, якщо файл міг бути змінений і повторно перевірений за менший час, ніж роздільна здатність поля часу модифікації файлу певної файлової системи. (Надав Марк Левітт у bpo-18149.)

Новий атрибут модуля DEFAULT_IGNORES надає список каталогів, які використовуються як значення за замовчуванням для параметра ignore функції dircmp(). (Надав Елі Бендерський у bpo-15442.)

functools

Новий дескриптор partialmethod() забезпечує часткове застосування аргументів до дескрипторів, так само як partial() забезпечує звичайні виклики. Новий дескриптор також полегшує роботу довільних викликів (включно з екземплярами partial()) як звичайні методи екземплярів, якщо їх включити у визначення класу. (Надано Алоном Хоревом і Ніком Когланом у bpo-4331.)

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

Дивись також

PEP 443 – Загальні функції з одним відправленням

PEP написав і реалізував Лукаш Ланга.

total_ordering() тепер підтримує повернення значення NotImplemented від основної функції порівняння. (Надано Кеті Міллер у bpo-10042.)

Чиста версія функції partial() на Python тепер знаходиться в stdlib; у CPython він перевизначений прискореною версією C, але він доступний для використання в інших реалізаціях. (Надав Браян Торн у bpo-12428.)

gc

Нова функція get_stats() повертає список із трьох словників для кожного покоління, що містить статистику колекцій з моменту запуску інтерпретатора. (Надав Антуан Пітру в bpo-16351.)

глоб

Нова функція escape() надає спосіб екранувати спеціальні символи в назві файлу, щоб вони не ставали частиною розширення globbing, а натомість зіставлялися буквально. (Надав Сергій Сторчака в bpo-8402.)

хешліб

Нова функція hashlib.pbkdf2_hmac() забезпечує функцію виведення ключа на основі пароля PKCS#5 2. (Надав Крістіан Хеймс у bpo-18582.)

Атрибут name хеш-об’єктів hashlib тепер офіційно підтримується інтерфейсом. Він завжди існував у hashlib CPython (хоча він не повертав імена нижнього регістру для всіх підтримуваних хешів), але він не був загальнодоступним інтерфейсом, тому деякі інші реалізації Python раніше його не підтримували. (Надав Джейсон Р. Кумбс у bpo-18532.)

hmac

hmac тепер приймає bytearray, а також bytes для аргументу key для функції new() і параметр msg для обох: Функція new() і метод update() тепер приймають будь-який тип, який підтримується модулем hashlib. (Надав Йонас Борґстрем у bpo-18240.)

Аргументом digestmod для функції hmac.new() тепер може бути будь-яке ім’я дайджесту хешу, яке розпізнає hashlib. Крім того, поточна поведінка, у якій значенням digestmod за замовчуванням є MD5, є застарілою: у майбутній версії Python значення за замовчуванням не буде. (Надав Крістіан Хеймс у bpo-17276.)

З додаванням атрибутів block_size і name (та офіційної документації атрибута digest_size), Модуль hmac тепер повністю відповідає PEP 247 API. (Надав Крістіан Хеймс у bpo-18775.)

html

Нова функція unescape() перетворює посилання на символи HTML5 на відповідні символи Unicode. (Надав Еціо Мелотті в bpo-2927.)

HTMLParser приймає новий аргумент ключового слова convert_charrefs, який, коли True, автоматично перетворює всі посилання на символи. Для зворотної сумісності його значення за замовчуванням False, але воно зміниться на True у майбутніх версіях Python, тому вам пропонується встановити його явно та оновити свій код, щоб використовувати цю нову функцію. (Надав Еціо Мелотті в bpo-13633.)

Строгий аргумент HTMLParser тепер застарів. (Надав Еціо Мелотті в bpo-15114.)

http

send_error() тепер приймає необов’язковий додатковий параметр explain, який можна використовувати для надання розширеного опису помилки, замінюючи жорстко запрограмоване за умовчанням, якщо воно є. Цей розширений опис помилки буде відформатовано за допомогою атрибута error_message_format і надіслано як тіло відповіді про помилку. (Надав Карл Коу в bpo-12921.)

http.server інтерфейс командного рядка тепер має опцію -b/--bind, яка змушує сервер слухати певну адресу. (Надав Малте Сварт у bpo-17764.)

idlelib і IDLE

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

importlib

InspectLoader ABC визначає новий метод, source_to_code(), який приймає вихідні дані та шлях і повертає об’єкт коду. Реалізація за замовчуванням еквівалентна compile(data, path, 'exec', dont_inherit=True). (Надано Еріком Сноу та Бреттом Кенноном у bpo-15627.)

InspectLoader також тепер має реалізацію за замовчуванням для методу get_code(). Однак, як правило, бажано замінити реалізацію за замовчуванням з міркувань продуктивності. (Надано Бреттом Кенноном у bpo-18072.)

Функцію reload() було переміщено з imp до importlib як частину застарілого модуля imp. (Надано Berker Peksag у bpo-18193.)

importlib.util тепер має атрибут MAGIC_NUMBER, який надає доступ до номера версії байт-коду. Це замінює функцію get_magic() у застарілому модулі imp. (Надано Бреттом Кенноном у bpo-18192.)

Нові функції importlib.util cache_from_source() і source_from_cache() замінюють однойменні функції в застарілому модулі imp. (Надано Бреттом Кенноном у bpo-18194.)

Завантажувач importlib NamespaceLoader тепер відповідає InspectLoader ABC, що означає, що runpy і python -m тепер можна використовувати з простором імен пакети. (Надано Бреттом Кенноном у bpo-18058.)

importlib.util має нову функцію decode_source(), яка декодує джерело з байтів за допомогою універсальної обробки нового рядка. Це корисно для реалізації методів InspectLoader.get_source().

importlib.machinery.ExtensionFileLoader тепер має метод get_filename(). Це було ненавмисно пропущено в початковій реалізації. (Надав Ерік Сноу в bpo-19152.)

оглядати

Модуль inspect тепер пропонує базовий інтерфейс командного рядка для швидкого відображення вихідного коду та іншої інформації для модулів, класів і функцій. (Надано Клаудіу Попою та Ніком Когланом у bpo-18626.)

unwrap() полегшує розгадування ланцюжків функцій оболонки, створених functools.wraps() (та будь-яким іншим API, який встановлює атрибут __wrapped__ для функції оболонки). (Надано Деніелом Урбаном, Аароном Айлзом і Ніком Когланом у bpo-13266.)

Як частина реалізації нового модуля enum, модуль inspect тепер має значно кращу підтримку користувацьких методів __dir__ і атрибутів динамічного класу, що надаються через метакласи. (Надав Ітан Фурман у bpo-18929 і bpo-19030.)

getfullargspec() і getargspec() тепер використовують API signature(). Це дозволяє їм підтримувати набагато ширший діапазон викликів, включаючи ті, що мають атрибути __signature__, ті, що мають метадані, надані клінікою аргументів, об’єкти functools.partial() тощо. Зауважте, що, на відміну від signature(), ці функції все ще ігнорують атрибути __wrapped__ і повідомляють про вже прив’язаний перший аргумент для прив’язаних методів, тому все одно необхідно оновити свій код, щоб використовувати signature() безпосередньо, якщо ці функції потрібні. (Надав Юрій Селіванов у bpo-17481.)

signature() тепер підтримує типи качок функцій CPython, що додає підтримку функцій, скомпільованих за допомогою Cython. (Надано Стефаном Бенелем і Юрієм Селівановим у bpo-17159.)

IP-адреса

ipaddress було додано до стандартної бібліотеки в Python 3.3 як provisional API. З випуском Python 3.4 цю кваліфікацію було видалено: ipaddress тепер вважається стабільним API, охопленим нормальними стандартними вимогами бібліотеки для підтримки зворотної сумісності.

Нова властивість is_global має значення True, якщо адресу можна глобально маршрутизувати. (Надав Пітер Муді в bpo-17400.)

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

TimedRotatingFileHandler має новий параметр atTime, за допомогою якого можна вказати час доби, коли має відбутися ролловер. (Надав Рональд Оуссорен у bpo-9556.)

SocketHandler і DatagramHandler тепер підтримують сокети домену Unix (встановивши port на None). (Надано Вінаєм Саджипом у коміті ce46195b56a9.)

fileConfig() тепер приймає екземпляр підкласу configparser.RawConfigParser для параметра fname. Це полегшує використання файлу конфігурації, коли конфігурація журналювання є лише частиною загальної конфігурації програми або коли програма змінює конфігурацію перед передачею її в fileConfig(). (Надав Віней Саджип у bpo-16110.)

Дані конфігурації журналу, отримані з сокета через функцію logging.config.listen(), тепер можна перевірити перед обробкою, надаючи функцію перевірки як аргумент для нового аргументу ключового слова verify. (Надав Віней Саджип у bpo-15452.)

маршал

Версію marshal за замовчуванням було збільшено до 3. Код, що реалізує нову версію, відновлює поведінку Python2 щодо запису лише однієї копії інтернованих рядків і збереження інтернінгу під час десеріалізації, а також розширює цю можливість «однієї копії» на будь-які тип об’єкта (включаючи обробку рекурсивних посилань). Це зменшує як розмір файлів .pyc, так і обсяг пам’яті, який модуль займає в пам’яті, коли він завантажується з файлу .pyc (або .pyo). (Надав Крістіан Валур Йонссон у bpo-16475, з додатковими прискореннями Антуаном Пітру в bpo-19219.)

mmap

mmap objects can now be weakrefed. (Contributed by Valerie Lambert in bpo-4885.)

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

В Unix два нові методи запуску, spawn і forkserver, були додані для запуску процесів за допомогою multiprocessing. Це робить змішування процесів із потоками більш надійним, а метод spawn відповідає семантиці, яку багатопроцесорність завжди використовувала в Windows. Нова функція get_all_start_methods() повідомляє про всі методи запуску, доступні на платформі, get_start_method() повідомляє поточний метод запуску, а set_start_method() встановлює метод запуску. (Надав Річард Оудкерк у bpo-8713.)

multiprocessing також тепер має концепцію контексту, який визначає, як створюються дочірні процеси. Нова функція get_context() повертає контекст, який використовує вказаний метод запуску. Він має той самий API, що й сам модуль multiprocessing, тож ви можете використовувати його для створення Poolта інших об’єктів, які працюватимуть у цьому контексті. Це дозволяє інфраструктурі та програмі або різним частинам однієї програми використовувати багатопроцесорність, не заважаючи одна одній. (Надав Річард Оудкерк у bpo-18999.)

За винятком використання старого методу запуску fork, дочірні процеси більше не успадковують непотрібні дескриптори/дескриптори файлів від своїх батьків (частина bpo-8713).

multiprocessing тепер покладається на runpy (який реалізує перемикач -m), щоб належним чином ініціалізувати __main__ у дочірніх процесах під час використання spawn або forkserver методи запуску. Це вирішує деякі граничні випадки, коли поєднання багатопроцесорності, перемикача командного рядка -m і явного відносного імпорту може спричинити незрозумілі збої в дочірніх процесах. (Надав Нік Коглан у bpo-19946.)

оператор

Нова функція length_hint() забезпечує реалізацію специфікації того, як слід використовувати спеціальний метод __length_hint__() як частину PEP 424 формальної специфікації цієї мови функція. (Надав Армін Роначер у bpo-16148.)

Тепер існує чиста версія модуля operator на Python, доступна для довідки та для використання в альтернативних реалізаціях Python. (Надано Zachary Ware у bpo-16694.)

ос

Є нові функції для отримання та встановлення inheritable flag файлового дескриптора (os.get_inheritable(), os.set_inheritable()) або маркера Windows (os .get_handle_inheritable(), os.set_handle_inheritable()).

Нова функція cpu_count() повідомляє кількість ЦП, доступних на платформі, на якій працює Python (або None, якщо кількість не може бути визначена). Функція multiprocessing.cpu_count() тепер реалізована в термінах цієї функції). (Надано Трентом Нельсоном, Йогешем Чаудхарі, Віктором Стіннером і Чарльзом-Франсуа Наталі в bpo-17914.)

os.path.samestat() тепер доступний на платформі Windows (і реалізація os.path.samefile() тепер спільно використовується між Unix і Windows). (Надав Браян Кертін у bpo-11939.)

os.path.ismount() тепер розпізнає томи, змонтовані нижче кореня диска в Windows. (Надав Тім Голден у bpo-9035.)

os.open() підтримує два нові позначки на платформах, які їх надають, O_PATH (дескриптор невідкритого файлу) і O_TMPFILE (тимчасовий файл без назви; починаючи з випуску 3.4.0, доступного лише в системах Linux із версією ядра 3.11 або новішою, які мають заголовки uapi). (Надано Крістіаном Хеймсом у bpo-18673 та Бенджаміном Петерсоном відповідно.)

pdb

pdb було вдосконалено, щоб працювати з генераторами, yield і yield from більш корисним способом. Це особливо корисно під час налагодження програм на основі asyncio. (Надано Ендрю Свєтловим і Ксав’є де Гає в bpo-16596.)

Команду print видалено з pdb, відновивши доступ до функції print() Python з командного рядка pdb. pdb Python2 не мав команди print; натомість введення print виконувало оператор print. У Python3 print було помилково зроблено псевдонімом для команди pdb p. Проте p друкує repr свого аргументу, а не str, як це робила команда print Python2. Гірше того, команда Python3 pdb print затьмарювала функцію print Python3, роблячи її недоступною у підказці pdb. (Надав Коннор Осборн у bpo-18764.)

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

pickle тепер підтримує (але не використовує за замовчуванням) новий протокол pickle, протокол 4. Цей новий протокол вирішує ряд проблем, які були присутні в попередніх протоколах, таких як серіалізація вкладених класів, дуже великі рядки і контейнери, і класи, чий метод __new__() приймає лише ключові аргументи. Це також забезпечує деякі покращення ефективності.

Дивись також

PEP 3154 – Протокол Pickle 4

PEP, написаний Антуаном Пітру та реалізований Александром Вассалотті.

plistlib

plistlib тепер має API, подібний до стандартного шаблону для протоколів серіалізації stdlib, з новими load(), dump(), loads() і dumps(). (Старіший API тепер не підтримується.) На додаток до вже підтримуваного формату XML plist (FMT_XML), він також підтримує двійковий формат plist (FMT_BINARY). (Надано Рональдом Оуссореном та іншими в bpo-14455.)

попліб

До poplib: capa() додано два нові методи, які повертають список можливостей, рекламованих сервером POP, і stls() , який перемикає сеанс POP3 із відкритим текстом на зашифрований сеанс POP3, якщо сервер POP це підтримує. (Надав Лоренцо Катуччі в bpo-4473.)

pprint

Клас PrettyPrinter модуля pprint і його функції pformat() і pprint() мають новий параметр, compact, який керує форматуванням виводу. Наразі встановлення compact на True означає, що послідовності будуть надруковані з такою кількістю елементів послідовності, скільки вміщуватиметься в межах ширини на кожному (з відступом) рядку. (Надав Сергій Сторчака в bpo-19132.)

Довгі рядки тепер обертаються за допомогою звичайного синтаксису продовження рядка Python. (Надав Антуан Пітру в bpo-17150.)

pty

pty.spawn() тепер повертає значення стану з os.waitpid() дочірнього процесу замість None. (Надав Грегорі П. Сміт.)

pydoc

Модуль pydoc тепер базується безпосередньо на API інтроспекції inspect.signature(), що дозволяє йому надавати інформацію про підпис для більшої кількості викликаних об’єктів. Ця зміна також означає, що атрибути __wrapped__ тепер враховуються під час відображення довідкової інформації. (Надано Ларрі Гастінгсом у bpo-19674.)

Модуль pydoc більше не відображає параметр self для вже зв’язаних методів. Замість цього він прагне завжди відображати точний поточний підпис наданого виклику. (Надано Ларрі Гастінгсом у bpo-20710.)

На додаток до змін, внесених безпосередньо до pydoc, його обробка користувацьких методів __dir__ і різноманітна поведінка дескрипторів також була суттєво покращена завдяки базовим змінам у модулі inspect .

Оскільки вбудований help() базується на pydoc, наведені вище зміни також впливають на поведінку help().

повторно

Нова функція fullmatch() і метод regex.fullmatch() закріплюють шаблон на обох кінцях рядка для відповідності. Це дає можливість чітко вказати мету збігу, що дозволяє уникнути класу непомітних помилок, через які символи $ губляться під час змін коду або додавання альтернатив до існуючого регулярного виразу. (Надав Метью Барнетт у bpo-16203.)

Repr regex об’єктів тепер включає шаблон і прапори; repr match objects тепер включає початок, кінець і частину рядка, що збігається. (Надано Уго Лопесом Таваресом і Сергієм Сторчакою в bpo-13592 і bpo-17087.)

ресурс

Нова функція prlimit(), доступна на платформах Linux із версією ядра 2.6.36 або новішою та glibc 2.13 або новішою, надає можливість запитувати або встановлювати обмеження ресурсів для процесів, відмінних від того, що створює виклик. (Надав Крістіан Хеймс у bpo-16595.)

У ядрі Linux версії 2.6.36 або пізнішої також є деякі нові специфічні константи Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME і RLIMIT_SIGPENDING. (Надав Крістіан Хеймс у bpo-19324.)

У FreeBSD версії 9 і пізніших є деякі нові специфічні константи FreeBSD: RLIMIT_SBSIZE, RLIMIT_SWAP і RLIMIT_NPTS. (Надав Клаудіу Попа в bpo-19343.)

вибрати

Об’єкти epoll тепер підтримують протокол керування контекстом. При використанні в операторі with метод close() буде викликано автоматично в кінці блоку. (Надав Сергій Сторчака в bpo-16488.)

Об’єкти devpoll тепер мають методи fileno() і close(), а також новий атрибут closed. (Надав Віктор Стіннер у bpo-18794.)

полиця

Екземпляри Shelf тепер можна використовувати в операторах with і автоматично закриватимуться в кінці блоку with. (Надав Філіп Грущинський у bpo-13896.)

шутил

copyfile() тепер створює певний підклас Error, SameFileError, коли джерело та місце призначення є тим самим файлом, що дозволяє програмі приймати відповідні дії щодо цієї конкретної помилки. (Надано Atsuo Ishimoto та Hynek Schlawack у bpo-1492704.)

smtpd

Класи SMTPServer і SMTPChannel тепер приймають аргумент ключового слова map, який, якщо вказано, передається в asynchat.async_chat як його map аргумент. Це дозволяє програмі уникнути впливу на глобальну карту сокетів. (Надав Віней Саджип у bpo-11959.)

smtplib

SMTPException тепер є підкласом OSError, який дозволяє перехоплювати помилки рівня сокета та протоколу SMTP одним оператором try/except за допомогою коду, який дбає лише про те, чи сталася помилка. (Надав Нед Джексон Лавлі в bpo-2118.)

гніздо

Модуль сокета тепер підтримує протокол CAN_BCM на платформах, які його підтримують. (Надав Браян Торн у bpo-15359.)

Об’єкти Socket мають нові методи отримання або встановлення свого inheritable flag, get_inheritable() та set_inheritable().

Константи socket.AF_* і socket.SOCK_* тепер є значеннями перерахування за допомогою нового модуля enum. Це дозволяє друкувати осмислені імена під час налагодження замість цілих «магічних чисел».

Константа AF_LINK тепер доступна в BSD і OSX.

inet_pton() і inet_ntop() тепер підтримуються в Windows. (Надав Ацуо Ісімото в bpo-7171.)

sqlite3

Новий логічний параметр функції connect(), uri, можна використовувати, щоб вказати, що параметр database є uri (див. документацію SQLite URI) . (Надано poq у bpo-13773.)

ssl

Додано PROTOCOL_TLSv1_1 і PROTOCOL_TLSv1_2 (підтримка TLSv1.1 і TLSv1.2); підтримка цих протоколів доступна, лише якщо Python пов’язано з OpenSSL 1.0.1 або новішої версії. (Надано Мікеле Орру та Антуаном Пітру в bpo-16692.)

Нова функція create_default_context() надає стандартний спосіб отримати SSLContext, налаштування якого створюють розумний баланс між сумісністю та безпекою. Ці параметри суворіші, ніж стандартні, надані конструктором SSLContext, і можуть бути скориговані в майбутньому без попереднього припинення підтримки, якщо зміняться найкращі вимоги безпеки. Нова рекомендована найкраща практика використання бібліотек stdlib, які підтримують SSL, полягає в тому, щоб використовувати create_default_context() для отримання об’єкта SSLContext, змінювати його за потреби, а потім передавати як аргумент context відповідного API stdlib. (Надав Крістіан Хаймес у bpo-19689.)

SSLContext метод load_verify_locations() приймає новий необов’язковий аргумент cadata, який можна використовувати для надання сертифікатів у кодуванні PEM або DER безпосередньо через рядки або байти відповідно. (Надав Крістіан Хеймс у bpo-18138.)

Нова функція get_default_verify_paths() повертає іменований кортеж шляхів і змінних середовища, які метод set_default_verify_paths() використовує для встановлення стандартних OpenSSL cafile і capath. Це може допомогти у вирішенні проблем перевірки за замовчуванням. (Надав Крістіан Хеймс у bpo-18143.)

SSLContext має новий метод, cert_store_stats(), який повідомляє кількість завантажених сертифікатів X.509, X.509 CA сертифікатів і списки відкликаних сертифікатів (crls), а також метод get_ca_certs(), який повертає список завантажених сертифікатів CA. (Надав Крістіан Хеймс у bpo-18147.)

Якщо доступний OpenSSL 0.9.8 або новішої версії, SSLContext має новий атрибут verify_flags, який можна використовувати для керування процесом перевірки сертифіката, установивши для нього певну комбінацію нових констант VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN або VERIFY_X509_STRICT. За замовчуванням OpenSSL не перевіряє CRL. (Надано Christien Heimes у bpo-8813.)

Новий метод SSLContext load_default_certs() завантажує набір стандартних сертифікатів «центру сертифікації» (CA) із стандартних розташувань, які відрізняються залежно від платформи. Його можна використовувати для завантаження як сертифікатів автентифікації веб-сервера TLS (purpose=SERVER_AUTH), які клієнт використовує для перевірки сервера, так і сертифікатів для сервера, які використовують для перевірки клієнтські сертифікати (purpose=CLIENT_AUTH). (Надав Крістіан Хаймес у bpo-19292.)

Дві нові функції лише для Windows, enum_certificates() і enum_crls() надають можливість отримувати сертифікати, інформацію про сертифікати та CRL зі сховища сертифікатів Windows. (Надав Крістіан Хеймс у bpo-17134.)

Підтримка SNI на стороні сервера (Індикація імені сервера) за допомогою нового методу ssl.SSSLContext.set_servername_callback(). (Надав Деніел Блек у bpo-8109.)

Словник, який повертає SSLSocket.getpeercert(), містить додаткові елементи розширення X509v3: crlDistributionPoints, calIssuers і OCSP URI. (Надав Крістіан Хеймс у bpo-18379.)

стат

Модуль stat тепер підтримується реалізацією C у _stat. Потрібна реалізація C, оскільки більшість значень не стандартизовані та залежать від платформи. (Надав Крістіан Хеймс у bpo-11016.)

Модуль підтримує нові прапорці ST_MODE, S_IFDOOR, S_IFPORT і S_IFWHT. (Надав Крістіан Гімес у bpo-11016.)

структура

Нова функція iter_unpack і новий метод struct.Struct.iter_unpack() для скомпільованих форматів забезпечують потокове розпакування буфера, що містить повторювані екземпляри даного формату даних. (Надав Антуан Пітру в bpo-17804.)

підпроцес

check_output() тепер приймає аргумент input, який можна використовувати для надання вмісту stdin для команди, яка виконується. (Надав Зак Вайнберг у bpo-16624.)

getstatus() і getstatusoutput() тепер працюють у Windows. Ця зміна фактично була зроблена ненавмисно в 3.3.4. (Надав Тім Голден у bpo-10197.)

sunau

Метод getparams() тепер повертає іменований кортеж, а не звичайний кортеж. (Надав Клаудіу Попа в bpo-18901.)

sunau.open() тепер підтримує протокол керування контекстом: при використанні в блоці with метод close повернутого об’єкта буде автоматично викликаний у кінці блоку. (Надав Сергій Сторчака в bpo-18878.)

AU_write.setsampwidth() тепер підтримує 24-бітові зразки, таким чином додаючи підтримку запису 24-х зразків за допомогою модуля. (Надав Сергій Сторчака в bpo-19261.)

Методи writeframesraw() і writeframes() тепер приймають будь-які bytes-like object. (Надав Сергій Сторчака в bpo-8311.)

система

Нова функція sys.getallocatedblocks() повертає поточну кількість блоків, виділених інтерпретатором. (У CPython із параметром за замовчуванням --with-pymalloc це виділення, зроблене через PyObject_Malloc() API.) Це може бути корисним для відстеження витоків пам’яті, особливо якщо це автоматизовано за допомогою набору тестів. . (Надав Антуан Пітру в bpo-13390.)

Коли інтерпретатор Python запускається в інтерактивному режимі, він перевіряє наявність атрибута __interactivehook__ в модулі sys. Якщо атрибут існує, його значення викликається без аргументів безпосередньо перед запуском інтерактивного режиму. Перевірка виконується після прочитання файлу PYTHONSTARTUP, тож його можна встановити там. Модуль site встановлює для нього функцію, яка вмикає завершення вкладки та збереження історії (у ~/.python-history), якщо платформа підтримує readline . Якщо ви не бажаєте такої (нової) поведінки, ви можете змінити її в PYTHONSTARTUP, sitecustomize або usercustomize, видаливши цей атрибут із sys (або встановлення його на інший виклик). (Надано Еріком Араухо та Антуаном Пітру в bpo-5845.)

tarfile

Модуль tarfile тепер підтримує простий Інтерфейс командного рядка під час безпосереднього виклику сценарію або через -m. Це можна використовувати для створення та розпакування архівів tarfile. (Надано Berker Peksag у bpo-13477.)

обтікання текстом

Клас TextWrapper має два нові атрибути/аргументи конструктора: max_lines, який обмежує кількість рядків у виводі, і placeholder, це рядок, який з’явиться в кінці виводу, якщо його було скорочено через max_lines. Спираючись на ці можливості, нова функція зручності shorten() згортає всі пробіли у вхідних даних до окремих пробілів і створює один рядок заданої ширини, який закінчується заповнювачем (за замовчуванням). , [...]). (Надано Антуаном Пітру та Сергієм Сторчакою в bpo-18585 та bpo-18725.)

різьблення

Об’єкт Thread, що представляє основний потік, можна отримати з нової функції main_thread(). У нормальних умовах це буде потік, з якого було запущено інтерпретатор Python. (Надав Ендрю Свєтлов у bpo-18882.)

простежити

Нова функція traceback.clear_frames() приймає об’єкт трасування та очищає локальні змінні в усіх кадрах, на які він посилається, зменшуючи обсяг споживаної пам’яті. (Надав Ендрю Кухлінг у bpo-1565525.)

види

Новий дескриптор DynamicClassAttribute() надає спосіб визначення атрибута, який працює нормально під час пошуку через об’єкт екземпляра, але який спрямовується до класу __getattr__ під час пошуку через клас . Це дозволяє мати активні властивості для класу та мати віртуальні атрибути для класу з таким же іменем (див. Enum для прикладу). (Надав Ітан Фурман у bpo-19030.)

urllib

urllib.request тепер підтримує URL-адреси data: через клас DataHandler. (Надав Матіас Панценбьок у bpo-16423.)

Метод http, який використовуватиметься класом Request, тепер можна вказати, встановивши атрибут класу method у підкласі. (Надав Джейсон Р. Кумбс у bpo-18978.)

Request об’єкти тепер можна повторно використовувати: якщо атрибути full_url або data змінено, усі оновлено відповідні внутрішні властивості. Це означає, наприклад, що тепер можна використовувати той самий об’єкт Request у кількох викликах OpenerDirector.open() з різними аргументами data або для змінити URL-адресу Request, а не перераховувати її з нуля. Існує також новий метод remove_header(), який можна використовувати для видалення заголовків із Request. (Надано Олексієм Качаєвим у bpo-16464, Даніелем Возняком у bpo-17485, а також Демієном Брехтом і Сентілом Кумараном у bpo-17272.)

Об’єкти HTTPError тепер мають атрибут headers, який надає доступ до заголовків відповіді HTTP, пов’язаних із помилкою. (Надано Berker Peksag у bpo-15701.)

unittest

The TestCase class has a new method, subTest(), that produces a context manager whose with block becomes a «sub-test». This context manager allows a test method to dynamically generate subtests by, say, calling the subTest context manager inside a loop. A single test method can thereby produce an indefinite number of separately-identified and separately-counted tests, all of which will run even if one or more of them fail. For example:

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

призведе до шести підтестів, кожен ідентифікований у докладному виведенні модульного тесту з міткою, що складається з назви змінної i та певного значення для цієї змінної (i=0, i=1, тощо). Перегляньте Розрізнення тестових ітерацій за допомогою субтестів повну версію цього прикладу. (Надав Антуан Пітру в bpo-16997.)

unittest.main() тепер приймає ітерацію імен тестів для defaultTest, тоді як раніше він приймав лише одну назву тесту як рядок. (Надав Юркі Пулляйнен у bpo-15132.)

Якщо SkipTest викликається під час виявлення тесту (тобто на рівні модуля у файлі тесту), це тепер повідомляється як пропуск замість помилки. (Надав Zach Ware у bpo-16935.)

discover() тепер сортує виявлені файли для забезпечення послідовного впорядкування тестів. (Надано Мартіном Меліном і Джеффом Рамнані в bpo-16709.)

TestSuite тепер видаляє посилання на тести, щойно тест було запущено, якщо тест успішний. В інтерпретаторах Python, які виконують збір сміття, це дозволяє тестам збиратися як сміття, якщо ніщо інше не містить посилання на тест. Цю поведінку можна перевизначити, створивши підклас TestSuite, який визначає спеціальний метод _removeTestAtIndex. (Надано Томом Уорділлом, Метом МакКлуром та Ендрю Свєтловим у bpo-11798.)

Новий контекстний менеджер тестових тверджень, assertLogs(), гарантує, що певний блок коду видає повідомлення журналу за допомогою модуля logging. За замовчуванням повідомлення може надходити з будь-якого реєстратора та мати пріоритет INFO або вищий, але можна вказати як назву реєстратора, так і альтернативний мінімальний рівень журналювання. Об’єкт, повернутий контекстним менеджером, може бути запитаний для LogRecords та/або відформатованих повідомлень, які були зареєстровані. (Надав Антуан Пітру в bpo-18937.)

Тестове виявлення тепер працює з пакетами простору імен (надано Клаудіу Попою в bpo-17457.)

Об’єкти unittest.mock тепер перевіряють свої сигнатури специфікації під час відповідних викликів, що означає, що аргумент тепер може бути зіставлений або за позицією, або за назвою, а не лише за позицією. (Надав Антуан Пітру в bpo-17015.)

mock_open() об’єкти тепер мають методи readline і readlines. (Надав Тошіо Куратомі в bpo-17467.)

venv

venv тепер містить скрипти активації для оболонок csh і fish. (Надав Ендрю Свєтлов у bpo-15417.)

EnvBuilder і функція зручності create() приймають новий аргумент ключового слова with_pip, який за замовчуванням має значення False, який контролює, чи EnvBuilder гарантує, що pip встановлено у віртуальному середовищі. (Надано Ніком Когланом у bpo-19552 як частину реалізації PEP 453.)

хвиля

Метод getparams() тепер повертає іменований кортеж, а не звичайний кортеж. (Надав Клаудіу Попа в bpo-17487.)

wave.open() тепер підтримує протокол керування контекстом. (Надав Клаудіу Попа в bpo-17616.)

wave тепер може записувати вихідні дані у файли, які неможливо шукати. (Надано Девідом Джонсом, Гільєрме Поло та Сергієм Сторчакою в bpo-5202.)

Методи writeframesraw() і writeframes() тепер приймають будь-які bytes-like object. (Надав Сергій Сторчака в bpo-8311.)

слабкий реф

Новий клас WeakMethod моделює слабкі посилання на зв’язані методи. (Надав Антуан Пітру в bpo-14631.)

Новий клас finalize дає змогу зареєструвати зворотний виклик, який буде викликаний, коли об’єкт збирається сміттям, без необхідності ретельно керувати життєвим циклом самого слабкого посилання. (Надав Річард Оудкерк у bpo-15528.)

Зворотний виклик, якщо такий є, пов’язаний із ref, тепер доступний через атрибут __callback__. (Надав Марк Дікінсон у bpo-17643.)

xml.etree

Новий парсер, XMLPullParser, дозволяє неблокуючим програмам аналізувати XML-документи. Приклад можна побачити на Pull API for non-blocking parsing. (Надав Антуан Пітру в bpo-17741.)

Функції xml.etree.ElementTree tostring() і tostringlist(), а також ElementTree write() метод, тепер має short_empty_elements ключовий параметр, що забезпечує контроль над тим, чи елементи без вмісту записуються скорочено (<tag />) або розгорнуту (<tag> </tag>) форму. (Надано Аріелем Поляком і Сергієм Сторчакою в bpo-14377.)

zip-файл

Метод writepy() класу PyZipFile має нову опцію filterfunc, за допомогою якої можна контролювати, які каталоги та файли додаються до архіву. Наприклад, це можна використовувати для виключення тестових файлів з архіву. (Надав Крістіан Тісмер у bpo-19274.)

Параметр allowZip64 для ZipFile і PyZipfile тепер має значення True за замовчуванням. (Надав Вільям Маллард у bpo-17201.)

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

PEP 445: Налаштування розподілювачів пам’яті CPython

PEP 445 додає нові інтерфейси рівня C для налаштування розподілу пам’яті в інтерпретаторі CPython.

Дивись також

PEP 445 – Додайте нові API для налаштування розподільників пам’яті Python

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

PEP 442: Завершення безпечного об’єкта

PEP 442 усуває поточні обмеження та особливості фіналізації об’єктів у CPython. З його допомогою об’єкти з методами __del__(), а також генератори з пропозиціями finally можуть бути завершені, коли вони є частиною еталонного циклу.

У рамках цієї зміни глобальні модулі більше не примусово встановлюються на None під час завершення роботи інтерпретатора в більшості випадків, натомість покладаються на звичайну роботу циклічного збирача сміття. Це дозволяє уникнути цілого класу помилок під час вимкнення інтерпретатора, які зазвичай стосуються методів __del__, які мучать Python з моменту введення циклічного GC.

Дивись також

PEP 442 – Безпечна фіналізація об’єкта

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

PEP 456: Безпечний і взаємозамінний хеш-алгоритм

PEP 456 є продовженням попередньої роботи з виправлення безпеки, виконаної в алгоритмі гешування Python для вирішення певних атак DOS, яким можуть піддаватися публічні API, що підтримуються пошуком у словнику. (Див. bpo-14621 для початку поточного раунду вдосконалень.) PEP уніфікує хеш-код CPython, щоб полегшити пакувальнику заміну іншого алгоритму хешування, і змінює реалізацію Python за замовчуванням на реалізацію SipHash на платформах які мають 64-бітний тип даних. Будь-які відмінності в продуктивності порівняно зі старим алгоритмом FNV незначні.

PEP додає додаткові поля до іменованого кортежу sys.hash_info для опису алгоритму хешування, який використовується двійковим файлом, що виконується наразі. В іншому випадку PEP не змінює існуючі API CPython.

PEP 436: Клініка аргументів

«Argument Clinic» (PEP 436) тепер є частиною процесу збирання CPython і може використовуватися для спрощення процесу визначення та підтримки точних підписів для вбудованих модулів і стандартних модулів розширення бібліотеки, реалізованих у C.

Деякі стандартні модулі розширення бібліотеки було перетворено на використання Argument Clinic у Python 3.4, а pydoc і inspect були відповідно оновлені.

Очікується, що метадані підпису для програмної інтроспекції будуть додані до додаткових викликів, реалізованих у C, як частина випусків обслуговування Python 3.4.

Примітка

PEP клініки Argument не повністю оновлює стан впровадження. Менеджер випуску та основна команда розробників визнали це прийнятним у цьому випадку, оскільки Argument Clinic не буде доступним як загальнодоступний API для використання третьою стороною в Python 3.4.

Дивись також

PEP 436 – The Argument Clinic DSL

PEP написаний і реалізований Ларрі Гастінгсом.

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

  • Нову функцію PyType_GetSlot() додано до стабільного ABI, що дозволяє отримувати покажчики функцій із слотів іменованих типів під час використання обмеженого API. (Надано Мартіном фон Льовісом у bpo-17162.)

  • Новий API попередньої ініціалізації Py_SetStandardStreamEncoding() дозволяє програмам, які вбудовують інтерпретатор CPython, надійно примусово застосовувати певне кодування та обробник помилок для стандартних потоків. (Надано Бастьєном Монтанем і Ніком Когланом у bpo-16129.)

  • Більшість Python C API, які не змінюють рядкові аргументи, тепер правильно позначені як такі, що приймають const char *, а не char *. (Надав Сергій Сторчака в bpo-1772673.)

  • Нову версію оболонки python-config можна використовувати, навіть якщо інтерпретатор python недоступний (наприклад, у сценаріях крос-компіляції).

  • PyUnicode_FromFormat() тепер підтримує специфікації ширини та точності для %s, %A, %U, %V, %S і %R. (Надано Ysj Ray і Victor Stinner у bpo-7330.)

  • Нова функція PyStructSequence_InitType2() доповнює існуючу функцію PyStructSequence_InitType(). Різниця полягає в тому, що він повертає 0 у разі успіху та -1 у випадку невдачі.

  • Вихідний код CPython тепер можна скомпілювати за допомогою функцій перевірки працездатності адрес останніх версій GCC і clang: помилкові тривоги в розподільнику невеликих об’єктів було вимкнуто. (Надано Dhiru Kholia в bpo-18596.)

  • У збірці Windows тепер використовуються Address Space Layout Randomization і Data Execution Prevention. (Надав Крістіан Хеймс у bpo-16632.)

  • Нова функція PyObject_LengthHint() є еквівалентом C API operator.length_hint(). (Надав Армін Роначер у bpo-16148.)

Інші вдосконалення

  • Команда python має нову опцію, -I, яка змушує її працювати в «ізольованому режимі», що означає, що sys.path містить ані каталог сценарію, ані каталог site-packages користувача, а також усі змінні середовища PYTHON* ігноруються (це означає як -s, так і -E). Інші обмеження також можуть бути застосовані в майбутньому з метою ізоляції виконання сценарію від середовища користувача. Це доречно, наприклад, коли Python використовується для запуску системного сценарію. У більшості систем POSIX його можна і потрібно використовувати в рядку #! системних сценаріїв. (Надав Крістіан Хеймс у bpo-16499.)

  • Завершення табуляції тепер увімкнено за замовчуванням в інтерактивному інтерпретаторі в системах, які підтримують readline. Історія також увімкнена за замовчуванням і записується (і зчитується) у файл ~/.python-history. (Надано Антуаном Пітру та Еріком Араужо в bpo-5845.)

  • Виклик інтерпретатора Python за допомогою --version тепер виводить версію на стандартний вивід замість стандартної помилки (bpo-18338). Подібні зміни було внесено до argparse (bpo-18920) та інших модулів, які мають можливості виклику, подібні до сценарію (bpo-18922).

  • Інсталятор CPython Windows тепер додає .py до змінної PATHEXT, коли зареєстровано розширення, дозволяючи користувачам запускати сценарій python у командному рядку Windows, просто ввівши його назву без .py розширення. (Надав Пол Мур у bpo-18569.)

  • A new make target coverage-report will build python, run the test suite, and generate an HTML coverage report for the C codebase using gcov and lcov.

  • Параметр -R для набору регресійних тестів python тепер також перевіряє наявність витоків розподілу пам’яті за допомогою sys.getallocatedblocks(). (Надав Антуан Пітру в bpo-13390.)

  • python -m тепер працює з пакетами простору імен.

  • Модуль stat тепер реалізовано в C, що означає, що він отримує значення для своїх констант із файлів заголовків C замість того, щоб мати жорстко закодовані значення в модулі python, як це було раніше.

  • Завантаження кількох модулів python з одного модуля ОС (.so, .dll) тепер працює правильно (раніше він мовчки повертав перший модуль python у файлі). (Надав Вацлав Шмілауер у bpo-16421.)

  • Додано новий код операції, LOAD_CLASSDEREF, щоб виправити помилку під час завантаження вільних змінних у тілах класів, яка могла бути викликана певним використанням __prepare__. (Надав Бенджамін Петерсон у bpo-17853.)

  • Кілька збоїв, пов’язаних із MemoryError, було виявлено та виправлено Віктором Стіннером за допомогою його інструменту pyfailmalloc на основі PEP 445 (bpo-18408, bpo-18520).

  • Команда pyvenv тепер приймає опцію --copies для використання копій замість символічних посилань навіть у системах, де символічні посилання є типовими. (Надав Віней Саджип у bpo-18807.)

  • Команда pyvenv також приймає опцію --without-pip, щоб придушити автоматичне завантаження pip у віртуальне середовище. (Надано Ніком Когланом у bpo-19552 як частину реалізації PEP 453.)

  • Назва кодування тепер є необов’язковою для значення, установленого для змінної середовища PYTHONIOENCODING. Це дає змогу встановити лише обробник помилок, не змінюючи стандартне кодування. (Надав Сергій Сторчака в bpo-18818.)

  • Функції open модуля bz2, lzma і gzip тепер підтримують режим x (ексклюзивне створення). (Надано Тімом Хіні та Ваджраскі Коком у bpo-19201, bpo-19222 та bpo-19223.)

Значні оптимізації

  • Декодер UTF-32 тепер у 3-4 рази швидший. (Надав Сергій Сторчака в bpo-14625.)

  • Вартість хеш-колізій для наборів тепер зменшена. Кожен зонд хеш-таблиці тепер перевіряє серію послідовних суміжних пар ключ/хеш, перш ніж продовжувати робити випадкові зонди через хеш-таблицю. Це використовує локальність кешу, щоб зробити вирішення колізій менш дорогим. Схему вирішення колізій можна описати як гібрид лінійного зондування та відкритої адресації. Кількість додаткових лінійних зондів за замовчуванням становить дев’ять. Це можна змінити під час компіляції, визначивши LINEAR_PROBES будь-яким значенням. Встановіть LINEAR_PROBES=0, щоб повністю вимкнути лінійне зондування. (Надав Реймонд Геттінгер у bpo-18771.)

  • Інтерпретатор запускається приблизно на 30% швидше. Кілька заходів призводять до прискорення. Інтерпретатор завантажує менше модулів під час запуску, напр. модулі re, collections і locale та їхні залежності більше не імпортуються за замовчуванням. Модуль marshal було покращено, щоб швидше завантажувати скомпільований код Python. (Надано Антуаном Пітру, Крістіаном Хеймсом і Віктором Стіннером у bpo-19219, bpo-19218, bpo-19209, bpo-19205 і bpo-9548.)

  • bz2.BZ2File тепер такий же або швидший, ніж версія Python2 у більшості випадків. lzma.LZMAFile також було оптимізовано. (Надано Сергієм Сторчакою та Надімом Вавдою в bpo-16034.)

  • random.getrandbits() на 20%-40% швидше для малих цілих чисел (найпоширеніший варіант використання). (Надав Сергій Сторчака в bpo-16674.)

  • Використовуючи переваги нового формату зберігання струн, декаплювання струн тепер відбувається значно швидше. (Надано Віктором Стіннером і Антуаном Пітру в bpo-15596.)

  • Проблему продуктивності в io.FileIO.readall() було вирішено. Це особливо впливає на Windows і значно прискорює передачу значної кількості даних через subprocess. (Надав Річард Оудкерк у bpo-15758.)

  • html.escape() тепер у 10 разів швидший. (Надав Метт Брайант у bpo-18020.)

  • У Windows рідний VirtualAlloc тепер використовується замість CRT malloc в obmalloc. Штучні бенчмарки показують близько 3% економії пам’яті.

  • os.urandom() now uses a lazily-opened persistent file descriptor so as to avoid using many file descriptors when run in parallel from multiple threads. (Contributed by Antoine Pitrou in bpo-18756.)

Застаріле

Цей розділ охоплює різні API та інші функції, які застаріли в Python 3.4 і будуть видалені в Python 3.5 або пізнішої версії. У більшості (але не у всіх) випадках використання застарілих API призведе до появи DeprecationWarning, коли інтерпретатор запускається з увімкненими попередженнями про застаріле (наприклад, за допомогою -Wd).

Застарілі API Python

Застарілі функції

  • Запуск IDLE з прапором -n (без підпроцесу) застарів. Однак цю функцію не буде видалено, доки не буде вирішено bpo-18823.

  • Модуль сайту, який додає каталог «site-python» до sys.path, якщо він існує, вважається застарілим (bpo-19375).

Видалено

Операційні системи більше не підтримуються

Підтримку таких операційних систем видалено з джерела та інструментів збірки:

  • OS/2 (bpo-16135).

  • Windows 2000 (набір змін e52df05b496a).

  • Системи Windows, де COMSPEC вказує на command.com (bpo-14470).

  • VMS (bpo-16136).

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

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

  • Непідтримувані каталоги Misc/TextMate і Misc/vim було видалено (перегляньте devguide, щоб дізнатися, що використовувати натомість).

  • Макрос makefile SO видалено (його замінено макросами SHLIB_SUFFIX і EXT_SUFFIX) (bpo-16754).

  • Поле PyThreadState.tick_counter було видалено; його значення не має сенсу з Python 3.2, коли було представлено «новий GIL» (bpo-19199).

  • PyLoader і PyPycLoader видалено з importlib. (Надав Тарас Ляпун у bpo-15641.)

  • Аргумент строгий для HTTPConnection і HTTPSConnection видалено. «Прості відповіді» у стилі HTTP 0.9 більше не підтримуються.

  • Застарілі urllib.request.Request методи отримання та встановлення add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host і is_unverifiable були видалені (замість цього використовуйте прямий доступ до атрибутів).

  • Підтримку завантаження застарілого TYPE_INT64 було видалено з marshal. (Надав Ден Ріті в bpo-15480.)

  • inspect.Signature: лише позиційні параметри тепер повинні мати дійсне ім’я.

  • object.__format__() більше не приймає непорожні рядки формату, замість цього він викликає TypeError. Використання непорожнього рядка застаріло з Python 3.2. Цю зміну було внесено, щоб запобігти ситуації, коли раніше працюючий (але неправильний) код почав виходити з ладу, якщо об’єкт отримав метод __format__, що означає, що ваш код тепер може викликати TypeError, якщо ви використовуєте Код формату 's' з об’єктами, які не мають методу __format__, який його обробляє. Див. bpo-7994 для довідкової інформації.

  • difflib.SequenceMatcher.isbjunk() і difflib.SequenceMatcher.isbpopular() були застарілими в 3.2, і тепер їх видалено: використовуйте x в sm.bjunk і x в sm.bpopular, де sm є об’єктом SequenceMatcher (bpo-13248).

Очищення коду

  • Невикористаний і недокументований внутрішній клас Scanner було видалено з модуля pydoc.

  • Приватний і фактично невикористаний модуль _gestalt було видалено разом із приватними функціями platform _mac_ver_lookup, _mac_ver_gstalt і _bcd2str, які б тільки коли-небудь викликано на сильно зламаних системах OSX (див. bpo-18393).

  • Жорстко закодовані копії певних констант stat, які були включені в простір імен модуля tarfile, було видалено.

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

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

Зміни в поведінці команд «python».

  • У posix-оболонці встановлення змінної середовища PATH на порожнє значення еквівалентно невстановленню її взагалі. Однак встановлення PYTHONPATH на порожнє значення не еквівалентно тому, що його не встановлювати взагалі: встановлення PYTHONPATH на порожнє значення було еквівалентно встановленню його на ., що призводить до до плутанини, міркуючи за аналогією з тим, як працює PATH. Поведінка тепер відповідає угоді posix для PATH.

  • [X refs, Y blocks] вихід збірки налагодження (--with-pydebug) інтерпретатора CPython тепер вимкнено за замовчуванням. Його можна повторно ввімкнути за допомогою параметра -X showrefcount. (Надав Еціо Мелотті в bpo-17323.)

  • Команда python і більшість сценаріїв stdlib (а також argparse) тепер виводять інформацію --version на stdout замість stderr (перелік проблем див. Інші вдосконалення вище).

Зміни в API Python

  • ABC, визначені в importlib.abc, тепер або викликають відповідний виняток, або повертають значення за замовчуванням замість виклику NotImplementedError наосліп. Це вплине лише на код, що викликає super() і потрапляє до ABC. Для сумісності перехопіть обидва NotImplementedError або відповідний виняток за потреби.

  • Тип модуля тепер ініціалізує атрибути __package__ і __loader__ як None за замовчуванням. Щоб визначити, чи ці атрибути були встановлені у зворотній сумісності, використовуйте, наприклад. getattr(module, '__loader__', None) не є None. (bpo-17115.)

  • importlib.util.module_for_loader() тепер безумовно встановлює __loader__ і __package__ для належної підтримки перезавантаження. Якщо це небажано, вам потрібно буде встановити ці атрибути вручну. Ви можете використовувати importlib.util.module_to_load() для керування модулями.

  • Імпорт тепер безумовно скидає відповідні атрибути (наприклад, __name__, __loader__, __package__, __file__, __cached__) під час перезавантаження. Зауважте, що це відновлює поведінку до 3.3, оскільки це означає, що модуль повторно знайдено під час повторного завантаження (bpo-19413).

  • Заморожені пакунки більше не встановлюють __path__ як список, що містить назву пакета, тепер вони встановлюють його як порожній список. Попередня поведінка могла спричинити неправильну дію системи імпорту під час імпорту підмодуля, якщо існував також каталог із такою ж назвою, як і заморожений пакет. Правильний спосіб визначити, чи є модуль пакетом чи ні, це використати hasattr(module, '__path__') (bpo-18065).

  • Заморожені модулі більше не визначають атрибут __file__. Для заморожених модулів семантично неправильно встановлювати атрибут, оскільки вони не завантажуються з будь-якого явного місця. Якщо вам потрібно знати, що модуль походить із замороженого коду, ви можете побачити, чи __spec__.location модуля встановлено на 'frozen', перевірте, чи завантажувач є підкласом importlib. machinery.FrozenImporter, або, якщо потрібна сумісність з Python 2, ви можете використовувати imp.is_frozen().

  • py_compile.compile() тепер викликає FileExistsError, якщо шлях до файлу, куди він буде писати, є символічним посиланням або незвичайним файлом. Це є попередженням про те, що імпортування перезапише ці файли звичайним файлом незалежно від того, яким типом шляху до файлу вони були спочатку.

  • importlib.abc.SourceLoader.get_source() більше не викликає ImportError, коли вихідний код, що завантажується, викликає SyntaxError або UnicodeDecodeError. Оскільки помилка ImportError має виникати лише тоді, коли вихідний код не може бути знайдений, але він має бути знайдений, було зрозуміло, що це означає надмірне/перевантажене значення, коли вихідний код знайдено, але неналежно структурований. Якщо ви раніше виявляли помилку ImportError і бажаєте й надалі ігнорувати проблеми з синтаксисом або декодуванням, виловіть усі три винятки зараз.

  • functools.update_wrapper() і functools.wraps() тепер правильно встановлюють атрибут __wrapped__ для функції, яку обгортають, навіть якщо ця функція також має свій атрибут __wrapped__. Це означає, що атрибути __wrapped__ тепер правильно пов’язують стек декорованих функцій, а не кожен атрибут __wrapped__ у ланцюжку, який посилається на найвнутрішню функцію. Бібліотеки самоаналізу, які припускали, що попередня поведінка була навмисною, можуть використовувати inspect.unwrap() для доступу до першої функції в ланцюжку, яка не має атрибута __wrapped__.

  • inspect.getfullargspec() було повторно реалізовано поверх inspect.signature() і, отже, обробляє набагато більше різноманітних викликаних об’єктів, ніж це було в минулому. Очікується, що додаткові вбудовані модулі та модулі розширення отримають метадані підпису протягом серії Python 3.4. Код, який припускає, що inspect.getfullargspec() не вдасться викликати виклики, відмінні від Python, може потребувати відповідних змін.

  • importlib.machinery.PathFinder тепер передає поточний робочий каталог об’єктам у sys.path_hooks для порожнього рядка. Це призводить до того, що sys.path_importer_cache ніколи не містить '', тому ітерація через sys.path_importer_cache на основі sys.path не знайде всіх ключів. __file__ модуля під час імпорту в поточний робочий каталог також тепер матиме абсолютний шлях, включно з використанням -m з інтерпретатором (за винятком __main__.__file__, коли сценарій було виконано безпосередньо за допомогою відносного шляху) (надано Бреттом Кенноном у bpo-18416). вказується в командному рядку) (bpo-18416).

  • Видалення аргументу strict для HTTPConnection і HTTPSConnection змінює значення решти аргументів, якщо ви вказуєте їх позиційно, а не за ключовим словом. Якщо ви звертали увагу на застереження щодо застарілості, ваш код уже має вказувати додаткові аргументи за допомогою ключових слів.

  • Рядки між операторами from __future__ import ... тепер завжди викликають SyntaxError. Раніше, якщо не було початкового рядка документації, проміжний рядок іноді ігнорувався. Це приводить CPython у відповідність зі специфікацією мови; Jython і PyPy вже були. (bpo-17434).

  • ssl.SSLSocket.getpeercert() і ssl.SSLSocket.do_handshake() тепер викликають OSError з ENOTCONN, коли SSLSocket не підключено, замість попередня поведінка виклику AttributeError. Крім того, getpeercert() викличе ValueError, якщо рукостискання ще не виконано.

  • base64.b32decode() тепер викликає binascii.Error, коли вхідний рядок містить символи, відмінні від b32-алфавіту, замість TypeError. Ця конкретна TypeError була пропущена під час перетворення інших TypeError. (Надано Сергієм Сторчакою в bpo-18011.) Примітка: цю зміну також було випадково застосовано в Python 3.3.3.

  • Атрибут file тепер автоматично закривається, коли створюваний екземпляр cgi.FieldStorage збирається як сміття. Якщо ви витягували об’єкт файлу окремо від екземпляра cgi.FieldStorage і не зберігали екземпляр живим, то вам слід або зберегти весь екземпляр cgi.FieldStorage, або прочитати вміст файлу до того, як екземпляр cgi.FieldStorage буде зібрано сміттям.

  • Виклик read або write у закритому SSL-сокеті тепер викликає інформативну ValueError, а не попередню більш загадкову AttributeError (bpo-9177).

  • slice.indices() більше не створює OverflowError для великих значень. Як наслідок цього виправлення, slice.indices() тепер викликає ValueError, якщо задано від’ємну довжину; раніше він повертав безглузді значення (bpo-14794).

  • Конструктор complex, на відміну від функцій cmath, неправильно приймав значення float, якщо спеціальний метод __complex__ об’єкта повертав одне. Тепер це викликає TypeError. (bpo-16290.)

  • Конструктор int у версіях 3.2 і 3.3 помилково приймає значення float для параметра base. Навряд чи хтось це робив, але якщо так, то тепер це викличе TypeError (bpo-16772).

  • Значення за замовчуванням для аргументів лише ключових слів тепер оцінюються після значень за замовчуванням для звичайних аргументів ключових слів, а не раніше. Сподіваюся, ніхто не написав код, який би залежав від попередньої поведінки з помилками (bpo-16967).

  • Застарілі стани потоку тепер очищаються після fork(). Це може спричинити звільнення деяких системних ресурсів, які раніше неправильно зберігалися безперервно активними (наприклад, підключення до бази даних, що зберігаються в локальному сховищі потоку). (bpo-17094.)

  • Назви параметрів у __annotations__ dicts тепер змінюються належним чином, подібно до __kwdefaults__. (Надав Юрій Селіванов у bpo-20625.)

  • hashlib.hash.name тепер завжди повертає ідентифікатор у нижньому регістрі. Раніше деякі вбудовані хеші мали назви у верхньому регістрі, але тепер, коли це офіційний загальнодоступний інтерфейс, іменування стало узгодженим (bpo-18532).

  • Оскільки unittest.TestSuite тепер видаляє посилання на тести після їх виконання, тестові пакети, які повторно використовують TestSuite для повторного запуску набору тестів, можуть не працювати. Набори тестів не слід повторно використовувати таким чином, оскільки це означає, що стан зберігається між тестовими запусками, порушуючи ізоляцію тесту, яку unittest створено для забезпечення. Однак, якщо відсутність ізоляції вважається прийнятною, стару поведінку можна відновити шляхом створення підкласу TestSuite, який визначає метод _removeTestAtIndex, який нічого не робить (див. TestSuite .__iter__()) (bpo-11798).

  • unittest тепер використовує argparse для аналізу командного рядка. Існують певні недійсні форми команд, які раніше працювали, але більше не дозволені; теоретично це не повинно викликати проблем із зворотною сумісністю, оскільки заборонені форми команд не мали жодного сенсу та навряд чи будуть використовуватися.

  • Функції re.split(), re.findall() і re.sub(), а також group() і Методи groups() об’єктів match тепер завжди повертають об’єкт bytes, коли рядок, який потрібно знайти, є bytes-like object. Раніше тип повернення відповідав типу введення, тому, якщо ваш код залежав від значення, яке повертається, скажімо, як bytearray, вам потрібно буде змінити свій код.

  • Функції audioop тепер викликають помилку відразу після введення рядка, замість того, щоб випадково виходити з ладу пізніше (bpo-16685).

  • Новий аргумент convert_charrefs для HTMLParser наразі має значення False для зворотної сумісності, але з часом буде змінено на True. Рекомендовано додати це ключове слово з відповідним значенням до будь-яких викликів HTMLParser у вашому коді (bpo-13633).

  • Оскільки аргумент digestmod для функції hmac.new() у майбутньому не матиме значення за замовчуванням, усі виклики до hmac.new() слід змінити, щоб явно вказати digestmod (bpo-17276).

  • Виклик sysconfig.get_config_var() за допомогою ключа SO або пошук SO у результатах виклику sysconfig.get_config_vars() є застарілим. Цей ключ слід замінити на EXT_SUFFIX або SHLIB_SUFFIX, залежно від контексту (bpo-19555).

  • Будь-які виклики функцій open, які вказують U, слід змінити. U неефективний у Python3 і зрештою викличе помилку, якщо його використовувати. Залежно від функції, еквівалент її старої поведінки Python2 може бути досягнутий за допомогою аргументу нового рядка або, якщо необхідно, загортання потоку в TextIOWrapper для використання його аргументу нового рядка (bpo-15204).

  • Якщо ви використовуєте pyvenv у сценарії та бажаєте, щоб pip не був встановлений, ви повинні додати --without-pip до виклику вашої команди.

  • Поведінка за замовчуванням json.dump() і json.dumps(), коли вказано відступ, змінилася: він більше не створює кінцевих пробілів після елемента, що розділяє коми в кінцях рядків. Це матиме значення, лише якщо у вас є тести, які виконують чутливі до пробілів порівняння такого результату (bpo-16333).

  • doctest тепер шукає doctests у рядках модуля розширення __doc__, тож якщо ваш тест doctest включає модулі розширення, які містять речі, схожі на doctests, ви можете побачити помилки тестування, яких ніколи раніше не бачили, коли виконання ваших тестів (bpo-3158).

  • Модуль collections.abc було дещо перероблено в рамках покращення запуску Python. Як наслідок цього, імпорт collections автоматично імпортує collections.abc. Якщо ваша програма залежала від (недокументованого) неявного імпорту, вам потрібно буде додати явний import collections.abc (bpo-20784).

Зміни в C API

  • PyEval_EvalFrameEx(), PyObject_Repr() і PyObject_Str(), а також деякі інші внутрішні API C тепер включають твердження про налагодження, яке гарантує, що вони не використовуються в ситуаціях, коли вони можуть мовчки відхилити поточний активний виняток. У випадках, коли скасування активного винятку є очікуваним і бажаним (наприклад, оскільки його вже було збережено локально за допомогою PyErr_Fetch() або навмисно замінено іншим винятком), явний виклик PyErr_Clear() буде потрібний, щоб уникнути запуску твердження під час виклику цих операцій (прямо чи опосередковано) і роботи з версією Python, яка скомпільована з увімкненими твердженнями.

  • PyErr_SetImportError() тепер встановлює TypeError, коли його аргумент msg не встановлено. Раніше повертався лише NULL без набору винятків.

  • Результатом зворотного виклику PyOS_ReadlineFunctionPointer тепер має бути рядок, виділений PyMem_RawMalloc() або PyMem_RawRealloc(), або NULL, якщо сталася помилка, натомість рядка, виділеного PyMem_Malloc() або PyMem_Realloc() (bpo-16742)

  • PyThread_set_key_value() тепер завжди встановлює значення. У Python 3.3 функція нічого не робила, якщо ключ уже існує (якщо поточне значення не є вказівником NULL).

  • Поле f_tstate (стан потоку) структури PyFrameObject було видалено, щоб виправити помилку: див. bpo-14432 для обґрунтування.

Змінено в 3.4.3

PEP 476: увімкнення перевірки сертифіката за замовчуванням для http-клієнтів stdlib

http.client і модулі, які його використовують, такі як urllib.request і xmlrpc.client, тепер перевірятимуть, чи надає сервер сертифікат, підписаний ЦС у довіреного сховища платформи, і чиє ім’я хоста збігається з ім’ям хоста, яке запитується за замовчуванням, що значно покращує безпеку для багатьох програм.

Для програм, які вимагають старої попередньої поведінки, вони можуть передавати альтернативний контекст:

import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)