Содержание страницы
Что нового в Python 3.0¶What’s New In Python 3.0
- Автор
Guido van Rossum
Эта статья объясняет новые возможности Python 3.0 по сравнению с 2.6. Python 3.0, также известный как «Python 3000» или «Py3K», является первым в истории выпуском Python, который намеренно нарушает обратную совместимость. В нём больше изменений, чем в типичном выпуске, и многие из них важны для всех пользователей Python. Тем не менее, после осмысления изменений становится ясно, что Python на самом деле не так уж сильно изменился – в целом мы в основном исправляем известные недочёты и недостатки, а также удаляем много старого хлама.
Эта статья не ставит целью дать полную спецификацию всех новых возможностей, а скорее предоставляет удобный обзор. За полными подробностями следует обращаться к документации Python 3.0 и/или к многочисленным PEP, упомянутым в тексте. Чтобы понять все детали реализации и обоснование конкретной возможности, в PEP обычно содержится больше сведений, чем в обычной документации; но учтите, что после полной реализации возможности PEP, как правило, не обновляются.
Из-за ограничений по времени этот документ не так полон, как должен был бы быть. Как и всегда для нового релиза, файл Misc/NEWS в дистрибутиве исходного кода содержит множество подробностей обо всех, даже самых мелких изменениях.
Типичные проблемы¶Common Stumbling Blocks
В этом разделе перечислены те немногие изменения, которые с наибольшей вероятностью вызовут затруднения у тех, кто привык к Python 2.5.
Print – функция¶Print Is A Function
Оператор print заменён функцией print(), которая принимает именованные аргументы, заменяющие большую часть специального синтаксиса старого оператора print (PEP 3105). Примеры:
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)
Old: print x, # Завершающая запятая подавляет перевод строки
New: print(x, end=" ") # Добавляет пробел вместо перевода строки
Old: print # Выводит перевод строки
New: print() # Необходимо вызвать функцию!
Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)
Old: print (x, y) # выводит repr((x, y))
New: print((x, y)) # Не то же самое, что print(x, y)!
Также можно настроить разделитель между элементами, например:
print("There are <", 2**32, "> possibilities!", sep="")
что выводит:
There are <4294967296> possibilities!
Примечание:
Функция
print()не поддерживает возможность «softspace» старого оператораprint. Например, в Python 2.x конструкцияprint "A\n", "B"записывала"A\nB\n"; а в Python 3.0 конструкцияprint("A\n", "B")записывает"A\n B\n".Поначалу вы будете часто вводить старый
print xв интерактивном режиме. Пора переучить пальцы набирать вместо негоprint(x)!При использовании инструмента преобразования исходного кода
2to3все операторыprintавтоматически преобразуются в вызовы функцииprint(), так что для крупных проектов это, как правило, не проблема.
Представления и итераторы вместо списков¶Views And Iterators Instead Of Lists
Некоторые известные API больше не возвращают списки:
Методы
dict,dict.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()теперь возвращает итератор.
Сравнения на упорядочивание¶Ordering Comparisons
Python 3.0 упростил правила для сравнений на упорядочивание:
Операторы сравнения на упорядочивание (
<,<=,>=,>) вызывают исключение TypeError, если операнды не имеют осмысленного естественного порядка. Таким образом, выражения вроде1 < '',0 > Noneилиlen <= lenбольше не допустимы, и, например,None < NoneвызываетTypeErrorвместо возвратаFalse. Следствием является то, что сортировка гетерогенного списка больше не имеет смысла – все элементы должны быть сравнимы друг с другом. Обратите внимание, что это не относится к операторам==и!=: объекты разных несравнимых типов всегда считаются неравными друг другу.builtin.sorted()иlist.sort()больше не принимают аргумент cmp, задающий функцию сравнения. Вместо него используйте аргумент key. Примечание: аргументы key и reverse теперь являются только ключевыми (keyword-only).Функция
cmp()должна считаться исчезнувшей, а специальный метод__cmp__()больше не поддерживается. Используйте__lt__()для сортировки,__eq__()с__hash__()и другие расширенные сравнения по необходимости. (Если действительно нужна функциональностьcmp(), можно использовать выражение(a > b) - (a < b)как эквивалентcmp(a, b).)
Целые числа¶Integers
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вместо этого.
Текст и данные вместо Unicode и 8-битных строк¶Text Vs. Data Instead Of Unicode Vs. 8-bit
Всё, что вы знали о двоичных данных и Unicode, изменилось.
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'в Python 3.0 – это строка из 6 символов, тогда как в 2.6ur'\u20ac'был одним символом «евро». (Разумеется, это изменение затрагивает только сырые строковые литералы; символ евро в Python 3.0 – это'\u20ac'.)Встроенный абстрактный тип
basestringбыл удалён. Используйтеstrвместо него. Типыstrиbytesне имеют достаточной общности функциональности, чтобы оправдать общий базовый класс. Инструмент2to3(см. ниже) заменяет каждое вхождениеbasestringнаstr.Файлы, открытые как текстовые (по-прежнему режим по умолчанию для
open()), всегда используют кодировку для преобразования между строками (в памяти) и байтами (на диске). Двоичные файлы (открытые сbв аргументе режима) всегда используют байты в памяти. Это означает, что если файл открыт с неправильным режимом или кодировкой, ввод-вывод, скорее всего, приведёт к явной ошибке, а не к незаметному получению некорректных данных. Это также означает, что даже пользователи Unix должны указывать правильный режим (текстовый или двоичный) при открытии файла. Существует зависимая от платформы кодировка по умолчанию, которая на Unix-подобных платформах может быть задана с помощью переменной окруженияLANG(а иногда и с помощью некоторых других платформозависимых переменных, связанных с локалью). Во многих случаях, но не во всех, системная кодировка по умолчанию – UTF-8; на неё никогда не следует полагаться. Любое приложение, читающее или записывающее нечто большее, чем чистый ASCII-текст, вероятно, должно иметь способ переопределить кодировку. Больше нет необходимости использовать потоки, поддерживающие кодировку, из модуляcodecs.Начальные значения
sys.stdin,sys.stdoutиsys.stderrтеперь являются текстовыми файлами, предназначенными только для Unicode (т.е. они являются экземплярамиio.TextIOBase). Для чтения и записи байтовых данных с помощью этих потоков необходимо использовать их атрибутio.TextIOBase.buffer.Имена файлов передаются в API и возвращаются из них в виде строк (Unicode). Это может вызывать платформозависимые проблемы, поскольку на некоторых платформах имена файлов представляют собой произвольные байтовые строки. (С другой стороны, в Windows имена файлов изначально хранятся как Unicode.) В качестве обходного решения большинство 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 символы. Однако он по-прежнему экранирует управляющие символы и кодовые точки, имеющие статус непечатаемых в стандарте Unicode.PEP 3120: Теперь кодировка исходного кода по умолчанию – UTF-8.
PEP 3131: Теперь в идентификаторах допускаются не-ASCII буквы. (Однако стандартная библиотека остаётся ASCII-only, за исключением имён участников в комментариях.)
Модули
StringIOиcStringIOудалены. Вместо этого импортируйте модульioи используйтеio.StringIOилиio.BytesIOдля текста и данных соответственно.См. также Unicode HOWTO, который был обновлён для Python 3.0.
Обзор синтаксических изменений¶Overview Of Syntax Changes
В этом разделе даётся краткий обзор всех синтаксических изменений в Python 3.0.
Новый синтаксис¶New Syntax
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().
Изменённый синтаксис¶Changed Syntax
PEP 3109 и PEP 3134: новый синтаксис оператора
raise:raise [expr [from 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): ...
Модульная глобальная переменная
__metaclass__больше не поддерживается. (Это был костыль, чтобы упростить использование новых классов по умолчанию без наследования каждого класса отobject.)Генераторы списков больше не поддерживают синтаксическую форму
[... for var in item1, item2, ...]. Используйте[... for var in (item1, item2, ...)]вместо этого. Также обратите внимание, что у генераторов списков другая семантика: они ближе к синтаксическому сахару для выражения-генератора внутри конструктораlist(), и, в частности, переменные цикла больше не просачиваются в окружающую область видимости.Многоточие (
...) теперь можно использовать как атомарное выражение в любом месте. (Раньше оно допускалось только в срезах.) Кроме того, теперь его необходимо писать как.... (Раньше его можно было писать как. . ., просто из-за случайности грамматики.)
Удалённый синтаксис¶Removed Syntax
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¶Changes Already Present In Python 2.6
Поскольку многие пользователи, вероятно, переходят напрямую с Python 2.5 на Python 3.0, этот раздел напоминает о новых возможностях, которые изначально были разработаны для Python 3.0, но были перенесены в Python 2.6. Для более подробных описаний следует обращаться к соответствующим разделам в Что нового в Python 2.6.
PEP 343: Оператор 'with'. Оператор
withтеперь является стандартной возможностью и больше не требует импорта из__future__. Также обратите внимание на Написание контекстных менеджеров и Модуль contextlib.PEP 366: Явные относительные импорты из основного модуля. Это повышает полезность опции
-m, когда импортируемый модуль находится в пакете.PEP 3101: Расширенное форматирование строк. Примечание: в описании для 2.6 упоминается метод
format()как для 8-битных, так и для Unicode-строк. В 3.0 только типstr(текстовые строки с поддержкой Unicode) поддерживает этот метод; типbytes– нет. Планируется со временем сделать это единственным API для форматирования строк и начать устаревание оператора%в Python 3.1.PEP 3105: print как функция. Теперь это стандартная возможность и больше не требует импорта из
__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.
Изменения в библиотеке¶Library Changes
Из-за нехватки времени этот документ не охватывает все обширные изменения в стандартной библиотеке. 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
configparser
copy_reg
copyreg
очередь
очередь
SocketServer
socketserver
markupbase
_markupbase
repr
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'для array удален – используйте'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.lettersи его друзья (string.lowercaseиstring.uppercase) удалены. Используйтеstring.ascii_lettersи т.д. вместо них. (Причина удаления в том, что уstring.lettersи друзей было поведение, зависящее от локали, что является плохой идеей для таких привлекательно названных глобальных «констант».)Модуль
__builtin__переименован вbuiltins(удалены подчеркивания, добавлена буква 's'). Переменная__builtins__, присутствующая в большинстве глобальных пространств имен, не изменилась. Для изменения встроенного объекта следует использоватьbuiltins, а не__builtins__!
PEP 3101: Новый подход к форматированию строк¶PEP 3101: A New Approach To String Formatting
Новая система встроенных операций форматирования строк заменяет оператор форматирования строк
%. (Однако оператор%по-прежнему поддерживается; он будет объявлен устаревшим в Python 3.1 и удален из языка в более поздней версии.) Прочтите PEP 3101 для получения полной информации.
Изменения в исключениях¶Changes To Exceptions
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: Перехват исключений. Теперь необходимо использовать
except SomeException as variableвместоexcept 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 не удается загрузить модуль расширения. Например,
error code 193теперь%1 is not a valid Win32 application. Строки теперь работают с неанглийскими локалями.
Разные другие изменения¶Miscellaneous Other Changes
Операторы и специальные методы¶Operators And Special Methods
!=теперь возвращает противоположность==, если только==не возвращает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__().
Встроенные функции¶Builtins
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])вместо того, чтобы всегда возвращать float. В общем случае она возвращает целое число при вызове с одним аргументом и значение того же типа, что и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(). Теперь существует несколько различных видов потоков, которые open может возвращать в модулеio.Удалён
reduce(). Используйтеfunctools.reduce(), если он действительно нужен; однако в 99% случаев явный циклforчитается лучше.Удалён
reload(). Используйтеimp.reload().Удалено.
dict.has_key()– вместо этого используйте операторin.
Изменения в сборке и C API¶Build and C API Changes
Из-за нехватки времени приведён очень неполный список изменений C API.
Поддержка нескольких платформ прекращена, включая, но не ограничиваясь Mac OS 9, BeOS, RISCOS, Irix и Tru64.
PEP 3118: Новый буферный API.
PEP 3121: Инициализация и финализация модулей расширения.
PEP 3123: Приведение
PyObject_HEADв соответствие со стандартом C.Больше нет поддержки C API для ограниченного выполнения.
C API
PyNumber_Coerce(),PyNumber_CoerceEx(),PyMember_Get()иPyMember_Set()удалены.Новый C API
PyImport_ImportModuleNoBlock(), работает какPyImport_ImportModule(), но не блокируется на блокировке импорта (вместо этого возвращается ошибка).Переименован слот и метод уровня C для преобразования в логическое значение:
nb_nonzeroтеперьnb_bool.Из C API удалены
METH_OLDARGSиWITH_CYCLE_GC.
Производительность¶Performance
Чистым результатом обобщений в версии 3.0 является то, что Python 3.0 выполняет тест pystone примерно на 10% медленнее, чем Python 2.5. Скорее всего, главная причина – удаление специальной обработки для малых целых чисел. Есть возможность для улучшения, но это произойдёт после выхода версии 3.0!
Перенос на Python 3.0¶Porting To 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 – автоматическая трансляция кода Python 2 в Python 3 для получения дополнительной информации об этом инструменте.) Запустите результат трансляции в 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.