Що нового в 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 не було додано нових функцій синтаксису.
Інші нові функції:
Новостворені дескриптори файлів не успадковуються (PEP 446).
параметр командного рядка для ізольованого режиму (bpo-16499).
покращення в обробці кодеків, які не є текстовими кодуваннями (кілька проблем).
A ModuleSpec Type для системи імпорту (PEP 451). (Впливає на авторів-імпортерів.)
Формат
marshal
зроблено компактнішим і ефективнішим (bpo-16475).
Нові бібліотечні модулі:
asyncio
: Новий тимчасовий API для асинхронного введення-виведення (PEP 3156).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 446), щоб уникнути витоку дескрипторів файлів у дочірні процеси.
Нова опція командного рядка для ізольованого режиму, (bpo-16499).
multiprocessing
тепер має опцію, щоб уникнути використання os.fork на Unix. spawn і forkserver більш безпечні, оскільки вони уникають обміну даними з дочірніми процесами.multiprocessing
дочірні процеси в Windows більше не успадковують усі успадковані дескриптори батьківського процесу, лише необхідні.Нова функція
hashlib.pbkdf2_hmac()
забезпечує функцію виведення ключа на основі пароля PKCS#5 2.Отримання сертифікатів із сховища сертифікатів системи Windows підтримує для
ssl
.Клас
ssl.SSLContext
має багато покращень.Усі модулі в стандартній бібліотеці, які підтримують SSL, тепер підтримують перевірку сертифікатів сервера, включаючи відповідність імен хостів (
ssl.match_hostname()
) і CRL (списки відкликаних сертифікатів, див.ssl.SSLContext.load_verify_locations()
).
Покращення реалізації CPython:
Використовуючи PEP 442, у більшості випадків глобальні параметри модуля більше не встановлюються на None під час фіналізації (bpo-18214).
Будь ласка, прочитайте повний список змін, які стосуються користувача, включаючи багато інших менших покращень, оптимізацію CPython, застарілі та потенційні проблеми з перенесенням.
Нові можливості¶
PEP 453: Явне початкове завантаження PIP у встановленнях Python¶
За замовчуванням завантажувальний pip¶
Новий модуль ensurepip
(визначений у PEP 453) забезпечує стандартний міжплатформний механізм для завантаження інсталятора pip у інсталяції Python і віртуальні середовища. Версія pip
, що входить до складу Python 3.4.0, — це pip
1.5.4, і в майбутніх випусках технічного обслуговування 3.4.x оновлюватиметься пакетна версія до останньої версії pip
, доступної за адресою час створення реліз-кандидата.
За замовчуванням команди pipX
і pipX.Y
будуть встановлені на всіх платформах (де X.Y означає версію інсталяції Python), а також пакет pip
Python і його залежності . У Windows і у віртуальних середовищах на всіх платформах також буде встановлено неверсійну команду pip
. На інших платформах загальносистемна неверсійна команда pip
зазвичай відноситься до окремо встановленої версії Python 2.
Утиліта командного рядка pyvenv
і модуль venv
використовують модуль ensurepip
, щоб зробити pip
доступним у віртуальних середовищах. Під час використання утиліти командного рядка pip
встановлено за замовчуванням, тоді як при використанні модуля venv
API встановлення pip
має бути запитане явно.
Для CPython source будується на системах POSIX, команди make install
і make altinstall
завантажують pip
за замовчуванням. Цю поведінку можна контролювати за допомогою параметрів конфігурації та перевизначати за допомогою параметрів Makefile.
У Windows і Mac OS X інсталятори CPython тепер за замовчуванням встановлюють pip
разом із самим CPython (користувачі можуть відмовитися від його встановлення під час процесу встановлення). Користувачам Windows потрібно буде ввімкнути автоматичні зміни PATH, щоб за замовчуванням мати pip доступним із командного рядка, інакше до нього можна отримати доступ через засіб запуску Python для Windows за допомогою py -m pip
.
Як обговорювалося в PEP, пакувальники платформи можуть не встановлювати ці команди за замовчуванням, якщо під час виклику вони надають чіткі та прості вказівки щодо їх встановлення на цій платформі (зазвичай за допомогою системного менеджера пакетів) .
Примітка
Щоб уникнути конфліктів між паралельними інсталяціями Python 2 і Python 3, лише версії команд pip3
і pip3.4
завантажуються за замовчуванням, коли ensurepip
викликається безпосередньо - --default- Опція pip потрібна для запиту неверсійної команди pip. ``pyvenv
і інсталятор Windows забезпечують доступність некваліфікованої команди pip
у цих середовищах, а pip
завжди можна викликати за допомогою перемикача -m
, а не безпосередньо, щоб уникнути неоднозначність у системах із кількома інсталяціями Python.
Зміни в документації¶
У рамках цієї зміни розділи Встановлення модулів Python і Розповсюдження модулів Python документації були повністю перероблені як короткі документи про початок роботи та FAQ. Більшість пакетної документації тепер переміщено до Python Packaging Authority, який підтримується Python Packaging User Guide і документація окремих проектів.
Однак, оскільки ця міграція ще не завершена, застарілі версії цих посібників залишаються доступними як Встановлення модулів Python (застаріла версія) і Розповсюдження модулів Python (застаріла версія).
Дивись також
- PEP 453 – Явне початкове завантаження pip у інсталяціях Python
PEP, написаний Дональдом Стаффтом і Ніком Когланом, реалізований Дональдом Стаффтом, Ніком Когланом, Мартіном фон Льовісом і Недом Дейлі.
PEP 446: щойно створені дескриптори файлів не успадковуються¶
PEP 446 робить новостворені дескриптори файлів неуспадкованими. Загалом це те, чого захоче програма: під час запуску нового процесу наявність відкритих файлів, також відкритих у новому процесі, може призвести до різного роду помилок, які важко знайти, і потенційно до проблем безпеки.
Однак бувають випадки, коли бажано отримати спадок. Для підтримки цих випадків доступні такі нові функції та методи:
Дивись також
- PEP 446 – Зробити новостворені дескриптори файлів неуспадковуваними
PEP написав і реалізував Віктор Стіннер.
Покращення обробки кодеків¶
З моменту появи вперше модуль codecs
завжди був призначений для роботи як нейтральна до типу система динамічного кодування та декодування. Однак його тісний зв’язок із текстовою моделлю Python, особливо зручні методи з обмеженим типом у вбудованих типах str
, bytes
і bytearray
, історично приховав цей факт.
Як ключовий крок у проясненні ситуації, зручні функції codecs.encode()
і codecs.decode()
тепер належним чином задокументовані в Python 2.7, 3.3 і 3.4. Ці функції існували в модулі codecs
(і були охоплені набором тестів регресії) з Python 2.4, але раніше їх можна було виявити лише під час самоаналізу.
На відміну від зручних методів str
, bytes
і bytearray
, зручні функції codecs
підтримують довільні кодеки в Python 2 і Python 3, а не обмежені у кодування тексту Unicode (у Python 3) або перетворення basestring
<-> basestring
(у Python 2).
У Python 3.4 інтерпретатор може ідентифікувати відомі нетекстові кодування, надані в стандартній бібліотеці, і спрямовувати користувачів до цих зручних функцій загального призначення, коли це необхідно:
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
У зв’язаних змінах, коли це можливо без порушення зворотної сумісності, винятки, які виникають під час операцій кодування та декодування, загортаються в ланцюговий виняток того самого типу, у якому згадується ім’я кодека, відповідального за створення помилки:
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
Нарешті, як показують наведені вище приклади, ці вдосконалення дозволили відновити зручні псевдоніми для кодеків, відмінних від Unicode, які самі були відновлені в Python 3.2. Це означає, що кодування двійкових даних у їх шістнадцяткове представлення та з них (наприклад) тепер можна записати так:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
Двійкові та текстові перетворення, надані в стандартній бібліотеці, детально описані в Двійкові перетворення і Перетворення тексту.
(Надано Ніком Когланом у bpo-7475, bpo-17827, bpo-17828 та bpo-19619.)
PEP 451: тип ModuleSpec для системи імпорту¶
PEP 451 забезпечує інкапсуляцію інформації про модуль, яку механізм імпорту використовуватиме для його завантаження (тобто специфікацію модуля). Це допомагає спростити як реалізацію імпорту, так і кілька пов’язаних з імпортом API. Ця зміна також є кроком до декількох майбутніх покращень, пов’язаних з імпортом.
Загальнодоступні зміни від PEP повністю сумісні з попередніми версіями. Крім того, вони мають бути прозорими для всіх, крім авторів-імпортерів. Методи пошуку та завантаження ключів застаріли, але вони продовжуватимуть працювати. Нові імпортери повинні використовувати нові методи, описані в PEP. Існуючі імпортери мають бути оновлені для впровадження нових методів. Перегляньте розділ Застаріле для списку методів, які слід замінити, і їх замін.
Інші зміни мови¶
Деякі менші зміни, внесені до основної мови Python:
Базу даних Unicode оновлено до UCD версії 6.3.
min()
іmax()
тепер приймають аргумент за замовчуванням, що містить лише ключове слово, яке можна використовувати для вказівки значення, яке вони повертають, якщо ітерація, яку вони оцінюють, не має елементів. (Надав Джуліан Берман у bpo-18111.)Module objects are now
weakref
’able.Атрибути модуля
__file__
(та відповідні значення) тепер завжди повинні містити абсолютні шляхи за замовчуванням, за єдиним винятком__main__.__file__
, коли сценарій виконується безпосередньо за допомогою відносного шляху. (Надано Бреттом Кенноном у bpo-18416.)Усі кодеки UTF-* (крім UTF-7) тепер відхиляють сурогати як під час кодування, так і під час декодування, якщо не використовується обробник помилок
surrogatepass
, за винятком декодера UTF-16 (який приймає дійсні пари сурогатів) і кодувальник UTF-16 (який створює їх під час кодування символів, відмінних від BMP). (Надано Віктором Стіннером, Кан-Хао (Кенні) Лу та Сергієм Сторчакою в bpo-12892.)Новий німецький EBCDIC codec
cp273
. (Надано Майклом Біренфельдом та Ендрю Кухлінгом у bpo-1097797.)Новий український codec
cp1125
. (Надав Сергій Сторчака в bpo-19668.)bytes
.join() іbytearray
.join() тепер приймають довільні буферні об’єкти як аргументи. (Надав Антуан Пітру в bpo-15958.)Конструктор
int
тепер приймає будь-який об’єкт, який має метод__index__
для аргументу base. (Надав Марк Дікінсон у bpo-16772.)Об’єкти фрейму тепер мають метод
clear()
, який очищає всі посилання на локальні змінні з фрейму. (Надав Антуан Пітру в bpo-17934.)memoryview
тепер зареєстровано якSequence
, і підтримує вбудованийreversed()
. (Надано Ніком Когланом і Клаудіу Попою в bpo-18690 і bpo-19078.)Сигнатури, про які повідомляє
help()
, були змінені та покращені в кількох випадках у результаті впровадження Argument Clinic та інших змін до модулівinspect
іpydoc
.__length_hint__()
тепер є частиною формальної специфікації мови (див. PEP 424). (Надав Армін Роначер у bpo-16148.)
Нові модулі¶
asyncio¶
Новий модуль asyncio
(визначений у PEP 3156) надає стандартну підключаючу модель циклу подій для Python, надаючи надійну підтримку асинхронного введення-виведення в стандартній бібліотеці та полегшуючи взаємодію інших реалізацій циклу подій. зі стандартною бібліотекою та один з одним.
Для Python 3.4 цей модуль вважається provisional API.
Дивись також
- PEP 3156 – Перезавантажено підтримку асинхронного вводу-виводу: модуль «asyncio»
Написання PEP та впровадження під керівництвом Гвідо ван Россума.
securepip¶
Новий модуль ensurepip
є основною інфраструктурою для реалізації PEP 453. У звичайному перебігу подій кінцевим користувачам не потрібно буде взаємодіяти з цим модулем, але його можна використовувати для ручного завантаження pip
, якщо автоматичне завантаження у встановлене чи віртуальне середовище було відхилено.
ensurepip
includes a bundled copy of pip
, up-to-date as of the first
release candidate of the release of CPython with which it ships (this applies
to both maintenance releases and feature releases). ensurepip
does not
access the internet. If the installation has Internet access, after
ensurepip
is run the bundled pip
can be used to upgrade pip
to a
more recent release than the bundled one. (Note that such an upgraded version
of pip
is considered to be a separately installed package and will not be
removed if Python is uninstalled.)
Модуль називається ensurepip, тому що якщо його викликати, коли pip
уже встановлено, він нічого не робить. Він також має опцію --upgrade
, яка змусить його встановити пакетну копію pip
, якщо наявна встановлена версія pip
старіша за пакетну копію.
перелік¶
Новий модуль enum
(визначений у PEP 435) забезпечує стандартну реалізацію типів перерахування, що дозволяє іншим модулям (таким як socket
) надавати більш інформативні повідомлення про помилки та покращувати підтримку налагодження. шляхом заміни непрозорих цілочисельних констант на зворотно сумісні значення перерахування.
Дивись також
- PEP 435 – Додавання типу Enum до стандартної бібліотеки Python
PEP, написаний Баррі Варшау, Елі Бендерскі та Ітаном Фурманом, реалізований Ітаном Фурманом.
pathlib¶
Новий модуль pathlib
пропонує класи, що представляють шляхи файлової системи із семантикою, відповідною до різних операційних систем. Класи шляхів поділяються на чисті шляхи, які забезпечують суто обчислювальні операції без введення-виведення, і конкретні шляхи, які успадковують чисті шляхи, але також забезпечують операції введення-виведення.
Для Python 3.4 цей модуль вважається provisional API.
Дивись також
- PEP 428 – Модуль pathlib – шляхи об’єктно-орієнтованої файлової системи
PEP написаний і реалізований Антуаном Пітру.
селектори¶
Новий модуль selectors
(створений як частина реалізації PEP 3156) забезпечує високорівневе й ефективне мультиплексування вводу/виводу, побудоване на основі примітивів модуля select
.
статистика¶
Новий модуль statistics
(визначений у PEP 450) пропонує деякі основні функції статистики безпосередньо в стандартній бібліотеці. Цей модуль підтримує обчислення середнього значення, медіани, моди, дисперсії та стандартного відхилення ряду даних.
Дивись також
- PEP 450 – Додавання модуля статистики до стандартної бібліотеки
PEP написаний і реалізований Стівеном Д’Апрано
tracemalloc¶
Новий модуль tracemalloc
(визначений у PEP 454) є інструментом налагодження для відстеження блоків пам’яті, виділених Python. Він надає таку інформацію:
Відстеження місця розміщення об’єкта
Статистика виділених блоків пам’яті на ім’я файлу та номер рядка: загальний розмір, кількість і середній розмір виділених блоків пам’яті
Обчисліть різницю між двома знімками, щоб виявити витоки пам’яті
Дивись також
- PEP 454 – Додайте новий модуль tracemalloc для відстеження розподілу пам’яті Python
PEP написав і реалізував Віктор Стіннер
Покращені модулі¶
абв¶
Нову функцію abc.get_cache_token()
можна використовувати, щоб знати, коли робити кеші недійсними, на які впливають зміни в графі об’єктів. (Надав Łukasz Langa в bpo-16832.)
Новий клас ABC
має ABCMeta
як мета-клас. Використання ABC
як базового класу має по суті той самий ефект, що й визначення metaclass=abc.ABCMeta
, але його простіше вводити та легше читати. (Надав Бруно Дюпюї в bpo-16049.)
aifc¶
Метод getparams()
тепер повертає іменований кортеж, а не звичайний кортеж. (Надав Клаудіу Попа в bpo-17818.)
aifc.open()
тепер підтримує протокол керування контекстом: при використанні в блоці with
метод close()
повернутого об’єкта буде викликано автоматично під час кінець блоку. (Надав Сергій Сторчача в bpo-16486.)
Методи writeframesraw()
і writeframes()
тепер приймають будь-які bytes-like object. (Надав Сергій Сторчака в bpo-8311.)
argparse¶
Клас FileType
тепер приймає аргументи encoding і errors, які передаються до open()
. (Надав Лукас Майстр у bpo-11175.)
аудіооп¶
audioop
тепер підтримує 24-бітні семпли. (Надав Сергій Сторчака в bpo-12866.)
Нова функція byteswap()
перетворює вибірки з порядковим порядком байтів у порядковий порядок байтів у порядковий порядок байтів і навпаки. (Надав Сергій Сторчака в bpo-19641.)
Усі функції audioop
тепер приймають будь-які байт-подібні об’єкти. Рядки не приймаються: раніше не працювали, тепер відразу видають помилку. (Надав Сергій Сторчака в bpo-16685.)
база64¶
Функції кодування та декодування в base64
тепер приймають будь-які bytes-подібні об’єкти у випадках, коли раніше вимагали екземпляр bytes
або bytearray
. (Надав Нік Коглан у bpo-17839.)
Нові функції a85encode()
, a85decode()
, b85encode()
та b85decode()
надають можливість кодувати та декодувати двійкові дані з і до форматів Ascii85
і git/mercurial Base85
відповідно. Функції a85
мають параметри, за допомогою яких можна зробити їх сумісними з варіантами кодування Ascii85
, включно з варіантом Adobe. (Надано Мартіном Моррісоном, проектом Mercurial, Сергієм Сторчакою та Антуаном Пітру в bpo-17618.)
колекції¶
Метод ChainMap.new_child()
тепер приймає аргумент m, який визначає дочірню карту, яку потрібно додати до ланцюжка. Це дозволяє використовувати наявне зіставлення та/або настроюваний тип зіставлення для дочірнього елемента. (Надав Віней Саджип у bpo-16613.)
colorys¶
Кількість цифр у коефіцієнтах для перетворень RGB — YIQ було розширено, щоб вони відповідали версіям FCC NTSC. Зміна в результатах має бути менше 1% і може краще відповідати результатам, знайденим в інших місцях. (Надано Браяном Лендерсом і Сергієм Сторчакою в bpo-14323.)
contextlib¶
Новий контекстний менеджер contextlib.suppress
допомагає прояснити призначення коду, який навмисно пригнічує винятки з одного оператора. (Надано Раймондом Хеттінгером у bpo-15806 та Zero Piraeus у bpo-19266.)
Новий контекстний менеджер contextlib.redirect_stdout()
спрощує роботу сценаріїв утиліт з негнучкими API, які записують свої виведення в sys.stdout
і не надають жодних опцій для його перенаправлення. За допомогою диспетчера контексту вихід sys.stdout
можна перенаправити в будь-який інший потік або, у поєднанні з io.StringIO
, у рядок. Останнє може бути особливо корисним, наприклад, для захоплення виводу з функції, яка була написана для реалізації інтерфейсу командного рядка. Рекомендовано лише для службових сценаріїв, оскільки це впливає на глобальний стан sys.stdout
. (Надав Реймонд Геттінгер у bpo-15805.)
Документацію contextlib
також було оновлено, щоб включити обговорення відмінностей між одноразовими, багаторазовими та повторними контекстними менеджерами.
dbm¶
Об’єкти dbm.open()
тепер підтримують протокол керування контекстом. При використанні в операторі with
метод close
об’єкта бази даних буде викликано автоматично в кінці блоку. (Надано Клаудіу Попою та Ніком Когланом у bpo-19282.)
дис¶
Функції show_code()
, dis()
, distb()
і disassemble()
тепер приймають файл лише з ключовими словами аргумент, який керує місцем запису результату.
Модуль dis
тепер побудовано навколо класу Instruction
, який забезпечує об’єктно-орієнтований доступ до деталей кожної окремої операції байт-коду.
Новий метод, get_instructions()
, надає ітератор, який видає потік інструкцій для певної частини коду Python. Таким чином, тепер можна написати програму, яка перевіряє та обробляє об’єкт байт-коду способами, відмінними від тих, які надає сам модуль dis
. Наприклад:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
Різні інструменти відображення в модулі dis
було переписано для використання цих нових компонентів.
Крім того, новий зручний для додатків клас Bytecode
надає об’єктно-орієнтований API для перевірки байт-коду як у зрозумілій людині формі, так і для повторення інструкцій. Конструктор Bytecode
приймає ті самі аргументи, що і get_instruction()
(плюс необов’язковий current_offset), і отриманий об’єкт можна повторювати для створення Об’єкти Instruction
. Але він також має метод dis
, еквівалентний виклику dis
в аргументі конструктора, але повертається як багаторядковий рядок:
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode
також має метод класу, from_traceback()
, який надає можливість маніпулювати трасуванням (тобто print(Bytecode.from_traceback(tb). dis())
еквівалентно distb(tb)
).
(Надано Ніком Когланом, Раяном Келлі та Томасом Клайвером у bpo-11816 та Клаудіу Попою у bpo-17916.)
Нова функція stack_effect()
обчислює вплив заданого коду операції та аргументу на стек Python, інформації, яка інакше недоступна. (Надано Ларрі Гастінгсом у bpo-19722.)
doctest¶
Новий прапор параметра, FAIL_FAST
, зупиняє виконання тесту, як тільки виявлено першу помилку. (Надано Р. Девідом Мюрреєм і Деніелом Урбаном у bpo-16522.)
Інтерфейс командного рядка doctest
тепер використовує argparse
і має два нові параметри, -o
і -f
. -o
дозволяє doctest options вказувати в командному рядку, а -f
є скороченням -o FAIL_FAST
(для паралельного аналогічного параметра, який підтримується unittest
CLI). (Надав Р. Девід Мюррей у bpo-11390.)
doctest
тепер знаходитиме doctests у рядках __doc__
модуля розширення. (Надано Zachary Ware у bpo-3158.)
електронною поштою¶
as_string()
тепер приймає аргумент policy для заміни політики за замовчуванням повідомлення під час генерації його представлення рядка. Це означає, що as_string
тепер можна використовувати в більшій кількості обставин, замість того, щоб створювати та використовувати generator
для передачі параметрів форматування його методу flatten
. (Надав Р. Девід Мюррей у bpo-18600.)
Новий метод as_bytes()
додано для створення представлення повідомлення в байтах подібно до того, як as_string
створює представлення рядка. Він не приймає аргумент maxheaderlen, але приймає аргументи unixfrom і policy. Метод Message
__bytes__()
викликає його, що означає, що bytes(mymsg)
тепер створюватиме інтуїтивно зрозумілий результат: об’єкт bytes, що містить повністю відформатованого повідомлення. (Надав Р. Девід Мюррей у bpo-18600.)
Повідомлення Message.set_param()
тепер приймає аргумент ключового слова replace. Якщо вказано, пов’язаний заголовок буде оновлено без зміни його розташування в списку заголовків. Для зворотної сумісності стандартним значенням є False
. (Надав Р. Девід Мюррей у bpo-18891.)
Додано пару нових підкласів Message
(EmailMessage
і MIMEPart
), а також новий підмодуль contentmanager
і новий атрибут policy
content_manager
. Уся документація зараз знаходиться в новому модулі, який додається як частина нового provisional API електронної пошти. Ці класи надають низку нових методів, які значно спрощують вилучення вмісту з повідомлень електронної пошти та вставлення вмісту в нього. Додаткову інформацію див. у документації contentmanager
і email: Examples. Ці доповнення API завершують основну частину роботи, яка була запланована в рамках проекту email6. Наразі попередній API планується стати остаточним у Python 3.5 (можливо, з кількома незначними доповненнями в області обробки помилок). (Надав Р. Девід Мюррей у bpo-18891.)
filecmp¶
Нова функція clear_cache()
надає можливість очистити кеш порівняння filecmp
, який використовує інформацію os.stat()
, щоб визначити, чи файл змінився з часу останнього порівняння. Це можна використати, наприклад, якщо файл міг бути змінений і повторно перевірений за менший час, ніж роздільна здатність поля часу модифікації файлу певної файлової системи. (Надав Марк Левітт у bpo-18149.)
Новий атрибут модуля DEFAULT_IGNORES
надає список каталогів, які використовуються як значення за замовчуванням для параметра ignore функції dircmp()
. (Надав Елі Бендерський у bpo-15442.)
functools¶
Новий дескриптор partialmethod()
забезпечує часткове застосування аргументів до дескрипторів, так само як partial()
забезпечує звичайні виклики. Новий дескриптор також полегшує роботу довільних викликів (включно з екземплярами partial()
) як звичайні методи екземплярів, якщо їх включити у визначення класу. (Надано Алоном Хоревом і Ніком Когланом у bpo-4331.)
Новий декоратор singledispatch()
забезпечує підтримку загальних функцій з одноразовим відправленням у стандартну бібліотеку Python. Якщо об’єктно-орієнтоване програмування зосереджено на групуванні кількох операцій із загальним набором даних у клас, загальна функція фокусується на групуванні кількох реалізацій операції, що дозволяє працювати з різними типами даних.
Дивись також
- PEP 443 – Загальні функції з одним відправленням
PEP написав і реалізував Лукаш Ланга.
total_ordering()
тепер підтримує повернення значення NotImplemented
від основної функції порівняння. (Надано Кеті Міллер у bpo-10042.)
Чиста версія функції partial()
на Python тепер знаходиться в stdlib; у CPython він перевизначений прискореною версією C, але він доступний для використання в інших реалізаціях. (Надав Браян Торн у bpo-12428.)
gc¶
Нова функція get_stats()
повертає список із трьох словників для кожного покоління, що містить статистику колекцій з моменту запуску інтерпретатора. (Надав Антуан Пітру в bpo-16351.)
глоб¶
Нова функція escape()
надає спосіб екранувати спеціальні символи в назві файлу, щоб вони не ставали частиною розширення globbing, а натомість зіставлялися буквально. (Надав Сергій Сторчака в bpo-8402.)
хешліб¶
Нова функція hashlib.pbkdf2_hmac()
забезпечує функцію виведення ключа на основі пароля PKCS#5 2. (Надав Крістіан Хеймс у bpo-18582.)
Атрибут name
хеш-об’єктів hashlib
тепер офіційно підтримується інтерфейсом. Він завжди існував у hashlib
CPython (хоча він не повертав імена нижнього регістру для всіх підтримуваних хешів), але він не був загальнодоступним інтерфейсом, тому деякі інші реалізації Python раніше його не підтримували. (Надав Джейсон Р. Кумбс у bpo-18532.)
hmac¶
hmac
тепер приймає bytearray
, а також bytes
для аргументу key для функції new()
і параметр msg для обох: Функція new()
і метод update()
тепер приймають будь-який тип, який підтримується модулем hashlib
. (Надав Йонас Борґстрем у bpo-18240.)
Аргументом digestmod для функції hmac.new()
тепер може бути будь-яке ім’я дайджесту хешу, яке розпізнає hashlib
. Крім того, поточна поведінка, у якій значенням digestmod за замовчуванням є MD5
, є застарілою: у майбутній версії Python значення за замовчуванням не буде. (Надав Крістіан Хеймс у bpo-17276.)
З додаванням атрибутів block_size
і name
(та офіційної документації атрибута digest_size
), Модуль hmac
тепер повністю відповідає PEP 247 API. (Надав Крістіан Хеймс у bpo-18775.)
html¶
Нова функція unescape()
перетворює посилання на символи HTML5 на відповідні символи Unicode. (Надав Еціо Мелотті в bpo-2927.)
HTMLParser
приймає новий аргумент ключового слова convert_charrefs, який, коли True
, автоматично перетворює всі посилання на символи. Для зворотної сумісності його значення за замовчуванням False
, але воно зміниться на True
у майбутніх версіях Python, тому вам пропонується встановити його явно та оновити свій код, щоб використовувати цю нову функцію. (Надав Еціо Мелотті в bpo-13633.)
Строгий аргумент HTMLParser
тепер застарів. (Надав Еціо Мелотті в bpo-15114.)
http¶
send_error()
тепер приймає необов’язковий додатковий параметр explain, який можна використовувати для надання розширеного опису помилки, замінюючи жорстко запрограмоване за умовчанням, якщо воно є. Цей розширений опис помилки буде відформатовано за допомогою атрибута error_message_format
і надіслано як тіло відповіді про помилку. (Надав Карл Коу в bpo-12921.)
http.server
інтерфейс командного рядка тепер має опцію -b/--bind
, яка змушує сервер слухати певну адресу. (Надав Малте Сварт у bpo-17764.)
idlelib і IDLE¶
Оскільки idlelib реалізує оболонку та редактор IDLE і не призначений для імпорту іншими програмами, він отримує покращення з кожним випуском. Дивіться Lib/idlelib/NEWS.txt
для сукупного списку змін, починаючи з 3.3.0, а також змін, внесених у майбутніх випусках 3.4.x. Цей файл також доступний у діалоговому вікні IDLE .
importlib¶
InspectLoader
ABC визначає новий метод, source_to_code()
, який приймає вихідні дані та шлях і повертає об’єкт коду. Реалізація за замовчуванням еквівалентна compile(data, path, 'exec', dont_inherit=True)
. (Надано Еріком Сноу та Бреттом Кенноном у bpo-15627.)
InspectLoader
також тепер має реалізацію за замовчуванням для методу get_code()
. Однак, як правило, бажано замінити реалізацію за замовчуванням з міркувань продуктивності. (Надано Бреттом Кенноном у bpo-18072.)
Функцію reload()
було переміщено з imp
до importlib
як частину застарілого модуля imp
. (Надано Berker Peksag у bpo-18193.)
importlib.util
тепер має атрибут MAGIC_NUMBER
, який надає доступ до номера версії байт-коду. Це замінює функцію get_magic()
у застарілому модулі imp
. (Надано Бреттом Кенноном у bpo-18192.)
Нові функції importlib.util
cache_from_source()
і source_from_cache()
замінюють однойменні функції в застарілому модулі imp
. (Надано Бреттом Кенноном у bpo-18194.)
Завантажувач importlib
NamespaceLoader
тепер відповідає InspectLoader
ABC, що означає, що runpy
і python -m
тепер можна використовувати з простором імен пакети. (Надано Бреттом Кенноном у bpo-18058.)
importlib.util
має нову функцію decode_source()
, яка декодує джерело з байтів за допомогою універсальної обробки нового рядка. Це корисно для реалізації методів InspectLoader.get_source()
.
importlib.machinery.ExtensionFileLoader
тепер має метод get_filename()
. Це було ненавмисно пропущено в початковій реалізації. (Надав Ерік Сноу в bpo-19152.)
оглядати¶
Модуль inspect
тепер пропонує базовий інтерфейс командного рядка для швидкого відображення вихідного коду та іншої інформації для модулів, класів і функцій. (Надано Клаудіу Попою та Ніком Когланом у bpo-18626.)
unwrap()
полегшує розгадування ланцюжків функцій оболонки, створених functools.wraps()
(та будь-яким іншим API, який встановлює атрибут __wrapped__
для функції оболонки). (Надано Деніелом Урбаном, Аароном Айлзом і Ніком Когланом у bpo-13266.)
Як частина реалізації нового модуля enum
, модуль inspect
тепер має значно кращу підтримку користувацьких методів __dir__
і атрибутів динамічного класу, що надаються через метакласи. (Надав Ітан Фурман у bpo-18929 і bpo-19030.)
getfullargspec()
і getargspec()
тепер використовують API signature()
. Це дозволяє їм підтримувати набагато ширший діапазон викликів, включаючи ті, що мають атрибути __signature__
, ті, що мають метадані, надані клінікою аргументів, об’єкти functools.partial()
тощо. Зауважте, що, на відміну від signature()
, ці функції все ще ігнорують атрибути __wrapped__
і повідомляють про вже прив’язаний перший аргумент для прив’язаних методів, тому все одно необхідно оновити свій код, щоб використовувати signature()
безпосередньо, якщо ці функції потрібні. (Надав Юрій Селіванов у bpo-17481.)
signature()
тепер підтримує типи качок функцій CPython, що додає підтримку функцій, скомпільованих за допомогою Cython. (Надано Стефаном Бенелем і Юрієм Селівановим у bpo-17159.)
IP-адреса¶
ipaddress
було додано до стандартної бібліотеки в Python 3.3 як provisional API. З випуском Python 3.4 цю кваліфікацію було видалено: ipaddress
тепер вважається стабільним API, охопленим нормальними стандартними вимогами бібліотеки для підтримки зворотної сумісності.
Нова властивість is_global
має значення True
, якщо адресу можна глобально маршрутизувати. (Надав Пітер Муді в bpo-17400.)
лісозаготівля¶
TimedRotatingFileHandler
має новий параметр atTime, за допомогою якого можна вказати час доби, коли має відбутися ролловер. (Надав Рональд Оуссорен у bpo-9556.)
SocketHandler
і DatagramHandler
тепер підтримують сокети домену Unix (встановивши port на None
). (Надано Вінаєм Саджипом у коміті ce46195b56a9.)
fileConfig()
тепер приймає екземпляр підкласу configparser.RawConfigParser
для параметра fname. Це полегшує використання файлу конфігурації, коли конфігурація журналювання є лише частиною загальної конфігурації програми або коли програма змінює конфігурацію перед передачею її в fileConfig()
. (Надав Віней Саджип у bpo-16110.)
Дані конфігурації журналу, отримані з сокета через функцію logging.config.listen()
, тепер можна перевірити перед обробкою, надаючи функцію перевірки як аргумент для нового аргументу ключового слова verify. (Надав Віней Саджип у bpo-15452.)
маршал¶
Версію marshal
за замовчуванням було збільшено до 3. Код, що реалізує нову версію, відновлює поведінку Python2 щодо запису лише однієї копії інтернованих рядків і збереження інтернінгу під час десеріалізації, а також розширює цю можливість «однієї копії» на будь-які тип об’єкта (включаючи обробку рекурсивних посилань). Це зменшує як розмір файлів .pyc
, так і обсяг пам’яті, який модуль займає в пам’яті, коли він завантажується з файлу .pyc
(або .pyo
). (Надав Крістіан Валур Йонссон у bpo-16475, з додатковими прискореннями Антуаном Пітру в bpo-19219.)
mmap¶
mmap objects can now be weakref
ed. (Contributed by Valerie Lambert in
bpo-4885.)
багатопроцесорність¶
В Unix два нові методи запуску, spawn
і forkserver
, були додані для запуску процесів за допомогою multiprocessing
. Це робить змішування процесів із потоками більш надійним, а метод spawn
відповідає семантиці, яку багатопроцесорність завжди використовувала в Windows. Нова функція get_all_start_methods()
повідомляє про всі методи запуску, доступні на платформі, get_start_method()
повідомляє поточний метод запуску, а set_start_method()
встановлює метод запуску. (Надав Річард Оудкерк у bpo-8713.)
multiprocessing
також тепер має концепцію контексту
, який визначає, як створюються дочірні процеси. Нова функція get_context()
повертає контекст, який використовує вказаний метод запуску. Він має той самий API, що й сам модуль multiprocessing
, тож ви можете використовувати його для створення Pool
та інших об’єктів, які працюватимуть у цьому контексті. Це дозволяє інфраструктурі та програмі або різним частинам однієї програми використовувати багатопроцесорність, не заважаючи одна одній. (Надав Річард Оудкерк у bpo-18999.)
За винятком використання старого методу запуску fork, дочірні процеси більше не успадковують непотрібні дескриптори/дескриптори файлів від своїх батьків (частина bpo-8713).
multiprocessing
тепер покладається на runpy
(який реалізує перемикач -m
), щоб належним чином ініціалізувати __main__
у дочірніх процесах під час використання spawn
або forkserver
методи запуску. Це вирішує деякі граничні випадки, коли поєднання багатопроцесорності, перемикача командного рядка -m
і явного відносного імпорту може спричинити незрозумілі збої в дочірніх процесах. (Надав Нік Коглан у bpo-19946.)
оператор¶
Нова функція length_hint()
забезпечує реалізацію специфікації того, як слід використовувати спеціальний метод __length_hint__()
як частину PEP 424 формальної специфікації цієї мови функція. (Надав Армін Роначер у bpo-16148.)
Тепер існує чиста версія модуля operator
на Python, доступна для довідки та для використання в альтернативних реалізаціях Python. (Надано Zachary Ware у bpo-16694.)
ос¶
Є нові функції для отримання та встановлення inheritable flag файлового дескриптора (os.get_inheritable()
, os.set_inheritable()
) або маркера Windows (os .get_handle_inheritable()
, os.set_handle_inheritable()
).
Нова функція cpu_count()
повідомляє кількість ЦП, доступних на платформі, на якій працює Python (або None
, якщо кількість не може бути визначена). Функція multiprocessing.cpu_count()
тепер реалізована в термінах цієї функції). (Надано Трентом Нельсоном, Йогешем Чаудхарі, Віктором Стіннером і Чарльзом-Франсуа Наталі в bpo-17914.)
os.path.samestat()
тепер доступний на платформі Windows (і реалізація os.path.samefile()
тепер спільно використовується між Unix і Windows). (Надав Браян Кертін у bpo-11939.)
os.path.ismount()
тепер розпізнає томи, змонтовані нижче кореня диска в Windows. (Надав Тім Голден у bpo-9035.)
os.open()
підтримує два нові позначки на платформах, які їх надають, O_PATH
(дескриптор невідкритого файлу) і O_TMPFILE
(тимчасовий файл без назви; починаючи з випуску 3.4.0, доступного лише в системах Linux із версією ядра 3.11 або новішою, які мають заголовки uapi). (Надано Крістіаном Хеймсом у bpo-18673 та Бенджаміном Петерсоном відповідно.)
pdb¶
pdb
було вдосконалено, щоб працювати з генераторами, yield
і yield from
більш корисним способом. Це особливо корисно під час налагодження програм на основі asyncio
. (Надано Ендрю Свєтловим і Ксав’є де Гає в bpo-16596.)
Команду print
видалено з pdb
, відновивши доступ до функції print()
Python з командного рядка pdb. pdb
Python2 не мав команди print
; натомість введення print
виконувало оператор print
. У Python3 print
було помилково зроблено псевдонімом для команди pdb p
. Проте p
друкує repr
свого аргументу, а не str
, як це робила команда print
Python2. Гірше того, команда Python3 pdb print
затьмарювала функцію print
Python3, роблячи її недоступною у підказці pdb
. (Надав Коннор Осборн у bpo-18764.)
маринований огірок¶
pickle
тепер підтримує (але не використовує за замовчуванням) новий протокол pickle, протокол 4. Цей новий протокол вирішує ряд проблем, які були присутні в попередніх протоколах, таких як серіалізація вкладених класів, дуже великі рядки і контейнери, і класи, чий метод __new__()
приймає лише ключові аргументи. Це також забезпечує деякі покращення ефективності.
Дивись також
- PEP 3154 – Протокол Pickle 4
PEP, написаний Антуаном Пітру та реалізований Александром Вассалотті.
plistlib¶
plistlib
тепер має API, подібний до стандартного шаблону для протоколів серіалізації stdlib, з новими load()
, dump()
, loads()
і dumps()
. (Старіший API тепер не підтримується.) На додаток до вже підтримуваного формату XML plist (FMT_XML
), він також підтримує двійковий формат plist (FMT_BINARY
). (Надано Рональдом Оуссореном та іншими в bpo-14455.)
попліб¶
До poplib
: capa()
додано два нові методи, які повертають список можливостей, рекламованих сервером POP, і stls()
, який перемикає сеанс POP3 із відкритим текстом на зашифрований сеанс POP3, якщо сервер POP це підтримує. (Надав Лоренцо Катуччі в bpo-4473.)
pprint¶
Клас PrettyPrinter
модуля pprint
і його функції pformat()
і pprint()
мають новий параметр, compact, який керує форматуванням виводу. Наразі встановлення compact на True
означає, що послідовності будуть надруковані з такою кількістю елементів послідовності, скільки вміщуватиметься в межах ширини на кожному (з відступом) рядку. (Надав Сергій Сторчака в bpo-19132.)
Довгі рядки тепер обертаються за допомогою звичайного синтаксису продовження рядка Python. (Надав Антуан Пітру в bpo-17150.)
pty¶
pty.spawn()
тепер повертає значення стану з os.waitpid()
дочірнього процесу замість None
. (Надав Грегорі П. Сміт.)
pydoc¶
Модуль pydoc
тепер базується безпосередньо на API інтроспекції inspect.signature()
, що дозволяє йому надавати інформацію про підпис для більшої кількості викликаних об’єктів. Ця зміна також означає, що атрибути __wrapped__
тепер враховуються під час відображення довідкової інформації. (Надано Ларрі Гастінгсом у bpo-19674.)
Модуль pydoc
більше не відображає параметр self
для вже зв’язаних методів. Замість цього він прагне завжди відображати точний поточний підпис наданого виклику. (Надано Ларрі Гастінгсом у bpo-20710.)
На додаток до змін, внесених безпосередньо до pydoc
, його обробка користувацьких методів __dir__
і різноманітна поведінка дескрипторів також була суттєво покращена завдяки базовим змінам у модулі inspect
.
Оскільки вбудований help()
базується на pydoc
, наведені вище зміни також впливають на поведінку help()
.
повторно¶
Нова функція fullmatch()
і метод regex.fullmatch()
закріплюють шаблон на обох кінцях рядка для відповідності. Це дає можливість чітко вказати мету збігу, що дозволяє уникнути класу непомітних помилок, через які символи $
губляться під час змін коду або додавання альтернатив до існуючого регулярного виразу. (Надав Метью Барнетт у bpo-16203.)
Repr regex об’єктів тепер включає шаблон і прапори; repr match objects тепер включає початок, кінець і частину рядка, що збігається. (Надано Уго Лопесом Таваресом і Сергієм Сторчакою в bpo-13592 і bpo-17087.)
ресурс¶
Нова функція prlimit()
, доступна на платформах Linux із версією ядра 2.6.36 або новішою та glibc 2.13 або новішою, надає можливість запитувати або встановлювати обмеження ресурсів для процесів, відмінних від того, що створює виклик. (Надав Крістіан Хеймс у bpo-16595.)
У ядрі Linux версії 2.6.36 або пізнішої також є деякі нові специфічні константи Linux: RLIMIT_MSGQUEUE
, RLIMIT_NICE
, RLIMIT_RTPRIO
, RLIMIT_RTTIME
і RLIMIT_SIGPENDING
. (Надав Крістіан Хеймс у bpo-19324.)
У FreeBSD версії 9 і пізніших є деякі нові специфічні константи FreeBSD: RLIMIT_SBSIZE
, RLIMIT_SWAP
і RLIMIT_NPTS
. (Надав Клаудіу Попа в bpo-19343.)
вибрати¶
Об’єкти epoll
тепер підтримують протокол керування контекстом. При використанні в операторі with
метод close()
буде викликано автоматично в кінці блоку. (Надав Сергій Сторчака в bpo-16488.)
Об’єкти devpoll
тепер мають методи fileno()
і close()
, а також новий атрибут closed
. (Надав Віктор Стіннер у bpo-18794.)
полиця¶
Екземпляри Shelf
тепер можна використовувати в операторах with
і автоматично закриватимуться в кінці блоку with
. (Надав Філіп Грущинський у bpo-13896.)
шутил¶
copyfile()
тепер створює певний підклас Error
, SameFileError
, коли джерело та місце призначення є тим самим файлом, що дозволяє програмі приймати відповідні дії щодо цієї конкретної помилки. (Надано Atsuo Ishimoto та Hynek Schlawack у bpo-1492704.)
smtpd¶
Класи SMTPServer
і SMTPChannel
тепер приймають аргумент ключового слова map, який, якщо вказано, передається в asynchat.async_chat
як його map аргумент. Це дозволяє програмі уникнути впливу на глобальну карту сокетів. (Надав Віней Саджип у bpo-11959.)
smtplib¶
SMTPException
тепер є підкласом OSError
, який дозволяє перехоплювати помилки рівня сокета та протоколу SMTP одним оператором try/except за допомогою коду, який дбає лише про те, чи сталася помилка. (Надав Нед Джексон Лавлі в bpo-2118.)
гніздо¶
Модуль сокета тепер підтримує протокол CAN_BCM
на платформах, які його підтримують. (Надав Браян Торн у bpo-15359.)
Об’єкти Socket мають нові методи отримання або встановлення свого inheritable flag, get_inheritable()
та set_inheritable()
.
Константи socket.AF_*
і socket.SOCK_*
тепер є значеннями перерахування за допомогою нового модуля enum
. Це дозволяє друкувати осмислені імена під час налагодження замість цілих «магічних чисел».
Константа AF_LINK
тепер доступна в BSD і OSX.
inet_pton()
і inet_ntop()
тепер підтримуються в Windows. (Надав Ацуо Ісімото в bpo-7171.)
sqlite3¶
Новий логічний параметр функції connect()
, uri, можна використовувати, щоб вказати, що параметр database є uri
(див. документацію SQLite URI) . (Надано poq у bpo-13773.)
ssl¶
Додано PROTOCOL_TLSv1_1
і PROTOCOL_TLSv1_2
(підтримка TLSv1.1 і TLSv1.2); підтримка цих протоколів доступна, лише якщо Python пов’язано з OpenSSL 1.0.1 або новішої версії. (Надано Мікеле Орру та Антуаном Пітру в bpo-16692.)
Нова функція create_default_context()
надає стандартний спосіб отримати SSLContext
, налаштування якого створюють розумний баланс між сумісністю та безпекою. Ці параметри суворіші, ніж стандартні, надані конструктором SSLContext
, і можуть бути скориговані в майбутньому без попереднього припинення підтримки, якщо зміняться найкращі вимоги безпеки. Нова рекомендована найкраща практика використання бібліотек stdlib, які підтримують SSL, полягає в тому, щоб використовувати create_default_context()
для отримання об’єкта SSLContext
, змінювати його за потреби, а потім передавати як аргумент context відповідного API stdlib. (Надав Крістіан Хаймес у bpo-19689.)
SSLContext
метод load_verify_locations()
приймає новий необов’язковий аргумент cadata, який можна використовувати для надання сертифікатів у кодуванні PEM або DER безпосередньо через рядки або байти відповідно. (Надав Крістіан Хеймс у bpo-18138.)
Нова функція get_default_verify_paths()
повертає іменований кортеж шляхів і змінних середовища, які метод set_default_verify_paths()
використовує для встановлення стандартних OpenSSL cafile
і capath
. Це може допомогти у вирішенні проблем перевірки за замовчуванням. (Надав Крістіан Хеймс у bpo-18143.)
SSLContext
має новий метод, cert_store_stats()
, який повідомляє кількість завантажених сертифікатів X.509
, X.509 CA
сертифікатів і списки відкликаних сертифікатів (crl
s), а також метод get_ca_certs()
, який повертає список завантажених сертифікатів CA
. (Надав Крістіан Хеймс у bpo-18147.)
Якщо доступний OpenSSL 0.9.8 або новішої версії, SSLContext
має новий атрибут verify_flags
, який можна використовувати для керування процесом перевірки сертифіката, установивши для нього певну комбінацію нових констант VERIFY_DEFAULT
, VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
або VERIFY_X509_STRICT
. За замовчуванням OpenSSL не перевіряє CRL. (Надано Christien Heimes у bpo-8813.)
Новий метод SSLContext
load_default_certs()
завантажує набір стандартних сертифікатів «центру сертифікації» (CA) із стандартних розташувань, які відрізняються залежно від платформи. Його можна використовувати для завантаження як сертифікатів автентифікації веб-сервера TLS (purpose=
SERVER_AUTH
), які клієнт використовує для перевірки сервера, так і сертифікатів для сервера, які використовують для перевірки клієнтські сертифікати (purpose=
CLIENT_AUTH
). (Надав Крістіан Хаймес у bpo-19292.)
Дві нові функції лише для Windows, enum_certificates()
і enum_crls()
надають можливість отримувати сертифікати, інформацію про сертифікати та CRL зі сховища сертифікатів Windows. (Надав Крістіан Хеймс у bpo-17134.)
Підтримка SNI на стороні сервера (Індикація імені сервера) за допомогою нового методу ssl.SSSLContext.set_servername_callback()
. (Надав Деніел Блек у bpo-8109.)
Словник, який повертає SSLSocket.getpeercert()
, містить додаткові елементи розширення X509v3
: crlDistributionPoints
, calIssuers
і OCSP
URI. (Надав Крістіан Хеймс у bpo-18379.)
стат¶
Модуль stat
тепер підтримується реалізацією C у _stat
. Потрібна реалізація C, оскільки більшість значень не стандартизовані та залежать від платформи. (Надав Крістіан Хеймс у bpo-11016.)
Модуль підтримує нові прапорці ST_MODE
, S_IFDOOR
, S_IFPORT
і S_IFWHT
. (Надав Крістіан Гімес у bpo-11016.)
структура¶
Нова функція iter_unpack
і новий метод struct.Struct.iter_unpack()
для скомпільованих форматів забезпечують потокове розпакування буфера, що містить повторювані екземпляри даного формату даних. (Надав Антуан Пітру в bpo-17804.)
підпроцес¶
check_output()
тепер приймає аргумент input, який можна використовувати для надання вмісту stdin
для команди, яка виконується. (Надав Зак Вайнберг у bpo-16624.)
getstatus()
і getstatusoutput()
тепер працюють у Windows. Ця зміна фактично була зроблена ненавмисно в 3.3.4. (Надав Тім Голден у bpo-10197.)
sunau¶
Метод getparams()
тепер повертає іменований кортеж, а не звичайний кортеж. (Надав Клаудіу Попа в bpo-18901.)
sunau.open()
тепер підтримує протокол керування контекстом: при використанні в блоці with
метод close
повернутого об’єкта буде автоматично викликаний у кінці блоку. (Надав Сергій Сторчака в bpo-18878.)
AU_write.setsampwidth()
тепер підтримує 24-бітові зразки, таким чином додаючи підтримку запису 24-х зразків за допомогою модуля. (Надав Сергій Сторчака в bpo-19261.)
Методи writeframesraw()
і writeframes()
тепер приймають будь-які bytes-like object. (Надав Сергій Сторчака в bpo-8311.)
система¶
Нова функція sys.getallocatedblocks()
повертає поточну кількість блоків, виділених інтерпретатором. (У CPython із параметром за замовчуванням --with-pymalloc
це виділення, зроблене через PyObject_Malloc()
API.) Це може бути корисним для відстеження витоків пам’яті, особливо якщо це автоматизовано за допомогою набору тестів. . (Надав Антуан Пітру в bpo-13390.)
Коли інтерпретатор Python запускається в інтерактивному режимі, він перевіряє наявність атрибута __interactivehook__
в модулі sys
. Якщо атрибут існує, його значення викликається без аргументів безпосередньо перед запуском інтерактивного режиму. Перевірка виконується після прочитання файлу PYTHONSTARTUP
, тож його можна встановити там. Модуль site
встановлює для нього функцію, яка вмикає завершення вкладки та збереження історії (у ~/.python-history
), якщо платформа підтримує readline
. Якщо ви не бажаєте такої (нової) поведінки, ви можете змінити її в PYTHONSTARTUP
, sitecustomize
або usercustomize
, видаливши цей атрибут із sys
(або встановлення його на інший виклик). (Надано Еріком Араухо та Антуаном Пітру в bpo-5845.)
tarfile¶
Модуль tarfile
тепер підтримує простий Інтерфейс командного рядка під час безпосереднього виклику сценарію або через -m
. Це можна використовувати для створення та розпакування архівів tarfile. (Надано Berker Peksag у bpo-13477.)
обтікання текстом¶
Клас TextWrapper
має два нові атрибути/аргументи конструктора: max_lines
, який обмежує кількість рядків у виводі, і placeholder
, це рядок, який з’явиться в кінці виводу, якщо його було скорочено через max_lines. Спираючись на ці можливості, нова функція зручності shorten()
згортає всі пробіли у вхідних даних до окремих пробілів і створює один рядок заданої ширини, який закінчується заповнювачем (за замовчуванням). , [...]
). (Надано Антуаном Пітру та Сергієм Сторчакою в bpo-18585 та bpo-18725.)
різьблення¶
Об’єкт Thread
, що представляє основний потік, можна отримати з нової функції main_thread()
. У нормальних умовах це буде потік, з якого було запущено інтерпретатор Python. (Надав Ендрю Свєтлов у bpo-18882.)
простежити¶
Нова функція traceback.clear_frames()
приймає об’єкт трасування та очищає локальні змінні в усіх кадрах, на які він посилається, зменшуючи обсяг споживаної пам’яті. (Надав Ендрю Кухлінг у bpo-1565525.)
види¶
Новий дескриптор DynamicClassAttribute()
надає спосіб визначення атрибута, який працює нормально під час пошуку через об’єкт екземпляра, але який спрямовується до класу __getattr__
під час пошуку через клас . Це дозволяє мати активні властивості для класу та мати віртуальні атрибути для класу з таким же іменем (див. Enum
для прикладу). (Надав Ітан Фурман у bpo-19030.)
urllib¶
urllib.request
тепер підтримує URL-адреси data:
через клас DataHandler
. (Надав Матіас Панценбьок у bpo-16423.)
Метод http, який використовуватиметься класом Request
, тепер можна вказати, встановивши атрибут класу method
у підкласі. (Надав Джейсон Р. Кумбс у bpo-18978.)
Request
об’єкти тепер можна повторно використовувати: якщо атрибути full_url
або data
змінено, усі оновлено відповідні внутрішні властивості. Це означає, наприклад, що тепер можна використовувати той самий об’єкт Request
у кількох викликах OpenerDirector.open()
з різними аргументами data або для змінити URL-адресу Request
, а не перераховувати її з нуля. Існує також новий метод remove_header()
, який можна використовувати для видалення заголовків із Request
. (Надано Олексієм Качаєвим у bpo-16464, Даніелем Возняком у bpo-17485, а також Демієном Брехтом і Сентілом Кумараном у bpo-17272.)
Об’єкти HTTPError
тепер мають атрибут headers
, який надає доступ до заголовків відповіді HTTP, пов’язаних із помилкою. (Надано Berker Peksag у bpo-15701.)
unittest¶
The TestCase
class has a new method,
subTest()
, that produces a context manager whose
with
block becomes a «sub-test». This context manager allows a test
method to dynamically generate subtests by, say, calling the subTest
context manager inside a loop. A single test method can thereby produce an
indefinite number of separately-identified and separately-counted tests, all of
which will run even if one or more of them fail. For example:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
призведе до шести підтестів, кожен ідентифікований у докладному виведенні модульного тесту з міткою, що складається з назви змінної i
та певного значення для цієї змінної (i=0
, i=1
, тощо). Перегляньте Розрізнення тестових ітерацій за допомогою субтестів повну версію цього прикладу. (Надав Антуан Пітру в bpo-16997.)
unittest.main()
тепер приймає ітерацію імен тестів для defaultTest, тоді як раніше він приймав лише одну назву тесту як рядок. (Надав Юркі Пулляйнен у bpo-15132.)
Якщо SkipTest
викликається під час виявлення тесту (тобто на рівні модуля у файлі тесту), це тепер повідомляється як пропуск замість помилки. (Надав Zach Ware у bpo-16935.)
discover()
тепер сортує виявлені файли для забезпечення послідовного впорядкування тестів. (Надано Мартіном Меліном і Джеффом Рамнані в bpo-16709.)
TestSuite
тепер видаляє посилання на тести, щойно тест було запущено, якщо тест успішний. В інтерпретаторах Python, які виконують збір сміття, це дозволяє тестам збиратися як сміття, якщо ніщо інше не містить посилання на тест. Цю поведінку можна перевизначити, створивши підклас TestSuite
, який визначає спеціальний метод _removeTestAtIndex
. (Надано Томом Уорділлом, Метом МакКлуром та Ендрю Свєтловим у bpo-11798.)
Новий контекстний менеджер тестових тверджень, assertLogs()
, гарантує, що певний блок коду видає повідомлення журналу за допомогою модуля logging
. За замовчуванням повідомлення може надходити з будь-якого реєстратора та мати пріоритет INFO
або вищий, але можна вказати як назву реєстратора, так і альтернативний мінімальний рівень журналювання. Об’єкт, повернутий контекстним менеджером, може бути запитаний для 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 for non-blocking parsing. (Надав Антуан Пітру в bpo-17741.)
Функції xml.etree.ElementTree
tostring()
і tostringlist()
, а також ElementTree
write()
метод, тепер має short_empty_elements ключовий параметр, що забезпечує контроль над тим, чи елементи без вмісту записуються скорочено (<tag />
) або розгорнуту (<tag> </tag>
) форму. (Надано Аріелем Поляком і Сергієм Сторчакою в bpo-14377.)
zip-файл¶
Метод writepy()
класу PyZipFile
має нову опцію filterfunc, за допомогою якої можна контролювати, які каталоги та файли додаються до архіву. Наприклад, це можна використовувати для виключення тестових файлів з архіву. (Надав Крістіан Тісмер у bpo-19274.)
Параметр allowZip64 для ZipFile
і PyZipfile
тепер має значення True
за замовчуванням. (Надав Вільям Маллард у bpo-17201.)
Зміни реалізації CPython¶
PEP 445: Налаштування розподілювачів пам’яті CPython¶
PEP 445 додає нові інтерфейси рівня C для налаштування розподілу пам’яті в інтерпретаторі CPython.
Дивись також
- PEP 445 – Додайте нові API для налаштування розподільників пам’яті Python
PEP написав і реалізував Віктор Стіннер.
PEP 442: Завершення безпечного об’єкта¶
PEP 442 усуває поточні обмеження та особливості фіналізації об’єктів у CPython. З його допомогою об’єкти з методами __del__()
, а також генератори з пропозиціями finally
можуть бути завершені, коли вони є частиною еталонного циклу.
У рамках цієї зміни глобальні модулі більше не примусово встановлюються на None
під час завершення роботи інтерпретатора в більшості випадків, натомість покладаються на звичайну роботу циклічного збирача сміття. Це дозволяє уникнути цілого класу помилок під час вимкнення інтерпретатора, які зазвичай стосуються методів __del__
, які мучать Python з моменту введення циклічного GC.
Дивись також
- PEP 442 – Безпечна фіналізація об’єкта
PEP написаний і реалізований Антуаном Пітру.
PEP 456: Безпечний і взаємозамінний хеш-алгоритм¶
PEP 456 є продовженням попередньої роботи з виправлення безпеки, виконаної в алгоритмі гешування Python для вирішення певних атак DOS, яким можуть піддаватися публічні API, що підтримуються пошуком у словнику. (Див. bpo-14621 для початку поточного раунду вдосконалень.) PEP уніфікує хеш-код CPython, щоб полегшити пакувальнику заміну іншого алгоритму хешування, і змінює реалізацію Python за замовчуванням на реалізацію SipHash на платформах які мають 64-бітний тип даних. Будь-які відмінності в продуктивності порівняно зі старим алгоритмом FNV незначні.
PEP додає додаткові поля до іменованого кортежу sys.hash_info
для опису алгоритму хешування, який використовується двійковим файлом, що виконується наразі. В іншому випадку PEP не змінює існуючі API CPython.
PEP 436: Клініка аргументів¶
«Argument Clinic» (PEP 436) тепер є частиною процесу збирання CPython і може використовуватися для спрощення процесу визначення та підтримки точних підписів для вбудованих модулів і стандартних модулів розширення бібліотеки, реалізованих у C.
Деякі стандартні модулі розширення бібліотеки було перетворено на використання Argument Clinic у Python 3.4, а pydoc
і inspect
були відповідно оновлені.
Очікується, що метадані підпису для програмної інтроспекції будуть додані до додаткових викликів, реалізованих у C, як частина випусків обслуговування Python 3.4.
Примітка
PEP клініки Argument не повністю оновлює стан впровадження. Менеджер випуску та основна команда розробників визнали це прийнятним у цьому випадку, оскільки Argument Clinic не буде доступним як загальнодоступний API для використання третьою стороною в Python 3.4.
Дивись також
- PEP 436 – The Argument Clinic DSL
PEP написаний і реалізований Ларрі Гастінгсом.
Інші зміни збірки та C API¶
Нову функцію
PyType_GetSlot()
додано до стабільного ABI, що дозволяє отримувати покажчики функцій із слотів іменованих типів під час використання обмеженого API. (Надано Мартіном фон Льовісом у bpo-17162.)Новий API попередньої ініціалізації
Py_SetStandardStreamEncoding()
дозволяє програмам, які вбудовують інтерпретатор CPython, надійно примусово застосовувати певне кодування та обробник помилок для стандартних потоків. (Надано Бастьєном Монтанем і Ніком Когланом у bpo-16129.)Більшість Python C API, які не змінюють рядкові аргументи, тепер правильно позначені як такі, що приймають
const char *
, а неchar *
. (Надав Сергій Сторчака в bpo-1772673.)Нову версію оболонки
python-config
можна використовувати, навіть якщо інтерпретатор python недоступний (наприклад, у сценаріях крос-компіляції).PyUnicode_FromFormat()
тепер підтримує специфікації ширини та точності для%s
,%A
,%U
,%V
,%S
і%R
. (Надано Ysj Ray і Victor Stinner у bpo-7330.)Нова функція
PyStructSequence_InitType2()
доповнює існуючу функціюPyStructSequence_InitType()
. Різниця полягає в тому, що він повертає0
у разі успіху та-1
у випадку невдачі.Вихідний код CPython тепер можна скомпілювати за допомогою функцій перевірки працездатності адрес останніх версій GCC і clang: помилкові тривоги в розподільнику невеликих об’єктів було вимкнуто. (Надано Dhiru Kholia в bpo-18596.)
У збірці Windows тепер використовуються Address Space Layout Randomization і Data Execution Prevention. (Надав Крістіан Хеймс у bpo-16632.)
Нова функція
PyObject_LengthHint()
є еквівалентом C APIoperator.length_hint()
. (Надав Армін Роначер у bpo-16148.)
Інші вдосконалення¶
Команда python має нову опцію,
-I
, яка змушує її працювати в «ізольованому режимі», що означає, щоsys.path
містить ані каталог сценарію, ані каталогsite-packages
користувача, а також усі змінні середовищаPYTHON*
ігноруються (це означає як-s
, так і-E
). Інші обмеження також можуть бути застосовані в майбутньому з метою ізоляції виконання сценарію від середовища користувача. Це доречно, наприклад, коли Python використовується для запуску системного сценарію. У більшості систем POSIX його можна і потрібно використовувати в рядку#!
системних сценаріїв. (Надав Крістіан Хеймс у bpo-16499.)Завершення табуляції тепер увімкнено за замовчуванням в інтерактивному інтерпретаторі в системах, які підтримують
readline
. Історія також увімкнена за замовчуванням і записується (і зчитується) у файл~/.python-history
. (Надано Антуаном Пітру та Еріком Араужо в bpo-5845.)Виклик інтерпретатора Python за допомогою
--version
тепер виводить версію на стандартний вивід замість стандартної помилки (bpo-18338). Подібні зміни було внесено доargparse
(bpo-18920) та інших модулів, які мають можливості виклику, подібні до сценарію (bpo-18922).Інсталятор CPython Windows тепер додає
.py
до змінноїPATHEXT
, коли зареєстровано розширення, дозволяючи користувачам запускати сценарій python у командному рядку Windows, просто ввівши його назву без.py
розширення. (Надав Пол Мур у bpo-18569.)A new
make
target coverage-report will build python, run the test suite, and generate an HTML coverage report for the C codebase usinggcov
and lcov.Параметр
-R
для набору регресійних тестів python тепер також перевіряє наявність витоків розподілу пам’яті за допомогоюsys.getallocatedblocks()
. (Надав Антуан Пітру в bpo-13390.)python -m
тепер працює з пакетами простору імен.Модуль
stat
тепер реалізовано в C, що означає, що він отримує значення для своїх констант із файлів заголовків C замість того, щоб мати жорстко закодовані значення в модулі python, як це було раніше.Завантаження кількох модулів python з одного модуля ОС (
.so
,.dll
) тепер працює правильно (раніше він мовчки повертав перший модуль python у файлі). (Надав Вацлав Шмілауер у bpo-16421.)Додано новий код операції,
LOAD_CLASSDEREF
, щоб виправити помилку під час завантаження вільних змінних у тілах класів, яка могла бути викликана певним використанням __prepare__. (Надав Бенджамін Петерсон у bpo-17853.)Кілька збоїв, пов’язаних із MemoryError, було виявлено та виправлено Віктором Стіннером за допомогою його інструменту
pyfailmalloc
на основі PEP 445 (bpo-18408, bpo-18520).Команда
pyvenv
тепер приймає опцію--copies
для використання копій замість символічних посилань навіть у системах, де символічні посилання є типовими. (Надав Віней Саджип у bpo-18807.)Команда
pyvenv
також приймає опцію--without-pip
, щоб придушити автоматичне завантаження pip у віртуальне середовище. (Надано Ніком Когланом у bpo-19552 як частину реалізації PEP 453.)Назва кодування тепер є необов’язковою для значення, установленого для змінної середовища
PYTHONIOENCODING
. Це дає змогу встановити лише обробник помилок, не змінюючи стандартне кодування. (Надав Сергій Сторчака в bpo-18818.)Функції
open
модуляbz2
,lzma
іgzip
тепер підтримують режимx
(ексклюзивне створення). (Надано Тімом Хіні та Ваджраскі Коком у bpo-19201, bpo-19222 та bpo-19223.)
Значні оптимізації¶
Декодер UTF-32 тепер у 3-4 рази швидший. (Надав Сергій Сторчака в bpo-14625.)
Вартість хеш-колізій для наборів тепер зменшена. Кожен зонд хеш-таблиці тепер перевіряє серію послідовних суміжних пар ключ/хеш, перш ніж продовжувати робити випадкові зонди через хеш-таблицю. Це використовує локальність кешу, щоб зробити вирішення колізій менш дорогим. Схему вирішення колізій можна описати як гібрид лінійного зондування та відкритої адресації. Кількість додаткових лінійних зондів за замовчуванням становить дев’ять. Це можна змінити під час компіляції, визначивши LINEAR_PROBES будь-яким значенням. Встановіть LINEAR_PROBES=0, щоб повністю вимкнути лінійне зондування. (Надав Реймонд Геттінгер у bpo-18771.)
Інтерпретатор запускається приблизно на 30% швидше. Кілька заходів призводять до прискорення. Інтерпретатор завантажує менше модулів під час запуску, напр. модулі
re
,collections
іlocale
та їхні залежності більше не імпортуються за замовчуванням. Модуль marshal було покращено, щоб швидше завантажувати скомпільований код Python. (Надано Антуаном Пітру, Крістіаном Хеймсом і Віктором Стіннером у bpo-19219, bpo-19218, bpo-19209, bpo-19205 і bpo-9548.)bz2.BZ2File
тепер такий же або швидший, ніж версія Python2 у більшості випадків.lzma.LZMAFile
також було оптимізовано. (Надано Сергієм Сторчакою та Надімом Вавдою в bpo-16034.)random.getrandbits()
на 20%-40% швидше для малих цілих чисел (найпоширеніший варіант використання). (Надав Сергій Сторчака в bpo-16674.)Використовуючи переваги нового формату зберігання струн, декаплювання струн тепер відбувається значно швидше. (Надано Віктором Стіннером і Антуаном Пітру в bpo-15596.)
Проблему продуктивності в
io.FileIO.readall()
було вирішено. Це особливо впливає на Windows і значно прискорює передачу значної кількості даних черезsubprocess
. (Надав Річард Оудкерк у bpo-15758.)html.escape()
тепер у 10 разів швидший. (Надав Метт Брайант у bpo-18020.)У Windows рідний
VirtualAlloc
тепер використовується замість CRTmalloc
в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¶
Як зазначено в PEP 451: тип ModuleSpec для системи імпорту, низка методів і функцій
importlib
застаріла:importlib.find_loader()
замінено наimportlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
замінено наimportlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
замінено наimportlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
іfind_module()
замінено наimportlib.abc.PathEntryFinder.find_spec()
; усі методиxxxLoader
ABCload_module
(importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc. FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
) більше не слід реалізовувати, натомість завантажувачі мають реалізовувати методexec_module
(importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
importlib.abc.SourceLoader.exec_module()
) і нехай система імпорту подбає про все інше; іimportlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
іimportlib.util.set_package()
більше не є необхідні, тому що їхні функції тепер автоматично обробляються системою імпорту.Модуль
imp
очікує на припинення підтримки. Щоб зберегти сумісність із кодовими базами Python 2/3, видалення модуля наразі не планується.Модуль
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()
не підтримується, як і аргумент htmlXMLParser()
. Щоб підготуватися до видалення останнього, усі аргументиXMLParser
повинні бути передані за ключовим словом.
Застарілі функції¶
Видалено¶
Операційні системи більше не підтримуються¶
Підтримку таких операційних систем видалено з джерела та інструментів збірки:
Видалення API та функцій¶
Наступні застарілі API та функції, які раніше не підтримувалися, видалено:
Непідтримувані каталоги
Misc/TextMate
іMisc/vim
було видалено (перегляньте devguide, щоб дізнатися, що використовувати натомість).Макрос makefile
SO
видалено (його замінено макросамиSHLIB_SUFFIX
іEXT_SUFFIX
) (bpo-16754).Поле
PyThreadState.tick_counter
було видалено; його значення не має сенсу з Python 3.2, коли було представлено «новий GIL» (bpo-19199).PyLoader
іPyPycLoader
видалено зimportlib
. (Надав Тарас Ляпун у bpo-15641.)Аргумент строгий для
HTTPConnection
іHTTPSConnection
видалено. «Прості відповіді» у стилі HTTP 0.9 більше не підтримуються.Застарілі
urllib.request.Request
методи отримання та встановленняadd_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
іis_unverifiable
були видалені (замість цього використовуйте прямий доступ до атрибутів).Підтримку завантаження застарілого
TYPE_INT64
було видалено зmarshal
. (Надав Ден Ріті в bpo-15480.)inspect.Signature
: лише позиційні параметри тепер повинні мати дійсне ім’я.object.__format__()
більше не приймає непорожні рядки формату, замість цього він викликаєTypeError
. Використання непорожнього рядка застаріло з Python 3.2. Цю зміну було внесено, щоб запобігти ситуації, коли раніше працюючий (але неправильний) код почав виходити з ладу, якщо об’єкт отримав метод __format__, що означає, що ваш код тепер може викликатиTypeError
, якщо ви використовуєте Код формату's'
з об’єктами, які не мають методу __format__, який його обробляє. Див. bpo-7994 для довідкової інформації.difflib.SequenceMatcher.isbjunk()
іdifflib.SequenceMatcher.isbpopular()
були застарілими в 3.2, і тепер їх видалено: використовуйтеx в sm.bjunk
іx в sm.bpopular
, де sm є об’єктомSequenceMatcher
(bpo-13248).
Очищення коду¶
Невикористаний і недокументований внутрішній клас
Scanner
було видалено з модуляpydoc
.Приватний і фактично невикористаний модуль
_gestalt
було видалено разом із приватними функціямиplatform
_mac_ver_lookup
,_mac_ver_gstalt
і_bcd2str
, які б тільки коли-небудь викликано на сильно зламаних системах OSX (див. bpo-18393).Жорстко закодовані копії певних констант
stat
, які були включені в простір імен модуляtarfile
, було видалено.
Перенесення на Python 3.4¶
У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.
Зміни в поведінці команд «python».¶
У posix-оболонці встановлення змінної середовища
PATH
на порожнє значення еквівалентно невстановленню її взагалі. Однак встановленняPYTHONPATH
на порожнє значення не еквівалентно тому, що його не встановлювати взагалі: встановленняPYTHONPATH
на порожнє значення було еквівалентно встановленню його на.
, що призводить до до плутанини, міркуючи за аналогією з тим, як працюєPATH
. Поведінка тепер відповідає угоді posix дляPATH
.[X refs, Y blocks] вихід збірки налагодження (
--with-pydebug
) інтерпретатора CPython тепер вимкнено за замовчуванням. Його можна повторно ввімкнути за допомогою параметра-X showrefcount
. (Надав Еціо Мелотті в bpo-17323.)Команда python і більшість сценаріїв stdlib (а також
argparse
) тепер виводять інформацію--version
наstdout
замістьstderr
(перелік проблем див. Інші вдосконалення вище).
Зміни в API Python¶
ABC, визначені в
importlib.abc
, тепер або викликають відповідний виняток, або повертають значення за замовчуванням замість викликуNotImplementedError
наосліп. Це вплине лише на код, що викликаєsuper()
і потрапляє до ABC. Для сумісності перехопіть обидваNotImplementedError
або відповідний виняток за потреби.Тип модуля тепер ініціалізує атрибути
__package__
і__loader__
якNone
за замовчуванням. Щоб визначити, чи ці атрибути були встановлені у зворотній сумісності, використовуйте, наприклад.getattr(module, '__loader__', None) не є None
. (bpo-17115.)importlib.util.module_for_loader()
тепер безумовно встановлює__loader__
і__package__
для належної підтримки перезавантаження. Якщо це небажано, вам потрібно буде встановити ці атрибути вручну. Ви можете використовуватиimportlib.util.module_to_load()
для керування модулями.Імпорт тепер безумовно скидає відповідні атрибути (наприклад,
__name__
,__loader__
,__package__
,__file__
,__cached__
) під час перезавантаження. Зауважте, що це відновлює поведінку до 3.3, оскільки це означає, що модуль повторно знайдено під час повторного завантаження (bpo-19413).Заморожені пакунки більше не встановлюють
__path__
як список, що містить назву пакета, тепер вони встановлюють його як порожній список. Попередня поведінка могла спричинити неправильну дію системи імпорту під час імпорту підмодуля, якщо існував також каталог із такою ж назвою, як і заморожений пакет. Правильний спосіб визначити, чи є модуль пакетом чи ні, це використатиhasattr(module, '__path__')
(bpo-18065).Заморожені модулі більше не визначають атрибут
__file__
. Для заморожених модулів семантично неправильно встановлювати атрибут, оскільки вони не завантажуються з будь-якого явного місця. Якщо вам потрібно знати, що модуль походить із замороженого коду, ви можете побачити, чи__spec__.location
модуля встановлено на'frozen'
, перевірте, чи завантажувач є підкласомimportlib. machinery.FrozenImporter
, або, якщо потрібна сумісність з Python 2, ви можете використовуватиimp.is_frozen()
.py_compile.compile()
тепер викликаєFileExistsError
, якщо шлях до файлу, куди він буде писати, є символічним посиланням або незвичайним файлом. Це є попередженням про те, що імпортування перезапише ці файли звичайним файлом незалежно від того, яким типом шляху до файлу вони були спочатку.importlib.abc.SourceLoader.get_source()
більше не викликаєImportError
, коли вихідний код, що завантажується, викликаєSyntaxError
абоUnicodeDecodeError
. Оскільки помилкаImportError
має виникати лише тоді, коли вихідний код не може бути знайдений, але він має бути знайдений, було зрозуміло, що це означає надмірне/перевантажене значення, коли вихідний код знайдено, але неналежно структурований. Якщо ви раніше виявляли помилку ImportError і бажаєте й надалі ігнорувати проблеми з синтаксисом або декодуванням, виловіть усі три винятки зараз.functools.update_wrapper()
іfunctools.wraps()
тепер правильно встановлюють атрибут__wrapped__
для функції, яку обгортають, навіть якщо ця функція також має свій атрибут__wrapped__
. Це означає, що атрибути__wrapped__
тепер правильно пов’язують стек декорованих функцій, а не кожен атрибут__wrapped__
у ланцюжку, який посилається на найвнутрішню функцію. Бібліотеки самоаналізу, які припускали, що попередня поведінка була навмисною, можуть використовуватиinspect.unwrap()
для доступу до першої функції в ланцюжку, яка не має атрибута__wrapped__
.inspect.getfullargspec()
було повторно реалізовано поверхinspect.signature()
і, отже, обробляє набагато більше різноманітних викликаних об’єктів, ніж це було в минулому. Очікується, що додаткові вбудовані модулі та модулі розширення отримають метадані підпису протягом серії Python 3.4. Код, який припускає, щоinspect.getfullargspec()
не вдасться викликати виклики, відмінні від Python, може потребувати відповідних змін.importlib.machinery.PathFinder
тепер передає поточний робочий каталог об’єктам уsys.path_hooks
для порожнього рядка. Це призводить до того, щоsys.path_importer_cache
ніколи не містить''
, тому ітерація черезsys.path_importer_cache
на основіsys.path
не знайде всіх ключів.__file__
модуля під час імпорту в поточний робочий каталог також тепер матиме абсолютний шлях, включно з використанням-m
з інтерпретатором (за винятком__main__.__file__
, коли сценарій було виконано безпосередньо за допомогою відносного шляху) (надано Бреттом Кенноном у bpo-18416). вказується в командному рядку) (bpo-18416).Видалення аргументу strict для
HTTPConnection
іHTTPSConnection
змінює значення решти аргументів, якщо ви вказуєте їх позиційно, а не за ключовим словом. Якщо ви звертали увагу на застереження щодо застарілості, ваш код уже має вказувати додаткові аргументи за допомогою ключових слів.Рядки між операторами
from __future__ import ...
тепер завжди викликаютьSyntaxError
. Раніше, якщо не було початкового рядка документації, проміжний рядок іноді ігнорувався. Це приводить CPython у відповідність зі специфікацією мови; Jython і PyPy вже були. (bpo-17434).ssl.SSLSocket.getpeercert()
іssl.SSLSocket.do_handshake()
тепер викликаютьOSError
зENOTCONN
, колиSSLSocket
не підключено, замість попередня поведінка викликуAttributeError
. Крім того,getpeercert()
викличеValueError
, якщо рукостискання ще не виконано.base64.b32decode()
тепер викликаєbinascii.Error
, коли вхідний рядок містить символи, відмінні від b32-алфавіту, замістьTypeError
. Ця конкретнаTypeError
була пропущена під час перетворення іншихTypeError
. (Надано Сергієм Сторчакою в bpo-18011.) Примітка: цю зміну також було випадково застосовано в Python 3.3.3.Атрибут
file
тепер автоматично закривається, коли створюваний екземплярcgi.FieldStorage
збирається як сміття. Якщо ви витягували об’єкт файлу окремо від екземпляраcgi.FieldStorage
і не зберігали екземпляр живим, то вам слід або зберегти весь екземплярcgi.FieldStorage
, або прочитати вміст файлу до того, як екземплярcgi.FieldStorage
буде зібрано сміттям.Виклик
read
абоwrite
у закритому SSL-сокеті тепер викликає інформативнуValueError
, а не попередню більш загадковуAttributeError
(bpo-9177).slice.indices()
більше не створюєOverflowError
для великих значень. Як наслідок цього виправлення,slice.indices()
тепер викликаєValueError
, якщо задано від’ємну довжину; раніше він повертав безглузді значення (bpo-14794).Конструктор
complex
, на відміну від функційcmath
, неправильно приймав значенняfloat
, якщо спеціальний метод__complex__
об’єкта повертав одне. Тепер це викликаєTypeError
. (bpo-16290.)Конструктор
int
у версіях 3.2 і 3.3 помилково приймає значенняfloat
для параметра base. Навряд чи хтось це робив, але якщо так, то тепер це викличеTypeError
(bpo-16772).Значення за замовчуванням для аргументів лише ключових слів тепер оцінюються після значень за замовчуванням для звичайних аргументів ключових слів, а не раніше. Сподіваюся, ніхто не написав код, який би залежав від попередньої поведінки з помилками (bpo-16967).
Застарілі стани потоку тепер очищаються після
fork()
. Це може спричинити звільнення деяких системних ресурсів, які раніше неправильно зберігалися безперервно активними (наприклад, підключення до бази даних, що зберігаються в локальному сховищі потоку). (bpo-17094.)Назви параметрів у
__annotations__
dicts тепер змінюються належним чином, подібно до__kwdefaults__
. (Надав Юрій Селіванов у bpo-20625.)hashlib.hash.name
тепер завжди повертає ідентифікатор у нижньому регістрі. Раніше деякі вбудовані хеші мали назви у верхньому регістрі, але тепер, коли це офіційний загальнодоступний інтерфейс, іменування стало узгодженим (bpo-18532).Оскільки
unittest.TestSuite
тепер видаляє посилання на тести після їх виконання, тестові пакети, які повторно використовуютьTestSuite
для повторного запуску набору тестів, можуть не працювати. Набори тестів не слід повторно використовувати таким чином, оскільки це означає, що стан зберігається між тестовими запусками, порушуючи ізоляцію тесту, якуunittest
створено для забезпечення. Однак, якщо відсутність ізоляції вважається прийнятною, стару поведінку можна відновити шляхом створення підкласуTestSuite
, який визначає метод_removeTestAtIndex
, який нічого не робить (див.TestSuite .__iter__()
) (bpo-11798).unittest
тепер використовуєargparse
для аналізу командного рядка. Існують певні недійсні форми команд, які раніше працювали, але більше не дозволені; теоретично це не повинно викликати проблем із зворотною сумісністю, оскільки заборонені форми команд не мали жодного сенсу та навряд чи будуть використовуватися.Функції
re.split()
,re.findall()
іre.sub()
, а такожgroup()
і Методиgroups()
об’єктівmatch
тепер завжди повертають об’єкт bytes, коли рядок, який потрібно знайти, є bytes-like object. Раніше тип повернення відповідав типу введення, тому, якщо ваш код залежав від значення, яке повертається, скажімо, якbytearray
, вам потрібно буде змінити свій код.Функції
audioop
тепер викликають помилку відразу після введення рядка, замість того, щоб випадково виходити з ладу пізніше (bpo-16685).Новий аргумент convert_charrefs для
HTMLParser
наразі має значенняFalse
для зворотної сумісності, але з часом буде змінено наTrue
. Рекомендовано додати це ключове слово з відповідним значенням до будь-яких викликівHTMLParser
у вашому коді (bpo-13633).Оскільки аргумент digestmod для функції
hmac.new()
у майбутньому не матиме значення за замовчуванням, усі виклики доhmac.new()
слід змінити, щоб явно вказати digestmod (bpo-17276).Виклик
sysconfig.get_config_var()
за допомогою ключаSO
або пошукSO
у результатах викликуsysconfig.get_config_vars()
є застарілим. Цей ключ слід замінити наEXT_SUFFIX
абоSHLIB_SUFFIX
, залежно від контексту (bpo-19555).Будь-які виклики функцій
open
, які вказуютьU
, слід змінити.U
неефективний у Python3 і зрештою викличе помилку, якщо його використовувати. Залежно від функції, еквівалент її старої поведінки Python2 може бути досягнутий за допомогою аргументу нового рядка або, якщо необхідно, загортання потоку вTextIOWrapper
для використання його аргументу нового рядка (bpo-15204).Якщо ви використовуєте
pyvenv
у сценарії та бажаєте, щоб pip не був встановлений, ви повинні додати--without-pip
до виклику вашої команди.Поведінка за замовчуванням
json.dump()
іjson.dumps()
, коли вказано відступ, змінилася: він більше не створює кінцевих пробілів після елемента, що розділяє коми в кінцях рядків. Це матиме значення, лише якщо у вас є тести, які виконують чутливі до пробілів порівняння такого результату (bpo-16333).doctest
тепер шукає doctests у рядках модуля розширення__doc__
, тож якщо ваш тест doctest включає модулі розширення, які містять речі, схожі на doctests, ви можете побачити помилки тестування, яких ніколи раніше не бачили, коли виконання ваших тестів (bpo-3158).Модуль
collections.abc
було дещо перероблено в рамках покращення запуску Python. Як наслідок цього, імпортcollections
автоматично імпортуєcollections.abc
. Якщо ваша програма залежала від (недокументованого) неявного імпорту, вам потрібно буде додати явнийimport collections.abc
(bpo-20784).
Зміни в C API¶
PyEval_EvalFrameEx()
,PyObject_Repr()
іPyObject_Str()
, а також деякі інші внутрішні API C тепер включають твердження про налагодження, яке гарантує, що вони не використовуються в ситуаціях, коли вони можуть мовчки відхилити поточний активний виняток. У випадках, коли скасування активного винятку є очікуваним і бажаним (наприклад, оскільки його вже було збережено локально за допомогоюPyErr_Fetch()
або навмисно замінено іншим винятком), явний викликPyErr_Clear()
буде потрібний, щоб уникнути запуску твердження під час виклику цих операцій (прямо чи опосередковано) і роботи з версією Python, яка скомпільована з увімкненими твердженнями.PyErr_SetImportError()
тепер встановлюєTypeError
, коли його аргумент msg не встановлено. Раніше повертався лишеNULL
без набору винятків.Результатом зворотного виклику
PyOS_ReadlineFunctionPointer
тепер має бути рядок, виділенийPyMem_RawMalloc()
абоPyMem_RawRealloc()
, абоNULL
, якщо сталася помилка, натомість рядка, виділеногоPyMem_Malloc()
абоPyMem_Realloc()
(bpo-16742)PyThread_set_key_value()
тепер завжди встановлює значення. У Python 3.3 функція нічого не робила, якщо ключ уже існує (якщо поточне значення не є вказівникомNULL
).Поле
f_tstate
(стан потоку) структуриPyFrameObject
було видалено, щоб виправити помилку: див. bpo-14432 для обґрунтування.
Змінено в 3.4.3¶
PEP 476: увімкнення перевірки сертифіката за замовчуванням для http-клієнтів stdlib¶
http.client
і модулі, які його використовують, такі як urllib.request
і xmlrpc.client
, тепер перевірятимуть, чи надає сервер сертифікат, підписаний ЦС у довіреного сховища платформи, і чиє ім’я хоста збігається з ім’ям хоста, яке запитується за замовчуванням, що значно покращує безпеку для багатьох програм.
Для програм, які вимагають старої попередньої поведінки, вони можуть передавати альтернативний контекст:
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)