Що нового в Python 3.3

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

Дивись також

PEP 398 - Графік випуску Python 3.3

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

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

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

  • faulthandler (допомагає налагодити низькорівневі збої)

  • ipaddress (об’єкти високого рівня, що представляють IP-адреси та маски)

  • lzma (стиснення даних за допомогою алгоритму XZ / LZMA)

  • unittest.mock (замінити частини вашої тестованої системи на макетні об’єкти)

  • venv (Python віртуальні середовища, як у популярному пакеті virtualenv)

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

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

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

  • C Прискорювач для модуля decimal.

  • Краще оброблення Юнікоду в модулі email (provisional).

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

  • Хеш-рандомізація ввімкнена за замовчуванням.

Будь ласка, прочитайте повний список змін, які стосуються користувача.

PEP 405: Віртуальні середовища

Virtual environments help create separate Python setups while sharing a system-wide base install, for ease of maintenance. Virtual environments have their own set of private site packages (i.e. locally-installed libraries), and are optionally segregated from the system-wide site packages. Their concept and implementation are inspired by the popular virtualenv third-party package, but benefit from tighter integration with the interpreter core.

Цей PEP додає модуль venv для програмного доступу та сценарій pyvenv для доступу до командного рядка та адміністрування. Інтерпретатор Python перевіряє наявність файла pyvenv.cfg, існування якого сигналізує про основу дерева каталогів віртуального середовища.

Дивись також

PEP 405 - Віртуальні середовища Python

PEP, написаний Карлом Майєром; реалізація Карла Мейєра та Віная Саджипа

PEP 420: неявні пакети простору імен

Вбудована підтримка каталогів пакунків, які не потребують файлів маркерів __init__.py і можуть автоматично охоплювати кілька сегментів шляху (навіяні різними сторонніми підходами до пакетів простору імен, як описано в PEP 420)

Дивись також

PEP 420 - неявні пакети простору імен

PEP, написаний Еріком В. Смітом; виконання Еріком В. Смітом і Баррі Варшау

PEP 3118: Нова реалізація memoryview і документація протоколу буфера

Реалізацію PEP 3118 було значно покращено.

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

Об’єкт memoryview тепер має сумісний з PEP-3118 getbufferproc(), який перевіряє тип запиту споживача. Було додано багато нових функцій, більшість із яких працюють у повному обсязі для несуміжних масивів і масивів із підзсувами.

Документацію оновлено, чітко прописані обов’язки як експортерів, так і споживачів. Прапори запиту буфера згруповані в основні та складені прапори. Пояснюється розташування пам’яті несуміжних і багатовимірних масивів у стилі NumPy.

особливості

  • Тепер підтримуються всі рідні специфікатори односимвольного формату в синтаксисі модуля struct (за бажанням із префіксом «@»).

  • З деякими обмеженнями метод cast() дозволяє змінювати формат і форму C-суміжних масивів.

  • Представлення багатовимірного списку підтримуються для будь-якого типу масиву.

  • Багатовимірні порівняння підтримуються для будь-якого типу масиву.

  • Одновимірні представлення пам’яті хешованих типів (тільки для читання) з форматами B, b або c тепер хешуються. (Надав Антуан Пітру в bpo-13411.)

  • Підтримується довільне нарізання будь-яких типів 1-D масивів. Наприклад, тепер можна змінити відображення пам’яті в O(1) за допомогою негативного кроку.

Зміни API

  • Максимальна кількість вимірів офіційно обмежена 64.

  • Представлення порожньої форми, кроків і підзсувів тепер є порожнім кортежем замість «Немає».

  • Доступ до елемента memoryview у форматі «B» (байти без знаку) тепер повертає ціле число (відповідно до синтаксису модуля struct). Для повернення об’єкта bytes спочатку має бути приведено до „c“.

  • Порівняння memoryview тепер використовує логічну структуру операндів і порівнює всі елементи масиву за значенням. Підтримуються всі рядки формату в синтаксисі модуля struct. Перегляди з нерозпізнаними рядками формату все ще дозволені, але завжди порівнюватимуться як нерівні, незалежно від вмісту подання.

  • Щоб отримати додаткові зміни, перегляньте Зміни в API збірки та C і Перенесення коду C.

(Надав Стефан Крах у bpo-10181.)

Дивись також

PEP 3118 - Перегляд буферного протоколу

PEP 393: Гнучке представлення рядків

Тип рядка Unicode змінено для підтримки кількох внутрішніх представлень залежно від символу з найбільшим порядковим номером Unicode (1, 2 або 4 байти) у представленому рядку. Це забезпечує економічне представлення у звичайних випадках, але дає доступ до повного UCS-4 у всіх системах. Для сумісності з існуючими API кілька представлень можуть існувати паралельно; з часом ця сумісність має бути припинена.

З боку Python ця зміна не повинна мати ніяких недоліків.

З боку C API PEP 393 повністю сумісний із попередніми версіями. Застарілий API має бути доступним щонайменше п’ять років. Програми, які використовують застарілий API, не отримають повної вигоди від зменшення обсягу пам’яті або, що ще гірше, можуть використовувати трохи більше пам’яті, оскільки Python, можливо, доведеться підтримувати дві версії кожного рядка (у застарілому форматі та в новому ефективному сховищі).

Функціональність

Зміни, внесені PEP 393:

  • Тепер Python завжди підтримує повний діапазон кодових точок Unicode, включно з кодами, що не є BMP (тобто від U+0000 до U+10FFFF). Різниця між вузькими та широкими збірками більше не існує, і Python тепер поводиться як широка збірка, навіть під Windows.

  • Зі смертю вузьких збірок проблеми, характерні для вузьких збірок, також були виправлені, наприклад:

    • len() тепер завжди повертає 1 для не-BMP символів, тому len('\U0010FFFF') == 1;

    • сурогатні пари не комбінуються повторно в рядкових літералах, тому '\uDBFF\uDFFF' != '\U0010FFFF';

    • індексація або нарізка символів, відмінних від BMP, повертає очікуване значення, тому '\U0010FFFF'[0] тепер повертає '\U0010FFFF', а не '\uDBFF';

    • усі інші функції стандартної бібліотеки тепер правильно обробляють точки коду, відмінні від BMP.

  • Значення sys.maxunicode тепер завжди 1114111 (0x10FFFF у шістнадцятковій системі). Функція PyUnicode_GetMax() усе ще повертає або 0xFFFF, або 0x10FFFF для зворотної сумісності, і її не слід використовувати з новим API Unicode (див. bpo-13054).

  • Прапорець --with-wide-unicode у ./configure видалено.

Продуктивність і використання ресурсів

Зберігання рядків Unicode тепер залежить від найвищої кодової точки в рядку:

  • чисті рядки ASCII і Latin1 (U+0000-U+00FF) використовують 1 байт на кодову точку;

  • Рядки BMP (U+0000-U+FFFF) використовують 2 байти на кодову точку;

  • не-BMP-рядки (U+10000-U+10FFFF) використовують 4 байти на кодову точку.

Чистий ефект полягає в тому, що для більшості програм використання пам’яті для зберігання рядків має значно зменшитися – особливо порівняно з колишніми широкими збірками Unicode – оскільки в багатьох випадках рядки будуть чистим ASCII навіть у міжнародних контекстах (оскільки багато рядків зберігають нелюдську мову дані, наприклад фрагменти XML, заголовки HTTP, дані в кодуванні JSON тощо). Ми також сподіваємося, що це з тих самих причин підвищить ефективність кешу ЦП у нетривіальних програмах. Використання пам’яті Python 3.3 у два-три рази менше, ніж Python 3.2, і трохи краще, ніж Python 2.7, за порівняльним тестом Django (докладніше див. у PEP).

Дивись також

PEP 393 - Гнучке представлення рядків

PEP, написаний Мартіном фон Льовісом; виконання Торстеном Беккером і Мартіном фон Льовісом.

PEP 397: програма запуску Python для Windows

Інсталятор Python 3.3 Windows тепер містить програму запуску py, яку можна використовувати для запуску програм Python незалежно від версії.

Цей засіб запуску неявно викликається під час подвійного клацання файлів *.py. Якщо в системі встановлено лише одну версію Python, для запуску файлу використовуватиметься ця версія. Якщо встановлено декілька версій, за замовчуванням використовується найновіша версія, але це можна замінити, включивши в сценарій Python рядок shebang у стилі Unix.

Засіб запуску також можна використовувати явно з командного рядка як програму py. Запуск py дотримується тих самих правил вибору версії, що й неявний запуск сценаріїв, але більш конкретну версію можна вибрати шляхом передачі відповідних аргументів (наприклад, -3 для запиту Python 3, коли Python 2 також встановлено, або -2.6 для спеціального запиту попередньої версії Python, коли встановлено новішу версію).

Окрім засобу запуску, інсталятор Windows тепер містить опцію додавання щойно встановленого Python до системного ШЛЯХУ. (Надав Браян Кертін у bpo-3561.)

Дивись також

PEP 397 - програма запуску Python для Windows

PEP, написаний Марком Хаммондом і Мартіном проти Льовіса; виконання Вінай Саджип.

Документація програми запуску: Python Launcher для Windows

Модифікація PATH інсталятора: Пошук виконуваного файлу Python

PEP 3151: переробка ієрархії винятків ОС та вводу-виводу

Ієрархія винятків, викликаних помилками операційної системи, тепер є спрощеною та детальнішою.

Вам більше не потрібно турбуватися про вибір відповідного типу винятку між OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error або select.error. Усі типи винятків тепер лише один: OSError. Інші імена зберігаються як псевдоніми з міркувань сумісності.

Крім того, тепер простіше виявити конкретну умову помилки. Замість того, щоб перевіряти атрибут errno (або args[0]) для певної константи з модуля errno, ви можете зловити відповідний підклас OSError. Доступні наступні підкласи:

А сам ConnectionError має більш детальні підкласи:

Завдяки новим виняткам тепер можна уникнути звичайного використання errno. Наприклад, наступний код, написаний для Python 3.2:

from errno import ENOENT, EACCES, EPERM

try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise

тепер можна записати без імпорту errno і без ручної перевірки атрибутів винятків:

try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")

Дивись також

PEP 3151 - Переробка ієрархії винятків ОС та вводу-виводу

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

PEP 380: Синтаксис для делегування субгенератору

PEP 380 додає вираз yield from, дозволяючи generator делегувати частину своїх операцій іншому генератору. Це дозволяє розділити код, що містить yield, і розмістити його в іншому генераторі. Крім того, підгенератору дозволено повертати значення, і це значення стає доступним для делегуючого генератора.

Незважаючи на те, що вираз yield from розроблено в основному для використання під час делегування підгенератору, він фактично дозволяє делегувати довільним субітераторам.

Для простих ітераторів yield from iterable по суті є лише скороченою формою for item in iterable: yield item:

>>> def g(x):
...     yield from range(x, 0, -1)
...     yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

Однак, на відміну від звичайного циклу, yield from дозволяє підгенераторам отримувати надіслані та викинуті значення безпосередньо з області виклику та повертати остаточне значення зовнішньому генератору:

>>> def accumulate():
...     tally = 0
...     while 1:
...         next = yield
...         if next is None:
...             return tally
...         tally += next
...
>>> def gather_tallies(tallies):
...     while 1:
...         tally = yield from accumulate()
...         tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc)  # Ensure the accumulator is ready to accept values
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the first tally
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the second tally
>>> tallies
[6, 10]

Головний принцип, що керує цією зміною, полягає в тому, щоб дозволити навіть генераторам, які призначені для використання з методами send і throw, бути розділені на кілька підгенераторів так само легко, як одну велику функцію можна розділити на кілька підфункцій .

Дивись також

PEP 380 - Синтаксис для делегування підгенератору

PEP, написаний Грегом Юінгом; впровадження Грегом Юінгом, інтегроване в 3.3 Рено Бланчем, Раяном Келлі та Ніком Когланом; документація Збігнєва Єнджеєвського-Шмека та Ніка Коглана

PEP 409: Придушення контексту винятку

PEP 409 представляє новий синтаксис, який дозволяє вимкнути відображення зв’язаного виняткового контексту. Це дозволяє очистити повідомлення про помилки в програмах, які перетворюють типи винятків:

>>> class D:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

Без суфікса from None для придушення причини вихідний виняток відображатиметься за замовчуванням:

>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
  File "<stdin>", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

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

>>> try:
...     D({}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)

Дивись також

PEP 409 - Придушення контексту винятків

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

PEP 414: Явні літерали Unicode

Щоб полегшити перехід від Python 2 для додатків Python, які підтримують Unicode і активно використовують літерали Unicode, Python 3.3 знову підтримує префікс «u» для рядкових літералів. Цей префікс не має семантичного значення в Python 3, він надається виключно для того, щоб зменшити кількість суто механічних змін під час переходу на Python 3, що полегшує розробникам зосередження на більш значущих семантичних змінах (таких як суворіше розділення двійкових за замовчуванням і текстові дані).

Дивись також

PEP 414 - Явні літерали Unicode

PEP, автор Армін Ронашер.

PEP 3155: Уточнена назва для класів і функцій

Функції та об’єкти класу мають новий атрибут __qualname__, що представляє «шлях» від верхнього рівня модуля до їхнього визначення. Для глобальних функцій і класів це те саме, що __name__. Для інших функцій і класів він надає кращу інформацію про те, де вони були фактично визначені, і як вони можуть бути доступні з глобальної області.

Приклад із (незв’язаними) методами:

>>> class C:
...     def meth(self):
...         pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'

Приклад із вкладеними класами:

>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'

Приклад із вкладеними функціями:

>>> def outer():
...     def inner():
...         pass
...     return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'

Рядкове подання цих об’єктів також змінено, щоб включити нову, більш точну інформацію:

>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'

Дивись також

PEP 3155 - Уточнена назва для класів і функцій

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

PEP 412: словник спільного використання ключів

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

Дивись також

PEP 412 - Словник зі спільним використанням ключів

PEP написав і реалізував Марк Шеннон.

PEP 362: Об’єкт підпису функції

Нова функція inspect.signature() робить інтроспекцію викликів Python легкою та простою. Підтримується широкий діапазон викликів: функції python, декоровані чи ні, класи та об’єкти functools.partial(). Нові класи inspect.Signature, inspect.Parameter і inspect.BoundArguments містять інформацію про підписи викликів, такі як анотації, значення за замовчуванням, типи параметрів і зв’язані аргументи, що значно спрощує написання декораторів і будь-якого коду, який перевіряє або змінює підписи викликів або аргументи.

Дивись також

PEP 362: - Об’єкт підпису функції

PEP автори Бретт Кеннон, Юрій Селіванов, Ларрі Гастінгс, Джівон Сео; реалізував Юрій Селіванов.

PEP 421: додавання sys.implementation

Новий атрибут у модулі sys розкриває деталі, специфічні для реалізації поточного інтерпретатора. Початковим набором атрибутів sys.implementation є name, version, hexversion і cache_tag.

Метою sys.implementation є консолідація в один простір імен специфічних для реалізації даних, які використовуються стандартною бібліотекою. Це дозволяє різним реалізаціям Python набагато легше спільно використовувати одну стандартну бібліотечну базу коду. У початковому стані sys.implementation містить лише невелику частину даних, що стосуються реалізації. З часом це співвідношення зміниться, щоб зробити стандартну бібліотеку більш портативною.

Одним із прикладів покращеної переносимості стандартної бібліотеки є cache_tag. Починаючи з Python 3.3, sys.implementation.cache_tag використовується importlib для підтримки PEP 3147 відповідності. Будь-яка реалізація Python, яка використовує importlib для своєї вбудованої системи імпорту, може використовувати cache_tag для керування поведінкою кешування для модулів.

SimpleNamespace

Реалізація sys.implementation також вводить новий тип у Python: types.SimpleNamespace. На відміну від простору імен на основі зіставлення, наприклад dict, SimpleNamespace базується на атрибутах, як object. Однак, на відміну від object, екземпляри SimpleNamespace доступні для запису. Це означає, що ви можете додавати, видаляти та змінювати простір імен за допомогою звичайного доступу до атрибутів.

Дивись також

PEP 421 - Додавання sys.implementation

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

Використання importlib як реалізації імпорту

bpo-2377 - Замінити __import__ на importlib.__import__ bpo-13959 - Повторно реалізувати частини imp на чистому Python bpo-14605 - Зробити механізм імпорту явним bpo-14646 - Вимагати набір завантажувачів __loader__ і __package__

Функція __import__() тепер підтримується importlib.__import__(). Ця робота призводить до завершення «фази 2» PEP 302. Ця зміна має багато переваг. По-перше, це дозволило відкрити більшу частину механізму, що забезпечує імпорт, замість того, щоб бути неявним і прихованим у коді C. Він також забезпечує єдину реалізацію для всіх віртуальних машин Python, які підтримують Python 3.3, допомагаючи покласти край будь-яким специфічним для віртуальних машин відхилень у семантиці імпорту. І, нарешті, це полегшує підтримку імпорту, дозволяючи відбутися майбутнє зростання.

Для звичайного користувача не повинно бути видимих змін у семантиці. Для тих, чий код наразі керує імпортом або викликає імпорт програмно, зміни коду, які можуть знадобитися, розглядаються в розділі «Перенесення коду Python» (Porting Python code) цього документа.

Нові API

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

Абстрактні базові класи, визначені в importlib.abc, були розширені для правильного розмежування між мета-шляхом пошуку та мета-пошуком шляху шляхом введення importlib.abc. MetaPathFinder і importlib.abc.PathEntryFinder відповідно. Старий ABC importlib.abc.Finder тепер надається лише для зворотної сумісності та не передбачає жодних вимог до методів.

З точки зору засобів пошуку, importlib.machinery.FileFinder відкриває механізм, який використовується для пошуку вихідних файлів і файлів байт-коду модуля. Раніше цей клас був неявним членом sys.path_hooks.

Для завантажувачів новий абстрактний базовий клас importlib.abc.FileLoader допомагає написати завантажувач, який використовує файлову систему як механізм зберігання коду модуля. Завантажувач для вихідних файлів (importlib.machinery.SourceFileLoader), файлів байт-кодів без джерел (importlib.machinery.SourcelessFileLoader) і модулів розширення (importlib.machinery.ExtensionFileLoader) є тепер доступний для прямого використання.

ImportError тепер має атрибути name і path, які встановлюються, коли є відповідні дані для надання. У повідомленні про невдалі імпорти тепер буде міститися повна назва модуля, а не лише кінцева частина назви модуля.

Функція importlib.invalidate_caches() тепер викличе метод з однаковою назвою для всіх засобів пошуку, кешованих у sys.path_importer_cache, щоб допомогти очистити будь-який збережений стан за потреби.

Видимі зміни

Інформацію про потенційно необхідні зміни коду див. у розділі «Перенесення коду Python» (Porting Python code).

Окрім того, що зараз відкриває importlib, існують інші видимі зміни для імпорту. Найбільшим є те, що sys.meta_path і sys.path_hooks тепер зберігають усі шукачі мета-шляхів і перехоплювачі для введення шляхів, які використовуються імпортом. Раніше шукачі були неявними та прихованими в коді імпорту C замість того, щоб бути відкритими безпосередньо. Це означає, що тепер можна легко видалити або змінити порядок різних шукачів відповідно до своїх потреб.

Ще одна зміна полягає в тому, що всі модулі мають атрибут __loader__, який зберігає завантажувач, використаний для створення модуля. PEP 302 було оновлено, щоб зробити цей атрибут обов’язковим для завантажувачів, тож у майбутньому, після оновлення завантажувачів сторонніх розробників, люди зможуть покладатися на існування атрибута. Однак до цього часу імпорт встановлює модуль після завантаження.

Тепер очікується, що завантажувачі встановлюють атрибут __package__ з PEP 366. Знову ж таки, сам імпорт уже встановлює це для всіх завантажувачів із importlib, а сам імпорт встановлює атрибут після завантаження.

None тепер вставляється в sys.path_importer_cache, якщо в sys.path_hooks не вдається знайти засіб пошуку. Оскільки imp.NullImporter не доступний безпосередньо для sys.path_hooks, більше не можна покладатися на те, що він завжди буде доступним для використання як значення, що представляє не знайдений засіб пошуку.

Усі інші зміни стосуються семантичних змін, які слід враховувати під час оновлення коду для Python 3.3, і тому про них слід прочитати в розділі «Перенесення коду Python» (Porting Python code) цього документа.

(Реалізація Бреттом Кенноном)

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

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

  • Додано підтримку псевдонімів імен Unicode та іменованих послідовностей. І unicodedata.lookup(), і '\N{...}'' тепер розпізнають псевдоніми імен, а unicodedata.lookup() також розпізнає іменовані послідовності.

    (Надав Еціо Мелотті в bpo-12753.)

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

  • Порівняння рівності об’єктів range() тепер повертає результат, що відображає рівність базових послідовностей, створених цими об’єктами діапазону. (bpo-13201)

  • Методи count(), find(), rfind(), index() і rindex() bytes і: Об’єкти bytearray тепер приймають ціле число від 0 до 255 як перший аргумент.

    (Надав Петрі Лехтінен у bpo-12170.)

  • Методи rjust(), ljust() і center() bytes і bytearray тепер приймають bytearray для аргумент fill. (Надав Петрі Лехтінен у bpo-12380.)

  • До list і bytearray додано нові методи: copy() і clear() (bpo-10516). Отже, MutableSequence тепер також визначає метод clear() (bpo-11388).

  • Необроблені байтові літерали тепер можна записати rb"...", а також br"...".

    (Надав Антуан Пітру в bpo-13748.)

  • dict.setdefault() тепер виконує лише один пошук для даного ключа, що робить його атомарним при використанні з вбудованими типами.

    (Надав Філіп Грущинський у bpo-13521.)

  • Повідомлення про помилки, які видаються, коли виклик функції не відповідає сигнатурі функції, було значно покращено.

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

Точне блокування імпорту

Попередні версії CPython завжди покладалися на глобальне блокування імпорту. Це призвело до неочікуваних проблем, наприклад, взаємоблокування під час імпортування модуля викликало б виконання коду в іншому потоці як побічний ефект. Інколи використовувалися незграбні обхідні шляхи, наприклад функція C API PyImport_ImportModuleNoBlock().

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

(Надав Антуан Пітру в bpo-9260.)

Вбудовані функції та типи

  • open() отримує новий параметр opener: базовий файловий дескриптор для об’єкта файлу отримується шляхом виклику opener за допомогою (file, flags). Його можна використовувати, наприклад, для використання спеціальних прапорів, таких як os.O_CLOEXEC. Додано режим 'x: відкритий для ексклюзивного створення, не вдається, якщо файл уже існує.

  • print(): додано аргумент ключового слова flush. Якщо аргумент ключового слова flush має значення true, потік примусово очищається.

  • hash(): рандомізація хешу ввімкнена за замовчуванням, див. object.__hash__() і PYTHONHASHSEED.

  • Тип str отримує новий метод casefold(): повертає згорнуту копію рядка, згорнуті рядки можна використовувати для зіставлення без регістру. Наприклад, 'ß'.casefold() повертає 'ss'.

  • Документацію послідовності було суттєво переписано, щоб краще пояснити різницю між двійковою та текстовою послідовністю та надати окремі розділи документації для окремих вбудованих типів послідовностей (bpo-4966).

Нові модулі

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

Цей новий модуль налагодження faulthandler містить функції для явного створення дампу трасування Python у разі помилки (збій, як помилка сегментації), після тайм-ауту або за сигналом користувача. Викличте faulthandler.enable(), щоб установити обробники помилок для SIGSEGV, SIGFPE, SIGABRT, SIGBUS і SIGILL сигнали. Ви також можете ввімкнути їх під час запуску, встановивши змінну середовища PYTHONFAULTHANDLER або використовуючи параметр командного рядка -X faulthandler.

Приклад помилки сегментації в Linux:

$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700:
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault

IP-адреса

Новий модуль ipaddress надає інструменти для створення та керування об’єктами, що представляють адреси IPv4 та IPv6, мережі та інтерфейси (тобто IP-адресу, пов’язану з певною підмережею IP).

(Надано Google і Пітером Муді в PEP 3144.)

lzma

The newly-added lzma module provides data compression and decompression using the LZMA algorithm, including support for the .xz and .lzma file formats.

(Надім Вавда та Пер Ойвінд Карлсен у bpo-6715.)

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

абв

Покращена підтримка абстрактних базових класів, що містять дескриптори, складені за допомогою абстрактних методів. Рекомендованим підходом до оголошення абстрактних дескрипторів тепер є надання __isabstractmethod__ як динамічно оновлюваної властивості. Вбудовані дескриптори були відповідно оновлені.

(Надав Даррен Дейл у bpo-11610.)

abc.ABCMeta.register() тепер повертає зареєстрований підклас, що означає, що тепер його можна використовувати як декоратор класу (bpo-10868).

масив

The array module supports the long long type using q and Q type codes.

(Надано Ореном Тірошем і Хірокадзу Ямамото в bpo-1172711.)

база64

Функції декодування сучасного інтерфейсу base64 тепер приймають рядки Unicode лише для ASCII. Наприклад, base64.b64decode('YWJj') повертає b'abc. (Надав Каталін Якоб у bpo-13641.)

binascii

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

bz2

Модуль bz2 було переписано з нуля. У процесі було додано кілька нових функцій:

  • Нова функція bz2.open(): відкриває файл, стиснутий за допомогою bzip2, у двійковому або текстовому режимі.

  • bz2.BZ2File тепер може читати та записувати довільні файлоподібні об’єкти за допомогою аргументу fileobj свого конструктора.

    (Надім Вавда в bpo-5863.)

  • bz2.BZ2File і bz2.decompress() тепер можуть розпакувати багатопотокові вхідні дані (наприклад, створені інструментом pbzip2). bz2.BZ2File тепер також можна використовувати для створення цього типу файлу, використовуючи режим 'a' (додавання).

    (Надано Nir Aides у bpo-1625.)

  • bz2.BZ2File тепер реалізує всі API io.BufferedIOBase, крім методів detach() і truncate().

кодеки

Кодек mbcs було переписано для правильної обробки обробників помилок replace та ignore у всіх версіях Windows. Кодек mbcs тепер підтримує всі обробники помилок, замість лише replace для кодування та ignore для декодування.

Додано новий кодек лише для Windows: cp65001 (bpo-13216). Це кодова сторінка Windows 65001 (Windows UTF-8, CP_UTF8). Наприклад, він використовується sys.stdout, якщо для кодової сторінки консолі встановлено значення cp65001 (наприклад, за допомогою команди chcp 65001).

Багатобайтові декодери CJK тепер повторно синхронізуються швидше. Вони ігнорують лише перший байт недійсної послідовності байтів. Наприклад, b'\xff\n'.decode('gb2312', 'replace') тепер повертає \n після символу заміни.

(bpo-12016)

Інкрементні кодеки CJK більше не скидаються під час кожного виклику методів encode(). Наприклад:

>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'

Цей приклад дає b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} До побачення.'' зі старішими версіями Python.

(bpo-12100)

Кодек unicode_internal застарів.

колекції

Додано новий клас ChainMap, щоб дозволити обробляти кілька відображень як єдине ціле. (Написано Реймондом Геттінгером для bpo-11089, оприлюднено в bpo-11297.)

Базові абстрактні класи переміщено в новий модуль collections.abc, щоб краще розрізняти абстрактні та конкретні класи колекцій. Псевдоніми для ABC все ще присутні в модулі collections, щоб зберегти існуючий імпорт. (bpo-11085)

Клас Counter тепер підтримує унарні оператори + і -, а також оператори на місці +=, -=, |= і &=. (Надав Раймонд Геттінгер у bpo-13121.)

contextlib

ExitStack тепер забезпечує міцну основу для програмного маніпулювання менеджерами контексту та подібними функціями очищення. На відміну від попереднього API contextlib.nested (який був застарілим і видалений), новий API розроблено для правильної роботи незалежно від того, чи менеджери контексту отримують свої ресурси в своєму методі __init__ (наприклад, файлові об’єкти). або в їх методі __enter__ (наприклад, об’єкти синхронізації з модуля threading).

(bpo-13585)

склеп

Додано сіль і модульний формат крипти (метод хешування) і функцію mksalt() до модуля crypt.

(bpo-10924)

прокльони

  • Якщо модуль curses пов’язано з бібліотекою ncursesw, використовуйте функції Unicode, коли передаються рядки або символи Unicode (наприклад, waddwstr()), і функції bytes в іншому випадку (наприклад, waddstr()).

  • Використовуйте кодування мови замість utf-8 для кодування рядків Unicode.

  • curses.window має новий атрибут curses.window.encoding.

  • Клас curses.window має новий метод get_wch() для отримання широкого символу

  • Модуль curses має нову функцію unget_wch(), яка надсилає широкий символ, щоб наступний get_wch() повертав його

(Надав Іньїго Серна в bpo-6755.)

дата, час

  • Порівняння рівності між простими та обізнаними екземплярами datetime тепер повертає False замість того, щоб викликати TypeError (bpo-15006).

  • Новий метод datetime.datetime.timestamp(): повертає позначку часу POSIX, що відповідає екземпляру datetime.

  • Метод datetime.datetime.strftime() підтримує форматування років старше 1000.

  • Метод datetime.datetime.astimezone() тепер можна викликати без аргументів для перетворення екземпляра datetime у системний часовий пояс.

десятковий

bpo-7652 - інтегрувати швидку власну десяткову арифметику.

C-module і libmpdec, написані Stefan Krah.

The new C version of the decimal module integrates the high speed libmpdec library for arbitrary precision correctly-rounded decimal floating point arithmetic. libmpdec conforms to IBM’s General Decimal Arithmetic Specification.

Підвищення продуктивності коливається від 10 разів для додатків баз даних до 100 разів для інтенсивних програм. Ці числа є очікуваними приростами для стандартної точності, яка використовується в десятковій арифметиці з плаваючою комою. Оскільки точність налаштовується користувачем, точні цифри можуть відрізнятися. Наприклад, у цілочисельній арифметиці bignum відмінності можуть бути значно вищими.

The following table is meant as an illustration. Benchmarks are available at http://www.bytereef.org/mpdecimal/quickstart.html.

decimal.py

_десятковий

прискорювати

пі

42,02с

0,345с

120x

телекомунікаційна компанія

172,19с

5,68с

30x

psycopg

3,57с

0,29 с

12x

особливості

  • Сигнал FloatOperation додатково вмикає суворішу семантику для змішування чисел з плаваючою точкою та десяткових знаків.

  • Якщо Python скомпільовано без потоків, версія C автоматично вимикає дорогий механізм локального контексту потоків. У цьому випадку змінна HAVE_THREADS має значення False.

Зміни API

  • Модуль C має такі контекстні обмеження, залежно від архітектури машини:

    32-розрядний

    64-розрядний

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • У шаблонах контексту (DefaultContext, BasicContext і ExtendedContext) величина Emax і Emin змінено на 999999.

  • Конструктор Decimal у decimal.py не дотримується контекстних обмежень і точно перетворює значення з довільним показником ступеня чи точністю. Оскільки версія C має внутрішні обмеження, використовується така схема: якщо можливо, значення перетворюються точно, інакше InvalidOperation викликається, і результатом є NaN. В останньому випадку завжди можна використовувати create_decimal(), щоб отримати округлене або неточне значення.

  • The power function in decimal.py is always correctly-rounded. In the C version, it is defined in terms of the correctly-rounded exp() and ln() functions, but the final result is only «almost always correctly rounded».

  • У версії C контекстний словник, що містить сигнали, є MutableMapping. З міркувань швидкості flags і traps завжди посилаються на той самий MutableMapping, яким було ініціалізовано контекст. Якщо призначено новий словник сигналів, flags і traps оновлюються новими значеннями, але вони не посилаються на словник RHS.

  • Видалення Context створює інший вихід, щоб мати загальний формат обміну для версій Python і C.

  • Порядок аргументів у конструкторі Context змінено відповідно до порядку, який відображає repr().

  • Параметр watchexp у методі quantize() застарів.

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

Рамкова політика

Пакет електронної пошти тепер має структуру policy. Policy — це об’єкт із кількома методами та властивостями, які контролюють поведінку пакета електронної пошти. Основною політикою для Python 3.3 є політика Compat32, яка забезпечує зворотну сумісність із пакетом електронної пошти в Python 3.2. Політику можна вказати, коли повідомлення електронної пошти аналізується parser, або коли створюється об’єкт Message, або коли електронний лист серіалізовано за допомогою generator. Якщо політика, передана аналізатору, не перевизначена, успадковується всіма об’єктами Message і підоб’єктами, створеними синтаксичним аналізатором. За замовчуванням генератор використовуватиме політику об’єкта Message, який він серіалізує. Політика за умовчанням: compat32.

Мінімальний набір елементів керування, реалізований усіма об’єктами policy:

максимальна_довжина_рядка

Максимальна довжина окремих рядків, за винятком символів рядків, може бути у серіалізованому повідомленні. За замовчуванням 78.

linesep

Символ, який використовується для розділення окремих рядків, коли Message серіалізується. За замовчуванням \n.

cte_type

7bit або 8bit. 8bit застосовується лише до генератора Bytes і означає, що не-ASCII може використовуватися там, де це дозволено протоколом (або там, де воно існує у вихідному введенні).

підвищення_на_дефект

Примушує аналізатор викликати помилку, коли трапляються дефекти, замість того, щоб додавати їх до списку дефектів об’єкта Message.

Новий екземпляр політики з новими налаштуваннями створюється за допомогою методу об’єктів політики clone(). clone приймає будь-який із наведених вище елементів керування як аргумент ключового слова. Будь-який елемент керування, не вказаний у виклику, зберігає значення за замовчуванням. Таким чином, ви можете створити політику, яка використовує символи рядка \r\n, як це:

mypolicy = compat32.clone(linesep='\r\n')

Політики можна використовувати для спрощення створення повідомлень у форматі, необхідному вашій програмі. Замість того, щоб не забувати вказувати linesep='\r\n' у всіх місцях, які ви називаєте генератором, ви можете вказати його один раз, коли ви встановлюєте політику, яку використовує 'парсер' або Message, залежно від того, що ваша програма використовує для створення об’єктів Message. З іншого боку, якщо вам потрібно генерувати повідомлення в кількох формах, ви можете вказати параметри у відповідному виклику generator. Або ви можете мати спеціальні екземпляри політики для різних випадків і передати їх під час створення генератора.

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

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

Нові політики є екземплярами EmailPolicy і додають такі додаткові елементи керування:

refold_source

Контролює, чи заголовки, які розбираються parser, повторно згортаються generator. Це може бути none, long або all. Типовим значенням є long, що означає, що вихідні заголовки з рядком, довшим за max_line_length, згортаються повторно. none означає, що жоден рядок не буде повторно згорнутий, а all означає, що всі рядки будуть повторно згорнуті.

header_factory

Викликається, що приймає ім’я і значення і створює спеціальний об’єкт заголовка.

header_factory є ключем до нових функцій, наданих новими політиками. Коли використовується одна з нових політик, будь-який заголовок, отриманий з об’єкта Message, є об’єктом, створеним header_factory, і щоразу, коли ви встановлюєте заголовок Message, він стає об’єктом створений header_factory. Усі такі об’єкти заголовка мають атрибут name, що дорівнює імені заголовка. Заголовки Address і Date мають додаткові атрибути, які надають вам доступ до проаналізованих даних заголовка. Це означає, що тепер ви можете робити такі речі:

>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400

Ви помітите, що відображуване ім’я Unicode автоматично кодується як utf-8, коли повідомлення серіалізується, але коли до заголовка звертається безпосередньо, ви отримуєте версію Unicode. Це усуває будь-яку потребу працювати з функціями email.header decode_header() або make_header().

Ви також можете створювати адреси з частин:

>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
...                           Address('Sally', 'sally', 'example.com')]),
...            Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>

Декодування в Юнікод виконується автоматично:

>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'

Коли ви аналізуєте повідомлення, ви можете використовувати атрибути addresses і groups об’єктів заголовка для доступу до груп та окремих адрес:

>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))

Підсумовуючи, якщо ви використовуєте одну з нових політик, маніпулювання заголовками працює так, як і повинно бути: ваша програма працює з рядками Unicode, а пакет електронної пошти прозоро кодує та декодує Unicode до стандарту RFC Content Transfer Encodings.

Інші зміни API

Новий BytesHeaderParser, доданий до модуля parser, щоб доповнити HeaderParser і завершити Bytes API.

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

  • format_datetime(): враховуючи datetime, створити рядок, відформатований для використання в заголовку електронної пошти.

  • parsedate_to_datetime(): отримавши рядок дати із заголовка електронної пошти, перетворити його на усвідомлений datetime або простий datetime, якщо зсув -0000.

  • localtime(): без аргументів повертає поточний місцевий час як відомий datetime з використанням локального timezone. Дано aware datetime, перетворює його на aware datetime за допомогою локального timezone.

ftplib

  • ftplib.FTP тепер приймає аргумент ключового слова source_address, щоб вказати (хост, порт) для використання як адреси джерела у виклику зв’язування під час створення вихідного сокета. (Надав Джампаоло Родола в bpo-8594.)

  • Клас FTP_TLS тепер надає нову функцію ccc() для повернення каналу керування назад до відкритого тексту. Це може бути корисним, щоб скористатися перевагами брандмауерів, які знають, як обробляти NAT із незахищеним FTP без відкриття фіксованих портів. (Надав Джампаоло Родола в bpo-12139.)

  • Додано метод ftplib.FTP.mlsd(), який забезпечує аналізований формат списку каталогів і не підтримує ftplib.FTP.nlst() і ftplib.FTP.dir(). (Надав Джампаоло Родола в bpo-11072.)

functools

Декоратор functools.lru_cache() тепер приймає аргумент ключового слова typed (який за замовчуванням має значення False, щоб забезпечити кешування значень різних типів, які порівнюються, в окремих слотах кешу. (Надано Raymond Hettinger у bpo-13227.)

gc

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

hmac

Додано нову функцію compare_digest(), щоб запобігти атакам бічних каналів на дайджести за допомогою аналізу часу. (Надано Ніком Когланом і Крістіаном Хеймсом у bpo-15061.)

http

http.server.BaseHTTPRequestHandler тепер буферизує заголовки та записує їх усі одночасно під час виклику end_headers(). Новий метод flush_headers() можна використовувати для безпосереднього керування надсиланням накопичених заголовків. (Надав Ендрю Шааф у bpo-3709.)

http.server тепер створює дійсний вихід HTML 4.01 strict. (Надав Еціо Мелотті в bpo-13295.)

http.client.HTTPResponse тепер має метод readinto(), що означає, що його можна використовувати як клас io.RawIOBase. (Надав Джон Кун у bpo-13464.)

html

html.parser.HTMLParser тепер може аналізувати пошкоджену розмітку, не викликаючи помилок, тому аргумент strict конструктора та виняток HTMLParseError тепер застаріли. Можливість аналізу пошкодженої розмітки є результатом ряду виправлень помилок, які також доступні в останніх версіях виправлень помилок Python 2.7/3.2. (Надав Еціо Мелотті в bpo-15114 і bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)

Додано новий словник html5, який відображає посилання на іменовані символи HTML5 на еквівалентні символи Unicode (наприклад, html5['gt;'] == '>'). до модуля html.entities. Словник тепер також використовується HTMLParser. (Надав Еціо Мелотті в bpo-11113 і bpo-15156.)

імапліб

Конструктор IMAP4_SSL тепер приймає параметр SSLContext для керування параметрами безпечного каналу.

(Надав Сіджин Джозеф у bpo-8808.)

оглядати

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

(Надано Meador Inge та Nick Coghlan у bpo-13062.)

Додано нову функцію getgeneratorlocals(). Ця функція повідомляє про поточне зв’язування локальних змінних у стековому кадрі генератора, що полегшує перевірку правильності внутрішнього стану під час тестування генераторів.

(Надано Meador Inge у bpo-15153.)

io

Функція open() має новий режим 'x'', який можна використовувати виключно для створення нового файлу та викликати FileExistsError, якщо файл уже існує. Він заснований на режимі C11 „x“ для fopen().

(Надав Девід Тауншенд у bpo-12760.)

Конструктор класу TextIOWrapper має новий необов’язковий аргумент write_through. Якщо write_through має значення True, виклики write() гарантовано не буферизуються: будь-які дані, записані в об’єкт TextIOWrapper, негайно обробляються базовий двійковий буфер.

itertools

accumulate() тепер приймає додатковий аргумент func для надання наданої користувачем бінарної функції.

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

Функція basicConfig() тепер підтримує необов’язковий аргумент handlers, який приймає ітерацію обробників для додавання до кореневого реєстратора.

Атрибут рівня класу append_nul додано до SysLogHandler, щоб дозволити контролювати додавання NUL (\000) байт до записів системного журналу, оскільки для деяких демонов він потрібен, а для інших він передається до журналу.

математика

Модуль math має нову функцію, log2(), яка повертає логарифм x за основою 2.

(Написав Марк Дікінсон у bpo-11888.)

mmap

Метод read() тепер більш сумісний з іншими файлоподібними об’єктами: якщо аргумент опущено або вказано як None, він повертає байти від поточної позиції файлу до кінця відображення. (Надав Петрі Лехтінен у bpo-12021.)

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

Нова функція multiprocessing.connection.wait() дозволяє опитувати кілька об’єктів (таких як з’єднання, сокети та канали) з тайм-аутом. (Надав Річард Оудкерк у bpo-12328.)

multiprocessing.Connection об’єкти тепер можна передавати через багатопроцесорні з’єднання. (Надав Річард Оудкерк у bpo-4892.)

multiprocessing.Process тепер приймає аргумент ключового слова daemon, щоб замінити типову поведінку успадкування прапора daemon від батьківського процесу (bpo-6064).

Новий атрибут multiprocessing.Process.sentinel дозволяє програмі очікувати на кілька об’єктів Process одночасно, використовуючи відповідні примітиви ОС (наприклад, select у системах posix ).

Нові методи multiprocessing.pool.Pool.starmap() і starmap_async() забезпечують itertools.starmap() еквіваленти існуючого multiprocessing.pool.Pool Функції .map() і map_async(). (Надав Хайнек Шлавак у bpo-12708.)

nntplib

Клас nntplib.NNTP тепер підтримує протокол керування контекстом для безумовного використання винятків socket.error і закриття з’єднання NNTP після завершення:

>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
...     n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>

(Надав Джампаоло Родола в bpo-9795.)

ос

  • Модуль os має нову функцію pipe2(), яка дає змогу створювати трубу з прапорцями O_CLOEXEC або O_NONBLOCK встановити атомарно. Це особливо корисно, щоб уникнути умов змагань у багатопоточних програмах.

  • Модуль os має нову функцію sendfile(), яка забезпечує ефективний спосіб «нульового копіювання» для копіювання даних з одного дескриптора файлу (або сокета) до іншого. Фраза «нульове копіювання» стосується того факту, що все копіювання даних між двома дескрипторами виконується виключно ядром, без копіювання даних у буфери простору користувача. sendfile() можна використовувати для ефективного копіювання даних із файлу на диску в мережевий сокет, напр. для завантаження файлу.

    (Патч надіслано Россом Лагерваллом і Джампаоло Родола в bpo-10882.)

  • Щоб уникнути таких ситуацій, як атаки символьних посилань і проблеми з тимчасовими файлами та каталогами, надійніше (а також швидше) маніпулювати дескрипторами файлів замість імен файлів. Python 3.3 покращує існуючі функції та представляє нові функції для роботи з дескрипторами файлів (bpo-4761, bpo-10755 та bpo-14626).

  • access() приймає аргумент ключового слова effective_ids, щоб увімкнути використання ефективного uid/gid замість справжнього uid/gid під час перевірки доступу. Підтримку платформи для цього можна перевірити за допомогою набору supports_effective_ids.

  • Модуль os має дві нові функції: getpriority() і setpriority(). Їх можна використовувати, щоб отримати або встановити зручність/пріоритет процесів подібно до os.nice(), але поширене на всі процеси, а не лише на поточний.

    (Патч надіслав Джампаоло Родола в bpo-10784.)

  • Нова функція os.replace() дозволяє перейменовувати файл на різних платформах із перезаписом місця призначення. За допомогою os.rename() наявний цільовий файл перезаписується під POSIX, але викликає помилку під Windows. (Надав Антуан Пітру в bpo-8828.)

  • Сімейство функцій stat (stat(), fstat() і lstat() тепер підтримує читання позначок часу файлу з наносекундною точністю. Симетрично, utime() тепер може записувати мітки часу файлу з точністю до наносекунд. (Надано Ларрі Гастінгсом у bpo-14127.)

  • Нова функція os.get_terminal_size() запитує розмір терміналу, прикріпленого до дескриптора файлу. Дивіться також shutil.get_terminal_size(). (Надав Збігнєв Єнджеєвський-Шмек у bpo-13609.)

  • Нові функції для підтримки розширених атрибутів Linux (bpo-12720): getxattr(), listxattr(), removexattr(), setxattr().

  • Новий інтерфейс планувальника. Ці функції контролюють, як процес розподіляє процесорний час операційною системою. Нові функції: sched_get_priority_max(), sched_get_priority_min(), sched_getaffinity(), sched_getparam(), sched_getscheduler(), sched_rr_get_interval(), sched_setaffinity(), sched_setparam(), sched_setscheduler(), sched_yield(),

  • Нові функції для керування файловою системою:

    • posix_fadvise(): повідомляє про намір отримати доступ до даних за певним шаблоном, таким чином дозволяючи ядру робити оптимізацію.

    • posix_fallocate(): Переконується, що для файлу виділено достатньо місця на диску.

    • sync(): Примусовий запис усього на диск.

  • Додаткові нові функції posix:

    • lockf(): Застосувати, перевірити або видалити блокування POSIX для дескриптора відкритого файлу.

    • pread(): читання з дескриптора файлу зі зміщенням, зміщення файлу залишається незмінним.

    • pwrite(): Запис у дескриптор файлу зі зсуву, залишаючи зміщення файлу незмінним.

    • readv(): Читання з дескриптора файлу в декілька записуваних буферів.

    • truncate(): Обрізати файл, що відповідає шляху, щоб він мав розмір не більше довжини байтів.

    • waitid(): Зачекайте на завершення одного чи кількох дочірніх процесів.

    • writev(): Записати вміст buffers у файловий дескриптор, де buffers — це довільна послідовність буферів.

    • getgrouplist() (bpo-9344): повертає список ідентифікаторів груп, до яких належить вказаний користувач.

  • times() і uname(): тип повернення змінено з кортежу на кортеж-подібний об’єкт з іменованими атрибутами.

  • Деякі платформи тепер підтримують додаткові константи для функції lseek(), такі як os.SEEK_HOLE і os.SEEK_DATA.

  • Нові константи RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD і RTLD_DEEPBIND доступні на платформах, які їх підтримують. Вони призначені для використання з функцією sys.setdlopenflags() і замінюють подібні константи, визначені в ctypes і DLFCN. (Надав Віктор Стіннер у bpo-13226.)

  • os.symlink() тепер приймає (і ігнорує) аргумент ключового слова target_is_directory на платформах, відмінних від Windows, щоб полегшити міжплатформенну підтримку.

pdb

Завершення табуляції тепер доступне не тільки для імен команд, але й для їх аргументів. Наприклад, для команди break завершуються імена функцій і файлів.

(Надав Георг Брандл у bpo-14210)

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

Об’єкти pickle.Pickler тепер мають необов’язковий атрибут dispatch_table, який дозволяє встановлювати функції зменшення для кожного піклера.

(Надав Річард Оудкерк у bpo-14166.)

pydoc

Графічний інтерфейс Tk і функцію serve() видалено з модуля pydoc: pydoc -g і serve() застаріли в Python 3.2.

повторно

str регулярні вирази тепер підтримують екранування \u і \U.

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

розклад

  • run() тепер приймає параметр blocking, який, якщо встановлено на false, змушує метод виконувати заплановані події, які мають закінчитися якнайшвидше (якщо такі є), а потім негайно повертатися. Це корисно, якщо ви хочете використовувати scheduler у неблокуючих програмах. (Надав Джампаоло Родола в bpo-13449.)

  • scheduler клас тепер можна безпечно використовувати в багатопоточних середовищах. (Надано Джосіа Карлсоном і Джампаоло Родола в bpo-8684.)

  • Параметри timefunc і delayfunct конструктора класу scheduler тепер є необов’язковими і за умовчанням мають значення time.time() і time.sleep() відповідно. (Надав Кріс Кларк у bpo-13245.)

  • Параметр argument enter() і enterabs() тепер необов’язковий. (Надав Кріс Кларк у bpo-13245.)

  • enter() і enterabs() тепер приймають параметр kwargs. (Надав Кріс Кларк у bpo-13245.)

вибрати

Solaris і похідні платформи мають новий клас select.devpoll для високопродуктивних асинхронних сокетів через /dev/poll. (Надав Jesús Cea Avión у bpo-6397.)

шлекс

Попередньо недокументована допоміжна функція quote з модулів pipes була переміщена до модуля shlex і задокументована. quote() належним чином екранує всі символи в рядку, яким оболонка могла б надати особливого значення.

шутил

  • Нові функції:

    • disk_usage(): надає статистику загального, використаного та вільного дискового простору. (Надав Джампаоло Родола в bpo-12442.)

    • chown(): дозволяє змінювати користувача та/або групу заданого шляху, вказуючи також імена користувачів/груп, а не лише їхні цифрові ідентифікатори. (Надав Сандро Тосі в bpo-12191.)

    • shutil.get_terminal_size(): повертає розмір вікна терміналу, до якого приєднаний інтерпретатор. (Надав Збігнєв Єнджеєвський-Шмек у bpo-13609.)

  • copy2() і copystat() тепер зберігають мітки часу файлу з точністю до наносекунд на платформах, які це підтримують. Вони також зберігають «розширені атрибути» файлів у Linux. (Надано Ларрі Гастінгсом у bpo-14127 та bpo-15238.)

  • Кілька функцій тепер приймають необов’язковий аргумент symlinks: коли цей параметр має значення true, символічні посилання не розіменовуються, а операція натомість діє на саме символічне посилання (або створює його, якщо це необхідно). (Надав Хайнек Шлавак у bpo-12715.)

  • Під час копіювання файлів до іншої файлової системи move() тепер обробляє символічні посилання так, як це робить команда posix mv, відтворюючи символічне посилання, а не копіюючи вміст цільового файлу. (Надано Джонатаном Нігофом у bpo-9993.) move() тепер також повертає аргумент dst як результат.

  • rmtree() тепер стійкий до атак через символічні посилання на платформах, які підтримують новий параметр dir_fd у os.open() і os.unlink(). (Надано Мартіном фон Льовісом і Гінеком Шлаваком у bpo-4489.)

сигнал

  • Модуль signal має нові функції:

    • pthread_sigmask(): отримати та/або змінити маску сигналу викликаючого потоку (Надано Жаном-Полем Кальдероне в bpo-8407);

    • pthread_kill(): відправити сигнал до потоку;

    • sigpending(): перевірити незавершені функції;

    • sigwait(): чекати сигналу;

    • sigwaitinfo(): чекати сигналу, повертаючи детальну інформацію про нього;

    • sigtimedwait(): як sigwaitinfo(), але з тайм-аутом.

  • Обробник сигналу записує номер сигналу як один байт замість нульового байта в дескриптор файлу пробудження. Таким чином, можна чекати більше ніж один сигнал і знати, які сигнали були підняті.

  • signal.signal() і signal.siginterrupt() викликають OSError замість RuntimeError: OSError має атрибут errno.

smtpd

Модуль smtpd тепер підтримує RFC 5321 (розширений SMTP) і RFC 1870 (розширення розміру). Відповідно до стандарту, ці розширення вмикаються тоді і тільки тоді, коли клієнт ініціює сеанс за допомогою команди EHLO.

(Початкову підтримку ELHO виконав Альберто Тревіно. Розширення розміру здійснено Юханою Яухіайнен. Значну додаткову роботу над виправленням зробили Мікеле Орру та Ден Босвелл. bpo-8739)

smtplib

Класи SMTP, SMTP_SSL і LMTP тепер приймають аргумент ключового слова source_address для визначення (host, port) для використання як адреси джерела у виклику зв’язування під час створення вихідного сокета. (Надав Paulo Scardine у bpo-11281.)

SMTP тепер підтримує протокол керування контекстом, що дозволяє використовувати екземпляр SMTP у операторі with. (Надав Джампаоло Родола в bpo-11289.)

Конструктор SMTP_SSL і метод starttls() тепер приймають параметр SSLContext для керування параметрами безпечного каналу. (Надано Kasun Herath у bpo-8809.)

гніздо

сокетсервер

BaseServer тепер має замінений метод service_actions(), який викликається методом serve_forever() у циклі обслуговування. ForkingMixIn тепер використовує це для очищення дочірніх процесів-зомбі. (Надав Джастін Варкентін у bpo-11109.)

sqlite3

Новий метод sqlite3.Connection set_trace_callback() можна використовувати для захоплення трасування всіх команд sql, оброблених sqlite. (Надав Торстен Ландшофф у bpo-11688.)

ssl

  • Модуль ssl має дві нові функції випадкової генерації:

    • RAND_bytes(): генерувати криптографічно надійні псевдовипадкові байти.

    • RAND_pseudo_bytes(): генерувати псевдовипадкові байти.

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

  • Модуль ssl тепер надає детальнішу ієрархію винятків, щоб полегшити перевірку різних типів помилок. (Надав Антуан Пітру в bpo-11183.)

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

  • Обмін ключами Діффі-Хеллмана, як звичайний, так і на основі еліптичної кривої, тепер підтримується через методи load_dh_params() і set_ecdh_curve(). (Надав Антуан Пітру в bpo-13626 і bpo-13627.)

  • SSL-сокети мають новий метод get_channel_binding(), який дозволяє реалізувати певні механізми автентифікації, такі як SCRAM-SHA-1-PLUS. (Надав Яцек Конєчний у bpo-12551.)

  • Ви можете запитати алгоритм стиснення SSL, який використовується сокетом SSL, завдяки його новому методу compression(). Новий атрибут OP_NO_COMPRESSION можна використовувати для вимкнення стиснення. (Надав Антуан Пітру в bpo-13634.)

  • Додано підтримку розширення Next Protocol Negotiation за допомогою методу ssl.SSLContext.set_npn_protocols(). (Надав Колін Марк у bpo-14204.)

  • Помилки SSL тепер легше аналізувати завдяки атрибутам library і reason. (Надав Антуан Пітру в bpo-14837.)

  • Функція get_server_certificate() тепер підтримує IPv6. (Надав Шарль-Франсуа Наталі в bpo-11811.)

  • Новий атрибут OP_CIPHER_SERVER_PREFERENCE дозволяє налаштувати серверні сокети SSLv3 на використання параметрів упорядкування шифрів сервера, а не клієнта (bpo-13635).

стат

Недокументовану функцію tarfile.filemode переміщено до stat.filemode(). Його можна використовувати для перетворення режиму файлу на рядок у формі „-rwxrwxrwx“.

(Надав Джампаоло Родола в bpo-14807.)

структура

Модуль struct тепер підтримує ssize_t і size_t через нові коди n і N відповідно. (Надав Антуан Пітру в bpo-3163.)

підпроцес

Командні рядки тепер можуть бути об’єктами bytes на платформах posix. (Надав Віктор Стіннер у bpo-8513.)

Нова константа DEVNULL дозволяє придушувати виведення незалежним від платформи способом. (Надав Росс Лагервалл у bpo-5870.)

система

Модуль sys має новий thread_info named tuple, що містить інформацію про реалізацію потоку (bpo-11223).

tarfile

tarfile тепер підтримує кодування lzma через модуль lzma. (Надав Ларс Густебель у bpo-5689.)

тимчасовий файл

Метод tempfile.SpooledTemporaryFile truncate() тепер приймає параметр size. (Надав Райан Келлі в bpo-9957.)

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

Модуль textwrap має новий indent(), який дозволяє легко додавати загальний префікс до вибраних рядків у блоці тексту (bpo-13857).

різьблення

threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event і threading.Timer, усі з яких використовуються бути фабричними функціями, що повертають екземпляр класу, тепер є класами та можуть бути підкласами. (Надав Ерік Араужо в bpo-10968.)

Конструктор threading.Thread тепер приймає аргумент ключового слова daemon, щоб замінити типову поведінку успадкування значення прапора daemon від батьківського потоку (bpo-6064).

Раніше закрита функція _thread.get_ident тепер доступна як публічна функція threading.get_ident(). Це усуває декілька випадків прямого доступу до модуля _thread у stdlib. Код третьої сторони, який використовував _thread.get_ident, також слід змінити, щоб використовувати новий публічний інтерфейс.

час

PEP 418 додав нові функції до модуля time:

  • get_clock_info(): отримати інформацію про годинник.

  • monotonic(): Монотонний годинник (не може повертатися назад), на нього не впливають оновлення системного годинника.

  • perf_counter(): Лічильник продуктивності з найвищою доступною роздільною здатністю для вимірювання короткої тривалості.

  • process_time(): сума системного та користувальницького процесорного часу поточного процесу.

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

Щоб покращити узгодженість між платформами, sleep() тепер викликає ValueError, коли передається від’ємне значення сну. Раніше це була помилка на posix, але спричиняла нескінченний сон у Windows.

види

Додайте новий клас types.MappingProxyType: проксі зіставлення лише для читання. (bpo-14386)

Нові функції types.new_class() і types.prepare_class() забезпечують підтримку для PEP 3115 сумісного створення динамічного типу. (bpo-14588)

unittest

assertRaises(), assertRaisesRegex(), assertWarns() і assertWarnsRegex() тепер приймають аргумент ключового слова msg, коли використовуються як менеджери контексту. (Надано Еціо Мелотті та Вінстоном Евертом у bpo-10775.)

unittest.TestCase.run() тепер повертає об’єкт TestResult.

urllib

Клас Request тепер приймає аргумент method, який використовується get_method(), щоб визначити, який метод HTTP слід використовувати. Наприклад, це надішле запит 'HEAD':

>>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

веб-браузер

Модуль webbrowser підтримує більше «браузерів»: Google Chrome (з назвами chrome, chromium, chrome-browser або chromium-browser залежно у версії й операційній системі), а також загальні засоби запуску xdg-open із проекту FreeDesktop.org і gvfs-open, який є обробником URI за замовчуванням для GNOME 3. ( перший надав Арно Кальметт у bpo-13620, другий — Матіас Клозе в bpo-14493.)

xml.etree.ElementTree

Модуль xml.etree.ElementTree тепер імпортує свій прискорювач C за замовчуванням; більше немає потреби явно імпортувати xml.etree.cElementTree (цей модуль залишається для зворотної сумісності, але тепер він застарів). Крім того, сімейство методів iter Element було оптимізовано (переписано на C). Документацію модуля також було значно покращено, додано приклади та більш детальну довідку.

zlib

New attribute zlib.Decompress.eof makes it possible to distinguish between a properly-formed compressed stream and an incomplete or truncated one. (Contributed by Nadeem Vawda in bpo-12646.)

Новий атрибут zlib.ZLIB_RUNTIME_VERSION повідомляє рядок версії основної бібліотеки zlib, яка завантажується під час виконання. (Надав Торстен Ландшофф у bpo-12306.)

Оптимізації

Додано основні покращення продуктивності:

  • Завдяки PEP 393 деякі операції над рядками Unicode були оптимізовані:

    • обсяг пам’яті ділиться на 2-4 в залежності від тексту

    • кодувати рядок ASCII у UTF-8 більше не потрібно кодувати символи, представлення UTF-8 спільно з представленням ASCII

    • кодувальник UTF-8 оптимізовано

    • повторення однієї літери ASCII і отримання підрядка рядка ASCII відбувається в 4 рази швидше

  • UTF-8 тепер у 2-4 рази швидше. Кодування UTF-16 тепер у 10 разів швидше.

    (Надав Сергій Сторчака, bpo-14624, bpo-14738 та bpo-15026.)

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

Зміни в процесі збирання Python і в API C включають:

Застаріле

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

OS/2 і VMS більше не підтримуються через відсутність супроводжуючого.

Платформи Windows 2000 і Windows, які встановлюють для COMSPEC значення command.com більше не підтримуються через тягар обслуговування.

Підтримку OSF, яка була застарілою у версії 3.2, було повністю видалено.

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

  • Передача непорожнього рядка в object.__format__() є застарілою та викличе TypeError у Python 3.4 (bpo-9856).

  • Кодек unicode_internal застарів через PEP 393, використовуйте UTF-8, UTF-16 (utf-16-le або utf-16-be), або UTF-32 (utf-32-le або utf-32-be)

  • ftplib.FTP.nlst() і ftplib.FTP.dir(): використовуйте ftplib.FTP.mlsd()

  • platform.popen(): використовуйте модуль subprocess. Особливо перевірте розділ Заміна старих функцій модулем subprocess (bpo-11377).

  • bpo-13374: Windows bytes API більше не підтримується в модулі os. Щоб більше не залежати від кодової сторінки ANSI та підтримувати будь-які назви файлів, використовуйте назви файлів у кодуванні Unicode замість імен файлів у байтах.

  • bpo-13988: Модуль xml.etree.cElementTree застарів. Прискорювач використовується автоматично, коли він доступний.

  • Поведінка time.clock() залежить від платформи: замість цього використовуйте нову функцію time.perf_counter() або time.process_time(), залежно від ваших вимог, щоб мати чітко визначену поведінку .

  • Функція os.stat_float_times() застаріла.

  • abc модуль:

  • importlib пакет:

Застарілі функції та типи C API

Py_UNICODE був застарілим PEP 393 і буде видалено в Python 4. Усі функції, що використовують цей тип, застаріли:

Unicode functions and methods using Py_UNICODE and Py_UNICODE* types:

Функції та макроси, що маніпулюють рядками Py_UNICODE*:

Кодери:

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

Код формату 'u' модуля array тепер не підтримується та буде видалено в Python 4 разом з рештою (Py_UNICODE) API.

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

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

Перенесення коду Python

  • Хеш-рандомізація ввімкнена за замовчуванням. Встановіть для змінної середовища PYTHONHASHSEED значення 0, щоб вимкнути рандомізацію хешу. Дивіться також метод object.__hash__().

  • bpo-12326: У Linux sys.platform більше не містить основної версії. Тепер це завжди «linux», а не «linux2» або «linux3», залежно від версії Linux, яка використовується для створення Python. Замініть sys.platform == „linux2“ на sys.platform.startswith(„linux“) або безпосередньо sys.platform == „linux“, якщо вам не потрібна підтримка старіших версій Python.

  • bpo-13847, bpo-14180: time і datetime: OverflowError тепер викликається замість ValueError, якщо немає позначки часу діапазону. OSError тепер виникає, якщо функції C gmtime() або localtime() не вдаються.

  • Засоби пошуку за умовчанням, які використовуються імпортом, тепер використовують кеш того, що міститься в певному каталозі. Якщо ви створюєте вихідний файл Python або файл байт-коду без вихідного коду, обов’язково викличте importlib.invalidate_caches(), щоб очистити кеш, щоб шукачі помітили новий файл.

  • ImportError тепер використовує повну назву модуля, який намагалися імпортувати. Доктести, які перевіряють повідомлення ImportErrors, потрібно буде оновити, щоб використовувати повну назву модуля, а не лише хвіст назви.

  • Аргумент index для __import__() тепер має значення 0 замість -1 і більше не підтримує від’ємні значення. Коли PEP 328 було реалізовано, це було помилкою, що значення за замовчуванням залишилося -1. Якщо вам потрібно продовжити виконання відносного імпорту з подальшим абсолютним імпортом, тоді виконайте відносний імпорт із використанням індексу 1, а потім ще один імпорт із використанням індексу 0. Однак бажано використовувати importlib.import_module() замість безпосереднього виклику __import__().

  • __import__() більше не дозволяє використовувати значення індексу, відмінне від 0, для модулів верхнього рівня. наприклад __import__('sys', level=1) тепер є помилкою.

  • Оскільки sys.meta_path і sys.path_hooks тепер мають засоби пошуку за замовчуванням, ви, швидше за все, захочете використовувати list.insert() замість list.append(), щоб додати до цих списків.

  • Оскільки None тепер вставлено в sys.path_importer_cache, якщо ви очищаєте записи в словнику шляхів, які не мають шукача, вам потрібно буде видалити ключі, поєднані зі значеннями None і imp.NullImporter для зворотної сумісності. Це призведе до додаткових витрат на старіші версії Python, які повторно вставляють None у sys.path_importer_cache, де це означає використання неявних засобів пошуку, але семантично це не повинно нічого змінити.

  • importlib.abc.Finder no longer specifies a find_module() abstract method that must be implemented. If you were relying on subclasses to implement that method, make sure to check for the method’s existence first. You will probably want to check for find_loader() first, though, in the case of working with path entry finders.

  • pkgutil було перетворено на використання importlib внутрішньо. Це усуває багато граничних випадків, коли стара поведінка емуляції імпорту PEP 302 не збігалася з поведінкою реальної системи імпорту. Сама емуляція імпорту все ще присутня, але тепер не підтримується. Функції pkgutil.iter_importers() і pkgutil.walk_packages() представляють спеціальний варіант для стандартних хуків імпорту, тому вони все ще підтримуються, навіть якщо вони не забезпечують нестандартний метод iter_modules().

  • Виправлено давню помилку відповідності вимогам RFC (bpo-1079) у синтаксичному аналізі, виконаному email.header.decode_header(). Код, який використовує стандартну ідіому для перетворення закодованих заголовків у юнікод (str(make_header(decode_header(h))), не побачить жодних змін, але код, який переглядає окремі кортежі, повернуті decode_header, побачить пробіли, які передують або наступні розділи ASCII тепер включено в розділ ASCII. Код, який створює заголовки за допомогою make_header, також має продовжувати працювати без змін, оскільки make_header продовжує додавати пробіли між ASCII і не ASCII розділи, якщо вони ще не присутні у вхідних рядках.

  • email.utils.formataddr() тепер виконує правильне кодування передачі вмісту, коли передаються відображувані імена, відмінні від ASCII. Будь-який код, який залежав від попередньої помилкової поведінки, яка зберігала не-ASCII Юнікод у форматованому вихідному рядку, потрібно буде змінити (bpo-1690608).

  • poplib.POP3.quit() тепер може викликати помилки протоколу, як і всі інші методи poplib. Код, який припускає, що вийти не викликає помилки poplib.error_proto, може знадобитися змінити, якщо певна програма стикається з помилками вийти (bpo-11291).

  • Аргумент strict для email.parser.Parser, застарілий з Python 2.4, нарешті видалено.

  • Застарілий метод unittest.TestCase.assertSameElements було видалено.

  • Застарілу змінну time.accept2dyear видалено.

  • Застарілий атрибут Context._clamp було видалено з модуля decimal. Раніше він був замінений публічним атрибутом clamp. (Див. bpo-8540.)

  • Недокументований внутрішній допоміжний клас SSLFakeFile було видалено з smtplib, оскільки його функціональні можливості протягом тривалого часу надавалися безпосередньо socket.socket.makefile().

  • Передача від’ємного значення time.sleep() у Windows тепер викликає помилку, а не сплячий режим назавжди. Це завжди викликало помилку на posix.

  • Константу ast.__version__ видалено. Якщо вам потрібно прийняти рішення, на які впливає версія AST, використовуйте sys.version_info для прийняття рішення.

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

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

Перенесення коду C

  • Під час змін до API буфера було видалено недокументований член smalltable структури Py_buffer і макет PyMemoryViewObject змінилося.

    Усі розширення, що покладаються на відповідні частини в memoryobject.h або object.h, повинні бути перебудовані.

  • Через PEP 393, тип Py_UNICODE та всі функції, що використовують цей тип, застаріли (але залишатимуться доступними щонайменше п’ять років). Якщо ви використовували низькорівневі API Unicode для створення та доступу до об’єктів Unicode та хочете скористатися перевагами зменшення обсягу пам’яті, яке забезпечує PEP 393, вам потрібно перетворити свій код на новий API Unicode.

    Однак, якщо ви використовували лише функції високого рівня, такі як PyUnicode_Concat(), PyUnicode_Join() або PyUnicode_FromFormat(), ваш код автоматично прийматиме переваги нових представлень Unicode.

  • PyImport_GetMagicNumber() тепер повертає -1 у разі помилки.

  • Оскільки від’ємне значення для аргументу level для __import__() більше недійсне, те саме тепер стосується PyImport_ImportModuleLevel(). Це також означає, що значення level, яке використовується PyImport_ImportModuleEx(), тепер дорівнює 0 замість -1.

Будівля C розширення

  • Діапазон можливих імен файлів для розширень C було звужено. Дуже рідко використовувані варіанти написання були придушені: у POSIX файли з іменами xxxmodule.so, xxxmodule.abi3.so і xxxmodule.cpython-*.so більше не розпізнаються як такі, що реалізують` модуль xxx`. Якщо ви створювали такі файли, вам потрібно переключитися на інші варіанти написання (тобто видалити рядок module з імен файлів).

    (реалізовано в bpo-14040.)

Зміни перемикача командного рядка

  • Прапор командного рядка -Q і пов’язані артефакти видалено. Код перевірки sys.flags.division_warning потребує оновлення.

    (bpo-10998, надано Еріком Араухо.)

  • Коли python запускається за допомогою -S, import site більше не додаватиме шляхи для сайту до шляхів пошуку модуля. У попередніх версіях так і було.

    (bpo-11591, надано Карлом Майєром з виданнями Еріка Араухо.)