Що нового в Python 3.0¶
- Автор
Guido van Rossum
This article explains the new features in Python 3.0, compared to 2.6. Python 3.0, also known as «Python 3000» or «Py3K», is the first ever intentionally backwards incompatible Python release. There are more changes than in a typical release, and more that are important for all Python users. Nevertheless, after digesting the changes, you’ll find that Python really hasn’t changed all that much – by and large, we’re mostly fixing well-known annoyances and warts, and removing a lot of old cruft.
Ця стаття не намагається надати повну специфікацію всіх нових функцій, а натомість намагається дати зручний огляд. Щоб отримати повну інформацію, зверніться до документації для Python 3.0 та/або багатьох PEP, на які посилаються в тексті. Якщо ви хочете зрозуміти повну реалізацію та обґрунтування розробки певної функції, PEP зазвичай містять більше деталей, ніж звичайна документація; але зауважте, що PEP зазвичай не оновлюються після повного впровадження функції.
Через обмеження часу цей документ не такий повний, як мав би бути. Як завжди для нових випусків, файл Misc/NEWS у вихідному дистрибутиві містить велику кількість детальної інформації про кожну дрібницю, яку було змінено.
Поширені камені спотикання¶
У цьому розділі перераховано ті кілька змін, які, швидше за все, вас збентежать, якщо ви звикли до Python 2.5.
Друк — це функція¶
Інструкцію print було замінено функцією print() із ключовими аргументами для заміни більшості спеціального синтаксису старого інструкції ``print (PEP 3105). Приклади:
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)
Old: print x, # Trailing comma suppresses newline
New: print(x, end=" ") # Appends a space instead of a newline
Old: print # Prints a newline
New: print() # You must call the function!
Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)
Old: print (x, y) # prints repr((x, y))
New: print((x, y)) # Not the same as print(x, y)!
Ви також можете налаштувати роздільник між елементами, наприклад:
print("There are <", 2**32, "> possibilities!", sep="")
який виробляє:
There are <4294967296> possibilities!
Примітка:
Функція
print()не підтримує функцію «softspace» старого оператораprint. Наприклад, у Python 2.xprint "A\n", "B"буде писати"A\nB\n"; але в Python 3.0print("A\n", "B")пише"A\n B\n".Спочатку вам доведеться часто в інтерактивному режимі вводити старий
print x. Час перенавчити свої пальці вводитиprint(x)замість цього!Під час використання інструменту перетворення джерела в джерело
2to3усі операториprintавтоматично перетворюються на виклики функційprint(), тому це здебільшого не є проблемою для великих проектів.
Перегляди та ітератори замість списків¶
Деякі відомі API більше не повертають списки:
Методи
dictdict.keys(),dict.items()іdict.values()повертають «перегляди» замість списків. Наприклад, це більше не працює:k = d.keys(); k.sort(). Замість цього використовуйтеk = sorted(d)(це також працює в Python 2.5 і є таким же ефективним).Крім того, методи
dict.iterkeys(),dict.iteritems()іdict.itervalues()більше не підтримуються.map()іfilter()повертають ітератори. Якщо вам справді потрібен список і всі вхідні послідовності мають однакову довжину, швидким виправленням є обернутиmap()уlist(), наприклад.list(map(...)), але кращим виправленням часто є використання розуміння списку (особливо, коли вихідний код використовуєlambda), або переписування коду, щоб він не потребував взагалі список. Особливо складним є викликmap()для побічних ефектів функції; правильним перетворенням є використання звичайного циклуfor(оскільки створення списку буде марнотратним).Якщо вхідні послідовності не мають однакову довжину,
map()зупиниться на кінці найкоротшої послідовності. Для повної сумісності зmap()з Python 2.x також оберніть послідовності вitertools.zip_longest(), наприклад.map(func, *sequences)стаєlist(map(func, itertools.zip_longest(*sequences))).range()тепер поводиться якxrange(), за винятком того, що він працює зі значеннями довільного розміру. Останнього вже не існує.zip()тепер повертає ітератор.
Упорядкування порівнянь¶
Python 3.0 спростив правила впорядкування порівнянь:
Оператори порівняння порядку (
<,<=,> =,>) викликають виняток TypeError, коли операнди не мають значущого природного порядку. Таким чином, такі вирази, як1 < '',0 > Noneабоlen <= lenбільше не є дійсними, і, наприклад,None < NoneвикликаєTypeErrorзамість поверненняFalse. Як наслідок, сортування гетерогенного списку більше не має сенсу — усі елементи мають бути порівнюваними між собою. Зауважте, що це не стосується операторів==і!=: об’єкти різних непорівнюваних типів завжди порівнюються нерівномірно.builtin.sorted()іlist.sort()більше не приймають аргумент cmp, що забезпечує функцію порівняння. Замість цього використовуйте аргумент key. N.B. аргументи key і reverse тепер є «лише ключовими словами».Функцію
cmp()слід розглядати як зниклу, а спеціальний метод__cmp__()більше не підтримується. Використовуйте__lt__()для сортування,__eq__()з__hash__()та інші детальні порівняння за потреби. (Якщо вам справді потрібна функціяcmp(), ви можете використати вираз(a > b) - (a < b)як еквівалентcmp(a, b).)
Цілі числа¶
PEP 237: По суті,
longперейменовано наint. Тобто, існує лише один вбудований інтегральний тип з назвоюint; але він поводиться здебільшого як старий типlong.PEP 238: Вираз на кшталт
1/2повертає число з плаваючою точкою. Використовуйте1//2, щоб отримати режим скорочення. (Останній синтаксис існував роками, принаймні з Python 2.2.)Константу
sys.maxintбуло видалено, оскільки більше немає обмежень на значення цілих чисел. Однакsys.maxsizeможна використовувати як ціле число, більше за будь-який практичний список або рядковий індекс. Він відповідає «природному» цілочисельному розміру реалізації та зазвичай такий самий, якsys.maxintу попередніх випусках на тій самій платформі (припускаючи ті самі параметри збірки).repr()довгого цілого числа більше не включає завершальнийL, тому код, який беззастережно видаляє цей символ, замість цього відсікає останню цифру. (Натомість використовуйтеstr().)Вісімкові літерали більше не мають форми
0720; замість цього використовуйте0o720.
Текст Vs. Дані замість Unicode Vs. 8-бітний¶
Усе, що ви думали знати про двійкові дані та Юнікод, змінилося.
Python 3.0 використовує поняття текст і (двійкові) дані замість рядків Unicode і 8-бітних рядків. Весь текст є Unicode; однак закодований Unicode представлений як двійкові дані. Для зберігання тексту використовується тип
str, а для зберігання даних —bytes. Найбільша відмінність із ситуацією 2.x полягає в тому, що будь-яка спроба змішати текст і дані в Python 3.0 викликаєTypeError, тоді як якби ви змішали Unicode та 8-бітні рядки в Python 2.x, це спрацювало б якщо 8-бітний рядок містив лише 7-бітні (ASCII) байти, але ви отримаєтеUnicodeDecodeError, якщо він містив значення, відмінні від ASCII. Ця ціннісна поведінка викликала багато сумних облич протягом багатьох років.Як наслідок цієї зміни у філософії, майже весь код, який використовує Unicode, кодування або двійкові дані, швидше за все, має змінитися. Зміна на краще, оскільки у світі 2.x було багато помилок, пов’язаних зі змішуванням кодованого та незакодованого тексту. Щоб підготуватися до Python 2.x, почніть використовувати
unicodeдля всього незакодованого тексту таstrлише для двійкових або закодованих даних. Тоді інструмент2to3зробить більшу частину роботи за вас.Ви більше не можете використовувати літерали
u"..."для тексту Unicode. Однак ви повинні використовувати літералиb"..."для двійкових даних.Оскільки типи
strіbytesне можна змішувати, ви завжди повинні явно конвертувати між ними. Використовуйтеstr.encode()для переходу відstrдоbytesіbytes.decode()для переходу відbytesдоstr. Ви також можете використовуватиbytes(s, encoding=...)таstr(b, encoding=...)відповідно.Як і
str, типbytesє незмінним. Існує окремий змінний тип для зберігання буферизованих двійкових даних,bytearray. Майже всі API, які приймаютьbytes, також приймаютьbytearray. Змінний API заснований наcollections.MutableSequence.Усі зворотні косі риски в необроблених рядкових літералах інтерпретуються буквально. Це означає, що екранування
'\U'і'\u'у необроблених рядках не обробляються спеціально. Наприклад,r'\u20ac— це рядок із 6 символів у Python 3.0, тоді як у 2.6ur'\u20acбув одним символом «євро». (Звичайно, ця зміна стосується лише необроблених рядкових літералів; у Python 3.0 символом євро є'\u20ac'.)Вбудований
basestringабстрактний тип було видалено. Замість цього використовуйтеstr. Типиstrіbytesне мають достатньо спільних функціональних можливостей, щоб гарантувати спільний базовий клас. Інструмент2to3(див. нижче) замінює кожне входженняbasestringнаstr.Файли, відкриті як текстові файли (досі стандартний режим для
open()), завжди використовують кодування для відображення між рядками (у пам’яті) та байтами (на диску). Двійкові файли (відкриті за допомогоюbв аргументі mode) завжди використовують байти в пам’яті. Це означає, що якщо файл відкрито з використанням неправильного режиму або кодування, введення-виведення, ймовірно, голосно завершиться помилкою, замість того, щоб мовчки видати неправильні дані. Це також означає, що навіть користувачі Unix повинні будуть вказати правильний режим (текстовий або двійковий) під час відкриття файлу. Існує залежне від платформи кодування за замовчуванням, яке на платформах Unixy можна встановити за допомогою змінної середовищаLANG(і іноді також за допомогою деяких інших змінних середовища, пов’язаних із місцевими стандартами). У багатьох випадках, але не у всіх, системою за замовчуванням є UTF-8; ви ніколи не повинні розраховувати на це замовчування. Будь-яка програма, яка читає або записує більше ніж чистий текст ASCII, ймовірно, повинна мати спосіб заміни кодування. Більше немає необхідності використовувати потоки з урахуванням кодування в модуліcodecs.Початкові значення
sys.stdin,sys.stdoutіsys.stderrтепер є текстовими файлами лише у кодуванні Юнікод (тобто вони є екземплярамиio. TextIOBase). Щоб читати та записувати дані байтів за допомогою цих потоків, вам потрібно використовувати їхній атрибутio.TextIOBase.buffer.Імена файлів передаються та повертаються з API як рядки (Unicode). Це може спричинити проблеми, пов’язані з певною платформою, оскільки на деяких платформах імена файлів є довільними рядками байтів. (З іншого боку, у Windows імена файлів зберігаються у форматі Юнікод.) Як обхідний шлях, більшість API (наприклад,
open()і багато функцій у модуліos), які приймають імена файлів, приймають: об’єктиbytes, а також рядки, а кілька API мають спосіб запитувати значення, що повертаєтьсяbytes. Таким чином,os.listdir()повертає список екземплярівbytes, якщо аргумент є екземпляромbytes, аos.getcwdb()повертає поточний робочий каталог як екземплярbytes. Зауважте, що колиos.listdir()повертає список рядків, імена файлів, які не можна правильно розшифрувати, пропускаються, а не викликаютьUnicodeError.Деякі системні API, як-от
os.environіsys.argv, також можуть створювати проблеми, коли байти, доступні системою, не можна інтерпретувати за допомогою стандартного кодування. Встановлення змінноїLANGі повторний запуск програми є, ймовірно, найкращим підходом.PEP 3138:
repr()рядка більше не екранує символи, відмінні від ASCII. Однак у стандарті Юнікод він все ще уникає контрольних символів і кодових точок зі статусом «недрукований».PEP 3120: Стандартне кодування джерела тепер UTF-8.
PEP 3131: Літери, відмінні від ASCII, тепер дозволені в ідентифікаторах. (Однак стандартна бібліотека залишається лише ASCII, за винятком імен учасників у коментарях.)
Модулі
StringIOіcStringIOзникли. Натомість імпортуйте модульioі використовуйтеio.StringIOабоio.BytesIOдля тексту та даних відповідно.Дивіться також Юнікод HOWTO, який було оновлено для Python 3.0.
Огляд змін синтаксису¶
У цьому розділі подано короткий огляд усіх синтаксичних змін у Python 3.0.
Новий синтаксис¶
PEP 3107: Аргумент функції та анотації значення, що повертається. Це забезпечує стандартизований спосіб анотування параметрів функції та значення, що повертається. Немає жодної семантики, пов’язаної з такими анотаціями, за винятком того, що їх можна перевірити під час виконання за допомогою атрибута
__annotations__. Мета полягає в тому, щоб заохотити експериментувати за допомогою метакласів, декораторів або фреймворків.PEP 3102: аргументи лише для ключових слів. Іменовані параметри, що виникають після
*argsу списку параметрів повинні вказуватися за допомогою синтаксису ключового слова під час виклику. Ви також можете використовувати голий*у списку параметрів, щоб вказати, що ви не приймаєте список аргументів змінної довжини, але у вас є аргументи лише для ключових слів.Аргументи ключових слів дозволені після списку базових класів у визначенні класу. Це використовується новою конвенцією для визначення метакласу (див. наступний розділ), але також може використовуватися для інших цілей, якщо метаклас це підтримує.
PEP 3104:
nonlocalоператор. Використовуючиnonlocal x, тепер ви можете призначати безпосередньо змінній у зовнішній (але не глобальній) області.nonlocal— нове зарезервоване слово.PEP 3132: Розширене ітераційне розпакування. Тепер ви можете писати такі речі, як
a, b, *rest = some_sequence. І навіть*rest, a = stuff. Об’єктrestзавжди є (можливо, порожнім) списком; права частина може бути будь-якою ітерованою. Приклад:(a, *rest, b) = range(5)
Це встановлює a на
0, b на4, а rest на[1, 2, 3].Розуміння словника:
{k: v for k, v in stuff}означає те саме, щоdict(stuff), але є більш гнучким. (Це PEP 274 підтверджено. :-)Встановіть літерали, напр.
{1, 2}. Зауважте, що{}є порожнім словником; використовуйтеset()для порожнього набору. Також підтримується розуміння набору; наприклад,{x for x in stuff}означає те саме, щоset(stuff), але є більш гнучким.Нові вісімкові літерали, напр.
0o720(вже у 2.6). Старі вісімкові літерали (0720) зникли.Нові бінарні літерали, напр.
0b1010(вже у 2.6), і є нова відповідна вбудована функція,bin().Байтові літерали представлено з
bабоBна початку, і є нова відповідна вбудована функція,bytes().
Змінений синтаксис¶
PEP 3109 і PEP 3134: новий синтаксис оператора
raise:raise [expr [з expr]]. Дивіться нижче.asіwithтепер зарезервовані слова. (Насправді з 2.6.)True,FalseіNoneє зарезервованими словами. (2.6 вже частково застосував обмеження наNone.)Змінити з
exceptexc, var наexceptexcasvar. Дивіться PEP 3110.PEP 3115: Новий синтаксис метакласу. Замість:
class C: __metaclass__ = M ...
тепер ви повинні використовувати:
class C(metaclass=M): ...
Змінна module-global
__metaclass__більше не підтримується. (Це була милиця, щоб полегшити за замовчуванням класи нового стилю без отримання кожного класу відobject.)Розуміння списків більше не підтримує синтаксичну форму
[... для var в item1, item2, ...]. Замість цього використовуйте[... для var в (item1, item2, ...)]. Також зауважте, що розуміння списків має іншу семантику: вони ближчі до синтаксичного цукру для виразу генератора всередині конструктораlist(), і, зокрема, керуючі змінні циклу більше не просочуються в навколишню область.Еліпсис (
...) можна використовувати як атомарний вираз будь-де. (Раніше це було дозволено лише у фрагментах.) Крім того, тепер потрібно писати як.... (Раніше це також могло бути написане як..., просто через випадковість граматики.)
Видалений синтаксис¶
PEP 3113: вилучено розпакування параметрів кортежу. Ви більше не можете писати
def foo(a, (b, c)): .... Замість цього використовуйтеdef foo(a, b_c): b, c = b_c.Видалено зворотні галочки (замість цього використовуйте
repr()).Видалено
<>(замість цього використовуйте!=).Видалено ключове слово:
exec()більше не є ключовим словом; воно залишається як функція. (На щастя, синтаксис функції також був прийнятий у 2.x.) Також зауважте, щоexec()більше не приймає аргумент потоку; замістьexec(f)ви можете використовуватиexec(f.read()).Цілі літерали більше не підтримують кінцеві
lабоL.Рядкові літерали більше не підтримують початок
uабоU.Синтаксис
frommoduleimport*дозволений лише на рівні модуля, більше не всередині функцій.Єдиним прийнятним синтаксисом для відносного імпорту є
from .[module] import name. Усі формиimport, які не починаються з., інтерпретуються як абсолютні імпорти. (PEP 328)Класичні заняття зникли.
Зміни вже присутні в Python 2.6¶
Оскільки багато користувачів, ймовірно, переходять прямо з Python 2.5 на Python 3.0, цей розділ нагадує читачеві про нові функції, які спочатку були розроблені для Python 3.0, але які були перенесені на Python 2.6. Додаткові описи можна знайти у відповідних розділах Що нового в Python 2.6.
PEP 343: оператор «з».. Оператор
withтепер є стандартною функцією, і його більше не потрібно імпортувати з__future__. Також перегляньте Написання менеджерів контексту і Модуль contextlib.PEP 366: Явний відносний імпорт із основного модуля. Це підвищує корисність опції
-m, коли модуль, на який посилається, живе в пакеті.PEP 3101: Розширене форматування рядків. Примітка: в описі 2.6 згадується метод
format()як для 8-бітних рядків, так і для рядків Unicode. У версії 3.0 тільки типstr(текстові рядки з підтримкою Unicode) підтримує цей метод; типbytesне має. План полягає в тому, щоб згодом зробити це єдиним API для форматування рядків і почати не підтримувати оператор%у Python 3.1.PEP 3105: друк як функція. Тепер це стандартна функція, і її більше не потрібно імпортувати з
__future__. Детальніше було наведено вище.PEP 3110: Зміни обробки винятків. Синтаксис
exceptexcasvar тепер є стандартним, аexceptexc, var більше не підтримується. (Звичайно, частинаasvar все ще необов’язкова.)PEP 3112: Байтові літерали. Нотація рядкового літералу
b"..."(і його варіанти, такі якb'...',b"""..."""іbr" ...") тепер створює літерал типуbytes.PEP 3116: Нова бібліотека введення-виведення. Модуль
ioтепер є стандартним способом здійснення файлового введення/виведення. Вбудована функціяopen()тепер є псевдонімом дляio.open()і має додаткові ключові аргументи encoding, errors, newline і closefd. Також зауважте, що недійсний аргумент mode тепер викликаєValueError, а неIOError. До бінарного файлового об’єкта, що лежить в основі текстового файлового об’єкта, можна отримати доступ якf.buffer(але пам’ятайте, що текстовий об’єкт підтримує сам буфер, щоб пришвидшити операції кодування та декодування).PEP 3118: Переглянутий буферний протокол. Старий вбудований
buffer()тепер справді зник; новий вбудованийmemoryview()забезпечує (в основному) подібну функціональність.PEP 3119: Абстрактні базові класи. Модуль
abcі ABC, визначені в модуліcollections, тепер відіграють дещо помітнішу роль у мові, а також такі вбудовані типи колекцій, якdictіlistвідповідає ABCcollections.MutableMappingіcollections.MutableSequenceвідповідно.PEP 3127: Підтримка цілочисельного літералу та синтаксис. Як згадувалося вище, нова нотація вісімкових літералів є єдиною, що підтримується, і додано двійкові літерали.
PEP 3141: Ієрархія типів чисел. Модуль
numbersє ще одним новим використанням ABC, що визначає «числову вежу» Python. Також зверніть увагу на новий модульfractions, який реалізуєnumbers.Rational.
Зміни бібліотеки¶
Через обмеження часу цей документ не вичерпно охоплює дуже великі зміни стандартної бібліотеки. PEP 3108 є посиланням на основні зміни в бібліотеці. Ось огляд капсули:
Багато старих модулів було видалено. Деякі, як-от
gopherlib(більше не використовується) іmd5(замінений наhashlib), вже були застарілими PEP 4. Інші були видалені в результаті припинення підтримки різних платформ, таких як Irix, BeOS і Mac OS 9 (див. PEP 11). Деякі модулі також було вибрано для видалення в Python 3.0 через відсутність використання або через те, що існує краща заміна. Перегляньте PEP 3108 для вичерпного списку.Пакет
bsddb3було вилучено, оскільки його присутність у базовій стандартній бібліотеці з часом виявилася особливим тягарем для розробників ядра через нестабільність тестування та графік випуску Berkeley DB. Однак пакет живий і здоровий, підтримується зовні за адресою https://www.jcea.es/programacion/pybsddb.htm.Деякі модулі були перейменовані через те, що їхня стара назва не відповідала PEP 8, або з інших причин. Ось список:
Стара назва
Нова назва
_winreg
winreg
ConfigParser
аналізатор конфігурації
copy_reg
copyreg
Чергу
чергу
SocketServer
сокетсервер
база розмітки
_markupbase
репр
reprlib
test.test_support
test.support
Загальним шаблоном у Python 2.x є одна версія модуля, реалізована на чистому Python, з додатковою прискореною версією, реалізованою як розширення C; наприклад,
pickleіcPickle. Це покладає тягар імпортування прискореної версії та повернення до чистої версії Python на кожного користувача цих модулів. У Python 3.0 прискорені версії вважаються деталями реалізації чистих версій Python. Користувачам слід завжди імпортувати стандартну версію, яка намагається імпортувати прискорену версію та повертається до чистої версії Python. Параpickle/cPickleотримала таку обробку. Модульprofileє в списку для 3.1. МодульStringIOбуло перетворено на клас у модуліio.Деякі пов’язані модулі були згруповані в пакети, і зазвичай назви підмодулів були спрощені. Отримані нові пакети:
html(HTMLParser,htmlentitydefs).http(httplib,BaseHTTPServer,CGIHTTPServer,SimpleHTTPServer,Cookie,cookielib).tkinter(усі пов’язані зTkinterмодулі, крімturtle). Цільова аудиторіяturtleне дуже дбає проtkinter. Також зауважте, що починаючи з Python 2.6, функціональністьturtleбула значно розширена.xmlrpc(xmlrpclib,DocXMLRPCServer,SimpleXMLRPCServer).
Деякі інші зміни до модулів стандартної бібліотеки, не охоплені PEP 3108:
Убитий
sets. Використовуйте вбудований класset().Очищення модуля
sys: видаленоsys.exitfunc(),sys.exc_clear(),sys.exc_type,sys.exc_value,sys.exc_traceback. (Зверніть увагу, щоsys.last_typeтощо залишаються.)Очищення типу
array.array: методиread()іwrite()зникли; замість цього використовуйтеfromfile()іtofile(). Крім того, код типу'c'для масиву зник — використовуйте'b'для байтів або'u'для символів Unicode.Очищення модуля
operator: видаленоsequenceIncludes()іisCallable().Очищення модуля
thread:acquire_lock()іrelease_lock()зникли; замість цього використовуйтеacquire()іrelease().Очищення модуля
random: видалено APIjumpahead().Модуль
newзник.Функції
os.tmpnam(),os.tempnam()іos.tmpfile()було видалено на користь модуляtempfile.Модуль
tokenizeзмінено для роботи з байтами. Головною точкою входу тепер єtokenize.tokenize()замість generate_tokens.string.lettersand its friends (string.lowercaseandstring.uppercase) are gone. Usestring.ascii_lettersetc. instead. (The reason for the removal is thatstring.lettersand friends had locale-specific behavior, which is a bad idea for such attractively-named global «constants».)Змінено назву модуля
__builtin__наbuiltins(видалення підкреслення, додавання „s“). Змінна__builtins__, що міститься в більшості глобальних просторів імен, не змінюється. Щоб змінити вбудований модуль, ви повинні використовуватиbuiltins, а не__builtins__!
PEP 3101: Новий підхід до форматування рядків¶
Нова система для вбудованих операцій форматування рядка замінює оператор форматування рядка
%. (Однак оператор%все ще підтримується; він буде застарілим у Python 3.1 і пізніше буде видалено з мови.) Прочитайте PEP 3101, щоб отримати повну інформацію.
Зміни винятків¶
Було очищено API для виклику та перехоплення винятків і додано нові потужні функції:
PEP 352: усі винятки мають бути отримані (прямо чи опосередковано) з
BaseException. Це корінь ієрархії винятків. Це не нова рекомендація, але вимога для успадкування відBaseExceptionє новою. (Python 2.6 все ще дозволяв створювати класичні класи та не накладав обмежень на те, що ви можете перехопити.) Як наслідок, виключення рядків остаточно по-справжньому й повністю мертві.Майже всі винятки насправді мають походити від
Exception;BaseExceptionслід використовувати лише як базовий клас для винятків, які слід обробляти лише на верхньому рівні, наприкладSystemExitабоKeyboardInterrupt. Рекомендована ідіома для обробки всіх винятків, крім цієї останньої категорії, полягає в використанніexceptException.StandardErrorвидалено.Винятки більше не діють як послідовності. Натомість використовуйте атрибут
args.PEP 3109: Створення винятків. Тепер ви повинні використовувати
raise Exception(args)замістьraise Exception, args. Крім того, ви більше не можете явно вказати відстеження; натомість, якщо вам потрібно це зробити, ви можете призначити безпосередньо атрибуту__traceback__(див. нижче).PEP 3110: Перехоплення винятків. Тепер ви повинні використовувати
крім SomeException як variableзамістькрім SomeException, variable. Крім того, змінна явно видаляється, коли залишається блокexcept.PEP 3134: ланцюжок винятків. Є два випадки: неявне з’єднання та явне з’єднання. Неявне з’єднання відбувається, коли виникає виняток у блоці обробки
exceptабоfinally. Зазвичай це відбувається через помилку в блоці обробки; ми називаємо це вторинним винятком. У цьому випадку вихідний виняток (який оброблявся) зберігається як атрибут__context__вторинного виключення. Явне ланцюжок викликається з таким синтаксисом:raise SecondaryException() from primary_exception
(де primary_exception — це будь-який вираз, який створює об’єкт винятку, ймовірно, виняток, який був раніше перехоплений). У цьому випадку первинний виняток зберігається в атрибуті
__cause__вторинного виключення. Зворотне відстеження, яке друкується, коли виникає необроблена виняткова ситуація, проходить по ланцюжку атрибутів__cause__і__context__і друкує окреме відстеження для кожного компонента ланцюжка з основним винятком у верхній частині. (Користувачі Java можуть розпізнати цю поведінку.)PEP 3134: Об’єкти винятків тепер зберігають свою трасування як атрибут
__traceback__. Це означає, що об’єкт винятку тепер містить всю інформацію, що стосується винятку, і є менше причин для використанняsys.exc_info()(хоча останній не видаляється).Покращено кілька повідомлень про винятки, коли Windows не вдається завантажити модуль розширення. Наприклад,
код помилки 193тепер%1 не є дійсною програмою Win32. Рядки тепер мають справу з неанглійськими локалями.
Інші інші зміни¶
Оператори та спеціальні методи¶
!=тепер повертає протилежність==, якщо==не повертаєNotImplemented.Поняття «незв’язаних методів» було видалено з мови. Посилаючись на метод як на атрибут класу, тепер ви отримуєте звичайний об’єкт функції.
__getslice__(),__setslice__()і__delslice__()були вбиті. Синтаксисa[i:j]тепер перекладається наa.__getitem__(slice(i, j))(або__setitem__()або__delitem__(), коли використовується як ціль призначення або видалення відповідно).PEP 3114: стандартний метод
next()було перейменовано на__next__().Спеціальні методи
__oct__()і__hex__()видалено –oct()іhex()тепер використовують__index__()для перетворення аргументу в ціле число.Видалено підтримку
__members__і__methods__.Атрибути функції з назвою
func_Xбуло перейменовано, щоб використовувати форму__X__, звільнивши ці імена в просторі імен атрибутів функції для атрибутів, визначених користувачем. Зокрема,func_closure,func_code,func_defaults,func_dict,func_doc,func_globals,func_nameбули перейменовані на__closure__,__code__,__defaults__,__dict__,__doc__,__globals__,__name__відповідно.__nonzero__()тепер__bool__().
Вбудовані¶
PEP 3135: Нове
super(). Тепер ви можете викликатиsuper()без аргументів і (припускаючи, що це в звичайному методі екземпляра, визначеному всередині оператораclass) правильний клас і екземпляр будуть вибрані автоматично. З аргументами поведінкаsuper()не змінюється.PEP 3111:
raw_input()було перейменовано наinput(). Тобто нова функціяinput()зчитує рядок ізsys.stdinі повертає його без кінцевого символу нового рядка. Він викликаєEOFError, якщо введення завершується передчасно. Щоб отримати стару поведінкуinput(), використовуйтеeval(input()).Додано нову вбудовану функцію
next()для виклику методу__next__()для об’єкта.Змінено стратегію округлення функції
round()і тип повернення. Точні половинні випадки тепер округлюються до найближчого парного результату замість нуля. (Наприклад,round(2.5)тепер повертає2, а не3.)round(x[, n])тепер делегуєx.__round__([ n])замість того, щоб завжди повертати число з плаваючою точкою. Зазвичай він повертає ціле число, якщо викликається з одним аргументом, і значення того самого типу, що йx, коли викликається з двома аргументами.Переміщено
intern()доsys.intern().Видалено:
apply(). Замістьapply(f, args)використовуйтеf(*args).Видалено
callable(). Замістьcallable(f)ви можете використовуватиisinstance(f, collections.Callable). Функціяoperator.isCallable()також зникла.Видалено
coerce(). Ця функція більше не служить меті, оскільки класичні класи зникли.Видалено
execfile(). Замістьexecfile(fn)використовуйтеexec(open(fn).read()).Видалено тип
file. Використовуйтеopen(). Зараз існує кілька різних типів потоків, які відкриваються і можуть повертатися в модуліio.Видалено
reduce(). Використовуйтеfunctools.reduce(), якщо вам це дійсно потрібно; однак у 99% випадків явний циклforчитабельніший.Видалено
reload(). Використовуйтеimp.reload().Видалено.
dict.has_key()– замість цього використовуйте операторin.
Зміни збірки та C API¶
Через обмеження часу ось дуже неповний список змін до C API.
Було припинено підтримку кількох платформ, зокрема Mac OS 9, BeOS, RISCOS, Irix і Tru64.
PEP 3118: Новий API буфера.
PEP 3121: Ініціалізація та завершення модуля розширення.
PEP 3123: Приведення
PyObject_HEADдо стандарту C.Більше немає підтримки C API для обмеженого виконання.
PyNumber_Coerce(),PyNumber_CoerceEx(),PyMember_Get()іPyMember_Set()API C видалено.Новий C API
PyImport_ImportModuleNoBlock(), працює якPyImport_ImportModule(), але не блокує блокування імпорту (натомість повертає помилку).Перейменовано слот і метод логічного перетворення C-рівня:
nb_nonzeroтеперnb_bool.Видалено
METH_OLDARGSіWITH_CYCLE_GCз C API.
Продуктивність¶
Кінцевим результатом узагальнень 3.0 є те, що Python 3.0 виконує тест pystone приблизно на 10% повільніше, ніж Python 2.5. Швидше за все, найбільшою причиною є видалення спеціального регістра для малих цілих чисел. Є місце для вдосконалення, але це станеться після випуску 3.0!
Перенесення на Python 3.0¶
Для перенесення існуючого вихідного коду Python 2.5 або 2.6 на Python 3.0 найкраща стратегія така:
(Обов’язкова умова:) Почніть із чудового тестового покриття.
Порт на Python 2.6. Це повинно бути не більше роботи, ніж середнє перенесення з Python 2.x на Python 2. (x+1). Переконайтеся, що всі ваші тести пройдені.
(Досі використовується 2.6:) Увімкніть перемикач командного рядка
-3. Це вмикає попередження про функції, які буде видалено (або змінено) у версії 3.0. Знову запустіть набір тестів і виправте код, про який ви отримуєте попередження, доки попередження не зникнуть, і всі ваші тести все одно пройдуть.Запустіть перекладач
2to3з джерела в джерело над вашим деревом вихідного коду. (Див. 2to3 - Automated Python 2 to 3 code translation, щоб дізнатися більше про цей інструмент.) Запустіть результат перекладу під Python 3.0. Вручну вирішуйте проблеми, що залишилися, виправляючи проблеми, доки всі тести не пройдуть знову.
Не рекомендується намагатися написати вихідний код, який працює без змін під Python 2.6 і 3.0; вам доведеться використовувати дуже спотворений стиль кодування, напр. уникнення операторів print, метакласів і багато іншого. Якщо ви підтримуєте бібліотеку, яка має підтримувати як Python 2.6, так і Python 3.0, найкращим підходом є змінити крок 3 вище, відредагувавши версію вихідного коду 2.6 і знову запустивши перекладач 2to3 замість редагування Версія вихідного коду 3.0.
Для перенесення розширень C на Python 3.0 див. Перенесення модулів розширення на Python 3.