Що нового в 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.

As discussed in the PEP platform packagers may choose not to install these commands by default, as long as, when invoked, they provide clear and simple directions on how to install them on that platform (usually using the system package manager).

Примітка

Щоб уникнути конфліктів між паралельними інсталяціями 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 і документація окремих проектів.

However, as this migration is currently still incomplete, the legacy versions of those guides remaining available as Building C and C++ Extensions with setuptools and Building C and C++ Extensions with setuptools.

Дивись також

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 weakly referenceable.

  • Атрибути модуля __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 містить укомплектовану копію pip, оновлену до першого випуску-кандидата випуску CPython, з яким він поставляється (це стосується як випусків підтримки, так і випусків функцій). ensurepip не має доступу до Інтернету. Якщо інсталяція має доступ до Інтернету, після запуску ensurepip пакетний pip можна використовувати для оновлення pip до новішого випуску, ніж пакетний випуск. (Зверніть увагу, що така оновлена версія pip вважається окремо встановленим пакетом і не буде видалена, якщо Python буде видалено.)

Модуль називається 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

The getparams() method now returns a namedtuple rather than a plain tuple. (Contributed by Claudiu Popa in bpo-17818.)

aifc.open() now supports the context management protocol: when used in a with block, the close() method of the returned object will be called automatically at the end of the block. (Contributed by Serhiy Storchacha in bpo-16486.)

The writeframesraw() and writeframes() methods now accept any bytes-like object. (Contributed by Serhiy Storchaka in bpo-8311.)

argparse

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

аудіооп

audioop now supports 24-bit samples. (Contributed by Serhiy Storchaka in bpo-12866.)

New byteswap() function converts big-endian samples to little-endian and vice versa. (Contributed by Serhiy Storchaka in bpo-19641.)

All audioop functions now accept any bytes-like object. Strings are not accepted: they didn’t work before, now they raise an error right away. (Contributed by Serhiy Storchaka in 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

A new option flag, FAIL_FAST, halts test running as soon as the first failure is detected. (Contributed by R. David Murray and Daniel Urban in 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.)

New module attribute DEFAULT_IGNORES provides the list of directories that are used as the default value for the ignore parameter of the dircmp() function. (Contributed by Eli Bendersky in bpo-15442.)

functools

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

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

Дивись також

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

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

total_ordering() now supports a return value of NotImplemented from the underlying comparison function. (Contributed by Katie Miller in 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.)

The reload() function has been moved from imp to importlib as part of the imp module deprecation. (Contributed by Berker Peksag in bpo-18193.)

importlib.util now has a MAGIC_NUMBER attribute providing access to the bytecode version number. This replaces the get_magic() function in the deprecated imp module. (Contributed by Brett Cannon in bpo-18192.)

New importlib.util functions cache_from_source() and source_from_cache() replace the same-named functions in the deprecated imp module. (Contributed by Brett Cannon in 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 are now weakly referenceable. (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() supports two new flags on platforms that provide them, O_PATH (un-opened file descriptor), and O_TMPFILE (unnamed temporary file; as of 3.4.0 release available only on Linux systems with a kernel version of 3.11 or newer that have uapi headers). (Contributed by Christian Heimes in bpo-18673 and Benjamin Peterson, respectively.)

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 now has an API that is similar to the standard pattern for stdlib serialization protocols, with new load(), dump(), loads(), and dumps() functions. (The older API is now deprecated.) In addition to the already supported XML plist format (FMT_XML), it also now supports the binary plist format (FMT_BINARY). (Contributed by Ronald Oussoren and others in 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.)

On Linux kernel version 2.6.36 or later, there are also some new Linux specific constants: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME, and RLIMIT_SIGPENDING. (Contributed by Christian Heimes in bpo-19324.)

On FreeBSD version 9 and later, there some new FreeBSD specific constants: RLIMIT_SBSIZE, RLIMIT_SWAP, and RLIMIT_NPTS. (Contributed by Claudiu Popa in 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

The SMTPServer and SMTPChannel classes now accept a map keyword argument which, if specified, is passed in to asynchat.async_chat as its map argument. This allows an application to avoid affecting the global socket map. (Contributed by Vinay Sajip in bpo-11959.)

smtplib

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

гніздо

The socket module now supports the CAN_BCM protocol on platforms that support it. (Contributed by Brian Thorne in bpo-15359.)

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

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

The AF_LINK constant is now available on BSD and 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.)

If OpenSSL 0.9.8 or later is available, SSLContext has a new attribute verify_flags that can be used to control the certificate verification process by setting it to some combination of the new constants VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, or VERIFY_X509_STRICT. OpenSSL does not do any CRL verification by default. (Contributed by Christien Heimes in 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.)

стат

The stat module is now backed by a C implementation in _stat. A C implementation is required as most of the values aren’t standardized and are platform-dependent. (Contributed by Christian Heimes in bpo-11016.)

The module supports new ST_MODE flags, S_IFDOOR, S_IFPORT, and S_IFWHT. (Contributed by Christian Hiemes in 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

The getparams() method now returns a namedtuple rather than a plain tuple. (Contributed by Claudiu Popa in bpo-18901.)

sunau.open() now supports the context management protocol: when used in a with block, the close method of the returned object will be called automatically at the end of the block. (Contributed by Serhiy Storchaka in bpo-18878.)

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

The writeframesraw() and writeframes() methods now accept any bytes-like object. (Contributed by Serhiy Storchaka in 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 незначні.

The PEP adds additional fields to the sys.hash_info named tuple to describe the hash algorithm in use by the currently executing binary. Otherwise, the PEP does not alter any existing CPython APIs.

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.)

  • The new Py_SetStandardStreamEncoding() pre-initialization API allows applications embedding the CPython interpreter to reliably force a particular encoding and error handler for the standard streams. (Contributed by Bastien Montagne and Nick Coghlan in 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.)

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

  • The python command has a new option, -I, which causes it to run in «isolated mode», which means that sys.path contains neither the script’s directory nor the user’s site-packages directory, and all PYTHON* environment variables are ignored (it implies both -s and -E). Other restrictions may also be applied in the future, with the goal being to isolate the execution of a script from the user’s environment. This is appropriate, for example, when Python is used to run a system script. On most POSIX systems it can and should be used in the #! line of system scripts. (Contributed by Christian Heimes in 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.

  • The -R option to the python regression test suite now also checks for memory allocation leaks, using sys.getallocatedblocks(). (Contributed by Antoine Pitrou in 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

  • As mentioned in PEP 451: тип ModuleSpec для системи імпорту, a number of importlib methods and functions are deprecated: importlib.find_loader() is replaced by importlib.util.find_spec(); importlib.machinery.PathFinder.find_module() is replaced by importlib.machinery.PathFinder.find_spec(); importlib.abc.MetaPathFinder.find_module() is replaced by importlib.abc.MetaPathFinder.find_spec(); importlib.abc.PathEntryFinder.find_loader() and find_module() are replaced by importlib.abc.PathEntryFinder.find_spec(); all of the xxxLoader ABC load_module methods (importlib.abc.Loader.load_module(), importlib.abc.InspectLoader.load_module(), importlib.abc.FileLoader.load_module(), importlib.abc.SourceLoader.load_module()) should no longer be implemented, instead loaders should implement an exec_module method (importlib.abc.Loader.exec_module(), importlib.abc.InspectLoader.exec_module() importlib.abc.SourceLoader.exec_module()) and let the import system take care of the rest; and importlib.abc.Loader.module_repr(), importlib.util.module_for_loader(), importlib.util.set_loader(), and importlib.util.set_package() are no longer needed because their functions are now handled automatically by the import system.

  • The imp module is pending deprecation. To keep compatibility with Python 2/3 code bases, the module’s removal is currently not scheduled.

  • Модуль formatter очікує на припинення підтримки та планується для видалення в Python 3.6.

  • MD5 як типовий digestmod для функції hmac.new() не підтримується. Python 3.6 вимагатиме явної назви дайджесту або конструктора як аргументу digestmod.

  • Внутрішній клас Netrc у модулі ftplib був задокументований як застарілий у його рядку документації протягом досить тривалого часу. Тепер він видає DeprecationWarning і буде повністю видалено в Python 3.5.

  • Недокументований аргумент endtime для subprocess.Popen.wait() не мав бути відкритим і, сподіваємось, не використовується; він застарів і, швидше за все, буде видалений у Python 3.5.

  • Аргумент строгий HTMLParser застарів.

  • Функції plistlib readPlist(), writePlist(), readPlistFromBytes() і writePlistToBytes() застаріли на користь відповідних нових функцій load(), dump(), loads() і dumps(). Data() застаріло на користь простого використання конструктора bytes.

  • Ключ sysconfig SO застарів, його замінено на EXT_SUFFIX.

  • Режим U, прийнятий різними функціями open, застарів. У Python3 це не робить нічого корисного, і його слід замінити відповідним використанням io.TextIOWrapper (якщо потрібно) і його аргументу нового рядка.

  • Аргумент parser xml.etree.ElementTree.iterparse() не підтримується, як і аргумент html XMLParser(). Щоб підготуватися до видалення останнього, усі аргументи XMLParser повинні бути передані за ключовим словом.

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

  • Запуск 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 або відповідний виняток за потреби.

  • The module type now initializes the __package__ and __loader__ attributes to None by default. To determine if these attributes were set in a backwards-compatible fashion, use e.g. getattr(module, '__loader__', None) is not None. (bpo-17115.)

  • importlib.util.module_for_loader() now sets __loader__ and __package__ unconditionally to properly support reloading. If this is not desired then you will need to set these attributes manually. You can use importlib.util.module_to_load() for module management.

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

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

  • Frozen modules no longer define a __file__ attribute. It’s semantically incorrect for frozen modules to set the attribute as they are not loaded from any explicit location. If you must know that a module comes from frozen code then you can see if the module’s __spec__.location is set to 'frozen', check if the loader is a subclass of importlib.machinery.FrozenImporter, or if Python 2 compatibility is necessary you can use 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.

  • The file attribute is now automatically closed when the creating cgi.FieldStorage instance is garbage collected. If you were pulling the file object out separately from the cgi.FieldStorage instance and not keeping the instance alive, then you should either store the entire cgi.FieldStorage instance or read the contents of the file before the cgi.FieldStorage instance is garbage collected.

  • Виклик 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.)

  • Parameter names in __annotations__ dicts are now mangled properly, similarly to __kwdefaults__. (Contributed by Yury Selivanov in bpo-20625.)

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

  • Because unittest.TestSuite now drops references to tests after they are run, test harnesses that reuse a TestSuite to re-run a set of tests may fail. Test suites should not be re-used in this fashion since it means state is retained between test runs, breaking the test isolation that unittest is designed to provide. However, if the lack of isolation is considered acceptable, the old behavior can be restored by creating a TestSuite subclass that defines a _removeTestAtIndex method that does nothing (see TestSuite.__iter__()) (bpo-11798).

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

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

  • audioop functions now raise an error immediately if passed string input, instead of failing randomly later on (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)