# Що нового в 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 не було додано нових функцій синтаксису.

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

- pip завжди має бути доступним (PEP 453).

- Новостворені дескриптори файлів не успадковуються (PEP 446).

- параметр командного рядка для ізольованого режиму (bpo-16499).

- покращення в обробці кодеків, які не є текстовими кодуваннями (кілька проблем).

- A ModuleSpec Type для системи імпорту (PEP 451). (Впливає на авторів-імпортерів.)

- Формат `marshal` зроблено компактнішим і ефективнішим (bpo-16475).

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

- `asyncio`: Новий тимчасовий API для асинхронного введення-виведення (PEP 3156).

- `ensurepip`: Завантаження інсталятора pip (PEP 453).

- `enum`: Підтримка типів перерахування (PEP 435).

- `pathlib`: Шляхи об’єктно-орієнтованої файлової системи (PEP 428).

- `selectors`: Високорівневе й ефективне мультиплексування введення/виведення, побудоване на примітивах модуля `select` (частина PEP 3156).

- `statistics`: базова бібліотека чисельно стабільної статистики (PEP 450).

- `tracemalloc`: Відстеження розподілу пам’яті Python (PEP 454).

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

- Загальні функції одноразового відправлення у `functools` (PEP 443).

- Новий `pickle` протокол 4 (PEP 3154).

- `multiprocessing` тепер має опцію, щоб уникнути використання os.fork на Unix (bpo-8713).

- `email` має новий підмодуль `contentmanager` і новий підклас `Message` (`EmailMessage`), який спрощення обробки MIME (bpo-18891).

- Модулі `inspect` і `pydoc` тепер здатні до правильного аналізу набагато ширшого спектру викликаних об’єктів, що покращує результат роботи системи `help()` Python.

- API модуля `ipaddress` оголошено стабільним

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

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

- Зробити новостворені дескриптори файлів неуспадкованими (PEP 446), щоб уникнути витоку дескрипторів файлів у дочірні процеси.

- Нова опція командного рядка для ізольованого режиму, (bpo-16499).

- `multiprocessing` тепер має опцію, щоб уникнути використання os.fork на Unix. spawn і forkserver більш безпечні, оскільки вони уникають обміну даними з дочірніми процесами.

- `multiprocessing` дочірні процеси в Windows більше не успадковують усі успадковані дескриптори батьківського процесу, лише необхідні.

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

- TLSv1.1 і TLSv1.2 підтримують для `ssl`.

- Отримання сертифікатів із сховища сертифікатів системи Windows підтримує для `ssl`.

- Server-side SNI (Server Name Indication) support for `ssl`.

- Клас `ssl.SSLContext` має багато покращень.

- Усі модулі в стандартній бібліотеці, які підтримують SSL, тепер підтримують перевірку сертифікатів сервера, включаючи відповідність імен хостів (`ssl.match_hostname()`) і CRL (списки відкликаних сертифікатів, див. `ssl.SSLContext.load_verify_locations()`).

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

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

- Використовуючи PEP 442, у більшості випадків глобальні параметри модуля більше не встановлюються на None під час фіналізації (bpo-18214).

- Настроювані розподілювачі пам’яті (PEP 445).

- Argument Clinic (PEP 436).

Будь ласка, прочитайте повний список змін, які стосуються користувача, включаючи багато інших менших покращень, оптимізацію 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 Installing Python Modules (Legacy version) and Distributing Python Modules (Legacy version).

Дивись також

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

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

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

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

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

- `os.get_inheritable()`, `os.set_inheritable()`

- `os.get_handle_inheritable()`, `os.set_handle_inheritable()`

- `socket.socket.get_inheritable()`, `socket.socket.set_inheritable()`

Дивись також

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: Приклади. Ці доповнення 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` сертифікатів і списки відкликаних сертифікатів (`crl`s), а також метод `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` або вищий, але можна вказати як назву реєстратора, так і альтернативний мінімальний рівень журналювання. Об’єкт, повернутий контекстним менеджером, може бути запитаний для `LogRecord`s та/або відформатованих повідомлень, які були зареєстровані. (Надав Антуан Пітру в 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 для неблокуючого аналізу. (Надав Антуан Пітру в 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.)

- A new opcode, `LOAD_CLASSDEREF`, has been added to fix a bug in the loading of free variables in class bodies that could be triggered by certain uses of __prepare__. (Contributed by Benjamin Peterson in 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 re-use 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)