Що нового в Python 3.3¶
У цій статті пояснюється нові функції в Python 3.3 порівняно з 3.2. Python 3.3 було випущено 29 вересня 2012 року. Щоб отримати повну інформацію, перегляньте журнал змін.
Дивись також
PEP 398 - Графік випуску Python 3.3
Підсумок – основні моменти випуску¶
Нові функції синтаксису:
Новий вираз
yield from
для генератора делегування.Синтаксис
u'unicode'
знову приймається для об’єктівstr
.
Нові бібліотечні модулі:
faulthandler
(допомагає налагодити низькорівневі збої)ipaddress
(об’єкти високого рівня, що представляють IP-адреси та маски)lzma
(стиснення даних за допомогою алгоритму XZ / LZMA)unittest.mock
(замінити частини вашої тестованої системи на макетні об’єкти)venv
(Python віртуальні середовища, як у популярному пакетіvirtualenv
)
Нові вбудовані функції:
Перероблено ієрархію винятків вводу/виводу.
Покращення реалізації:
Переписано import machinery на основі
importlib
.Більш компактні рядки Unicode.
Більш компактні словники атрибутів.
Значно вдосконалені бібліотечні модулі:
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
має більш детальні підкласи:
Помилка BrokenPipeError
Завдяки новим виняткам тепер можна уникнути звичайного використання 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__
як динамічно оновлюваної властивості. Вбудовані дескриптори були відповідно оновлені.
abc.abstractproperty
застаріло, замість цього використовуйтеproperty
зabc.abstractmethod()
.
abc.abstractclassmethod
застаріло, замість нього використовуйтеclassmethod
зabc.abstractmethod()
.
abc.abstractstaticmethod
застарів, замість нього використовуйтеstaticmethod
зabc.abstractmethod()
.
(Надав Даррен Дейл у 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
тепер реалізує всі APIio.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
після символу заміни.
Інкрементні кодеки 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.
Кодек 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
).
склеп¶
Додано сіль і модульний формат крипти (метод хешування) і функцію mksalt()
до модуля crypt
.
прокльони¶
Якщо модуль
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()
andln()
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
. Дано awaredatetime
, перетворює його на awaredatetime
за допомогою локального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).
Модуль
os
має нову функціюfwalk()
, подібну доwalk()
за винятком того, що він також видає дескриптори файлів, які посилаються на відвідані каталоги. Це особливо корисно, щоб уникнути перегонів символічних посилань.Наступні функції отримують нові додаткові dir_fd (шляхи відносно дескрипторів каталогу) та/або follow_symlinks (не слідують символічним посиланням):
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
. Підтримку платформи для використання цих параметрів можна перевірити за допомогою наборівos.supports_dir_fd
іos.supports_follows_symlinks
.Наступні функції тепер підтримують дескриптор файлу для свого аргументу шляху:
chdir()
,chmod()
,chown()
,execve()
,listdir()
,pathconf()
,exists()
,stat()
,statvfs()
,utime()
. Підтримку платформи для цього можна перевірити за допомогою наборуos.supports_fd
.
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()
тепер обробляє символічні посилання так, як це робить команда posixmv
, відтворюючи символічне посилання, а не копіюючи вміст цільового файлу. (Надано Джонатаном Нігофом у 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.)
гніздо¶
Клас
socket
тепер надає додаткові методи для обробки допоміжних даних, якщо вони підтримуються базовою платформою:(Надано Девідом Вотсоном у bpo-6560, на основі попереднього патча Хайко Вундрама)
Клас
socket
тепер підтримує сімейство протоколів PF_CAN (https://en.wikipedia.org/wiki/Socketcan) у Linux (https://lwn.net/Articles/253425).(Надано Маттіасом Фуксом, оновлено Тіаго Гонсалвесом у bpo-10141.)
Клас
socket
тепер підтримує сімейство протоколів PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets і https://oss.oracle.com/projects/rds/).Клас
socket
тепер підтримує сімейство протоколівPF_SYSTEM
в OS X. (Надано Майклом Годербауером у bpo-13777.)New function
sethostname()
allows the hostname to be set on unix systems if the calling process has sufficient privileges. (Contributed by Ross Lagerwall in bpo-10866.)
сокетсервер¶
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()
: сума системного та користувальницького процесорного часу поточного процесу.
Інші нові функції:
Функції
clock_getres()
,clock_gettime()
іclock_settime()
з константамиCLOCK_xxx
. (Надав Віктор Стіннер у bpo-10278.)
Щоб покращити узгодженість між платформами, 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'))
веб-браузер¶
Модуль 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 разів швидше.
Зміни збірки та C API¶
Зміни в процесі збирання Python і в API C включають:
Нова пов’язана функція PEP 3118:
PEP 393 додано нові типи Unicode, макроси та функції:
API високого рівня:
API низького рівня:
Структури
PyASCIIObject
іPyCompactUnicodeObject
PyUnicode_DATA
,PyUnicode_1BYTE_DATA
,PyUnicode_2BYTE_DATA
,PyUnicode_4BYTE_DATA
PyUnicode_KIND
зPyUnicode_Kind
enum:PyUnicode_WCHAR_KIND
,PyUnicode_1BYTE_KIND
,PyUnicode_2BYTE_KIND
,PyUnicode_4BYTE_KIND
PyArg_ParseTuple
тепер приймаєbytearray
для форматуc
(bpo-12380).
Застаріле¶
Непідтримувані операційні системи¶
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
модуль:abc.abstractproperty
застаріло, замість цього використовуйтеproperty
зabc.abstractmethod()
.abc.abstractclassmethod
застаріло, замість нього використовуйтеclassmethod
зabc.abstractmethod()
.abc.abstractstaticmethod
застарів, замість нього використовуйтеstaticmethod
зabc.abstractmethod()
.
importlib
пакет:importlib.abc.SourceLoader.path_mtime()
тепер не підтримується на користьimportlib.abc.SourceLoader.path_stats()
, оскільки файли байт-коду тепер зберігають як час модифікації, так і розмір вихідного файлу, файл байт-коду було скомпільовано від.
Застарілі функції та типи C API¶
Py_UNICODE
був застарілим PEP 393 і буде видалено в Python 4. Усі функції, що використовують цей тип, застаріли:
Unicode functions and methods using Py_UNICODE
and
Py_UNICODE*
types:
PyUnicode_FromUnicode
: використовуйтеPyUnicode_FromWideChar()
абоPyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
: використовуйтеPyUnicode_AsWideCharString()
PyUnicode_AS_DATA
: використовуйтеPyUnicode_DATA
зPyUnicode_READ
іPyUnicode_WRITE
PyUnicode_GET_SIZE
,PyUnicode_GetSize()
: використовуйтеPyUnicode_GET_LENGTH
абоPyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE
: використовуйтеPyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(працює лише з готовими рядками)PyUnicode_AsUnicodeCopy()
: використовуйтеPyUnicode_AsUCS4Copy()
абоPyUnicode_AsWideCharString()
PyUnicode_GetMax()
Функції та макроси, що маніпулюють рядками Py_UNICODE*:
Py_UNICODE_strlen
: використовуйтеPyUnicode_GetLength()
абоPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: використовуйтеPyUnicode_CopyCharacters()
абоPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
: використовуйтеPyUnicode_CopyCharacters()
абоPyUnicode_Substring()
Py_UNICODE_strcmp
: використовуйтеPyUnicode_Compare()
Py_UNICODE_strncmp
: використовуйтеPyUnicode_Tailmatch()
Py_UNICODE_strchr
,Py_UNICODE_strrchr
: використовуйтеPyUnicode_FindChar()
Py_UNICODE_FILL
: використовуйтеPyUnicode_Fill()
Py_UNICODE_MATCH
Кодери:
PyUnicode_Encode()
: використовуйтеPyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF8()
: використовуйтеPyUnicode_AsUTF8()
абоPyUnicode_AsUTF8String()
PyUnicode_EncodeUnicodeEscape()
використовуйтеPyUnicode_AsUnicodeEscapeString()
PyUnicode_EncodeRawUnicodeEscape()
використовуйтеPyUnicode_AsRawUnicodeEscapeString()
PyUnicode_EncodeLatin1()
: використовуйтеPyUnicode_AsLatin1String()
PyUnicode_EncodeASCII()
: використовуйтеPyUnicode_AsASCIIString()
PyUnicode_EncodeMBCS()
: використовуйтеPyUnicode_AsMBCSString()
абоPyUnicode_EncodeCodePage()
(зCP_ACP
code_page)PyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
Застарілі функції¶
Код формату '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
тепер виникає, якщо функції Cgmtime()
або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, надано Карлом Майєром з виданнями Еріка Араухо.)