Что нового в Python 3.0¶
- Автор:
Гвидо ван Россум
В этой статье рассказывается о новых функциях Python 3.0 по сравнению с версией 2.6. Python 3.0, также известный как «Python 3000» или «Py3K», является первым в истории * намеренно несовместимым с Python в обратном направлении* Выпуском Python. Версия Python 3.0 была выпущена 3 декабря 2008 года. В ней больше изменений, чем в обычном выпуске, и они важны для всех пользователей Python. Тем не менее, ознакомившись с изменениями, вы обнаружите, что Python на самом деле изменился не так уж сильно - по большому счету, мы в основном исправляем хорошо известные проблемы и недочеты, а также удаляем много старого хлама.
В этой статье не делается попытка предоставить полную спецификацию всех новых функций, а вместо этого делается попытка дать удобный обзор. Для получения более подробной информации вам следует обратиться к документации по Python 3.0 и/или ко многим PEPS, на которые есть ссылки в тексте. Если вы хотите полностью разобраться в реализации и обосновании дизайна конкретной функции, в PEPS обычно содержится больше деталей, чем в обычной документации; но обратите внимание, что PEPS обычно не обновляются после того, как функция была полностью реализована.
Из-за нехватки времени этот документ получился не таким полным, каким должен был быть. Как и всегда в случае с новым выпуском, файл 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()
не поддерживает функцию «мягкого пространства» старого оператора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-интерфейсы больше не возвращают списки:
методы
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()
теперь возвращает итератор.
Упорядочивание сравнений¶
Python 3.0 упростил правила упорядочения сравнений:
Операторы сравнения упорядочивания (
<
,<=
,>=
,>
) вызывают исключение TypeError, когда операнды не имеют значимого естественного порядка. Таким образом, выражения типа1 < ''
,0 > None
илиlen <= len
больше недействительны, и, например,None < None
возвращаетTypeError
вместоFalse
. Следствием этого является то, что сортировка разнородного списка больше не имеет смысла - все элементы должны быть сопоставимы друг с другом. Обратите внимание, что это не относится к операторам==
и!=
: объекты разных несравнимых типов всегда сравниваются неравномерно друг с другом.builtin.sorted()
иlist.sort()
больше не принимают аргумент cmp, предоставляющий функцию сравнения. Вместо этого используйте аргумент key. Примечание. Аргументы 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
.
Текст Против. Данные Вместо Юникода Против 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"..."
для текста в Юникоде. Однако вы должны использовать литералы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'
был единственным символом «euro». (Конечно, это изменение затрагивает только необработанные строковые литералы; в Python 3.0 символом euro является'\u20ac'
.)Встроенный абстрактный тип
basestring
был удален. Вместо него используйтеstr
. Типыstr
иbytes
не обладают достаточной функциональностью, чтобы использовать общий базовый класс. Инструмент2to3
(смотрите ниже) заменяет каждое вхождениеbasestring
наstr
.Файлы, открытые в виде текстовых файлов (по-прежнему используется режим по умолчанию для
open()
), всегда используют кодировку для сопоставления строк (в памяти) и байтов (на диске). Двоичные файлы (открытые с помощьюb
в аргументе mode) всегда используют байты в памяти. Это означает, что если файл открыт с использованием неправильного режима или кодировки, то, скорее всего, произойдет громкий сбой ввода-вывода, вместо того чтобы автоматически выдавать неверные данные. Это также означает, что даже пользователям Unix придется указывать правильный режим (текстовый или двоичный) при открытии файла. Существует зависящая от платформы кодировка по умолчанию, которую на платформах Unixy можно задать с помощью переменной окружения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, за исключением имен авторов в комментариях.)
Модули
StringIO
иcStringIO
удалены. Вместо этого импортируйте модульio
и используйтеio.StringIO
илиio.BytesIO
для текста и данных соответственно.Смотрите также РУКОВОДСТВО по работе с Юникодом, который был обновлен для 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 [from expr]]
. Смотреть ниже.as
иwith
теперь являются зарезервированными словами. (Фактически, начиная с версии 2.6.)True
,False
, иNone
являются зарезервированными словами. (в версии 2.6 уже частично введены ограничения наNone
.)Измените значение с
except
exc, var наexcept
excas
var. Смотрите PEP 3110.PEP 3115: Новый синтаксис метакласса. Вместо:
class C: __metaclass__ = M ...
теперь вы должны использовать:
class C(metaclass=M): ...
Переменная module-global
__metaclass__
больше не поддерживается. (Это было сделано для того, чтобы упростить переход к классам нового стиля по умолчанию, не выводя каждый класс изobject
.)При использовании списков синтаксическая форма
[... for var in item1, item2, ...]
больше не поддерживается. Вместо этого используйте[... for var in (item1, item2, ...)]
. Также обратите внимание, что представления списков имеют другую семантику: они ближе к синтаксическому сахару для выражения генератора внутри конструктораlist()
, и, в частности, управляющие переменные цикла больше не попадают в окружающую область видимости.Многоточие ** (
...
) может использоваться в качестве атомарного выражения в любом месте. (Ранее это было разрешено только в фрагментах) Кроме того, теперь оно должно записываться как...
. (Ранее оно также могло быть записано как. . .
по простой грамматической случайности.)
Удаленный синтаксис¶
PEP 3113: Параметр кортежа при распаковке удален. Вы больше не можете писать
def foo(a, (b, c)): ...
. Вместо этого используйтеdef foo(a, b_c): b, c = b_c
.Удалены обратные галочки (вместо них используйте
repr()
).Удален
<>
(вместо этого используйте!=
).Удаленное ключевое слово:
exec()
больше не является ключевым словом; оно остается функцией. (К счастью, синтаксис функции также был принят в версии 2.x.) Также обратите внимание, чтоexec()
больше не принимает аргумент stream; вместоexec(f)
вы можете использоватьexec(f.read())
.Целочисленные литералы больше не поддерживают конечные
l
илиL
.Строковые литералы больше не поддерживают начальные
u
илиU
.Модуль
from
**import
*
Синтаксис разрешен только на уровне модуля, а не внутри функций.Единственным приемлемым синтаксисом для относительного импорта является
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». Оператор
with
теперь является стандартной функцией, и его больше не нужно импортировать из__future__
. Также ознакомьтесь с Написание контекстных менеджеров и Модуль contextlib.PEP 366: Явный относительный импорт из основного Модуля. Это повышает полезность параметра
-m
, когда указанный модуль находится в пакете.PEP 3101: Расширенное форматирование строк. Примечание: в описании версии 2.6 упоминается метод
format()
как для 8-разрядных строк, так и для строк в Юникоде. В версии 3.0 только типstr
(текстовые строки с поддержкой Unicode) поддерживает этот метод; типbytes
- нет. План состоит в том, чтобы в конечном итоге сделать это единственным API для форматирования строк и начать отменять оператор%
в Python 3.1.PEP 3105: print Как функция. Теперь это стандартная функция, и ее больше не нужно импортировать из
__future__
. Более подробная информация была приведена выше.PEP 3110: Изменения в обработке исключений. Синтаксис
except
excas
var теперь является стандартным, аexcept
exc, var больше не поддерживается. (Конечно, частьas
var по-прежнему необязательна.)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
и азбука, определенные в модулеcollections
, теперь играют несколько более заметную роль в языке, а встроенные типы коллекций, такие какdict
иlist
, соответствуют требованиямcollections.MutableMapping
иcollections.MutableSequence
Азбука, соответственно.PEP 3127: Поддержка целочисленных литералов и синтаксис. Как упоминалось выше, поддерживается только новая восьмеричная литеральная система счисления, и были добавлены двоичные литералы.
PEP 3141: Иерархия типов для чисел. Модуль
numbers
- это еще одно новое применение Азбуки, определяющее «числовую башню» Python. Также обратите внимание на новый модульfractions
, который реализуетnumbers.Rational
.
Изменения в библиотеке¶
Из-за нехватки времени этот документ не содержит исчерпывающего описания очень значительных изменений в стандартной библиотеке. PEP 3108 это ссылка на основные изменения в библиотеке. Вот краткий обзор:
Многие старые модули были удалены. Некоторые из них, такие как
gopherlib
(больше не используются) иmd5
(заменены наhashlib
), уже были признаны устаревшими из-за PEP 4. Другие были удалены в результате прекращения поддержки различных платформ, таких как Irix, BeOS и Mac OS 9 (см. PEP 11). Некоторые модули также были выбраны для удаления в Python 3.0 из-за отсутствия использования или из-за того, что существует лучшая замена. Исчерпывающий перечень приведен в разделе PEP 3108.Пакет
bsddb3
был удален, поскольку его присутствие в стандартной библиотеке core со временем стало большой нагрузкой для разработчиков ядра из-за нестабильности тестирования и графика выпуска Berkeley DB. Однако пакет жив и здоров, поддерживается извне по адресу https://www.jcea.es/programacion/pybsddb.htm.Некоторые модули были переименованы из-за того, что их старое название не соответствовало PEP 8, или по другим причинам. Вот список:
Старое название
Новое имя
_винрег
winreg (выигрывать)
Анализатор конфигурации
анализатор конфигурации
копия_reg
авторское право
Очередь
очередь
Сокетсервер
сокетсервер
база разметки
_маркировочная база
повторение
повторная публикация
test.тест_поддержка
тест.поддержка
Распространенным шаблоном в Python 2.x является наличие одной версии модуля, реализованной на чистом Python, с дополнительной ускоренной версией, реализованной в виде расширения C; например,
pickle
иcPickle
. Это возлагает бремя импорта ускоренной версии и возврата к версии на чистом Python на каждого пользователя этих модулей. В Python 3.0 ускоренные версии рассматриваются как детали реализации версий на чистом Python. Пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python. Эта параpickle
/cPickle
прошла такое лечение. Модульprofile
включен в список для версии 3.1. МодульStringIO
был преобразован в класс в модулеio
.Некоторые связанные модули были сгруппированы в пакеты, и, как правило, названия подмодулей были упрощены. В результате появились новые пакеты:
dbm
(anydbm
,dbhash
,dbm
,dumbdbm
,gdbm
,whichdb
).html
(HTMLParser
,htmlentitydefs
).http
(httplib
,BaseHTTPServer
,CGIHTTPServer
,SimpleHTTPServer
,Cookie
,cookielib
).tkinter
(все модули, связанные сTkinter
, за исключениемturtle
). Целевой аудиторииturtle
на самом деле нет дела доtkinter
. Также обратите внимание, что начиная с версии Python 2.6 функциональностьturtle
была значительно расширена.urllib
(urllib
,urllib2
,urlparse
,robotparse
).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'
для символов Юникода.Очистка модуля
operator
: удаленыsequenceIncludes()
иisCallable()
.Очистка модуля
thread
:acquire_lock()
иrelease_lock()
удалены; вместо них используйтеacquire()
иrelease()
.Очистка модуля
random
: удаленjumpahead()
API.Модуль
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: Новый Подход К Форматированию Строк¶
Новая система для встроенных операций форматирования строк заменяет оператор форматирования строк
%
. (Однако оператор%
по-прежнему поддерживается; в Python 3.1 он будет признан устаревшим и позже удален из языка). Прочтите PEP 3101, чтобы получить полную информацию.
Изменения В Исключениях¶
Были очищены API-интерфейсы для создания и перехвата исключений и добавлены новые мощные функции:
PEP 352: Все исключения должны быть получены (прямо или косвенно) из
BaseException
. Это корень иерархии исключений. В качестве рекомендации это не ново, но требование наследования отBaseException
является новым. (Python 2.6 по-прежнему разрешал создание классических классов и не накладывал ограничений на то, что вы можете перехватывать.) Как следствие, строковые исключения, наконец, по-настоящему и бесповоротно мертвы.Почти все исключения на самом деле должны быть производными от
Exception
;BaseException
следует использовать только в качестве базового класса для исключений, которые должны обрабатываться только на верхнем уровне, таких какSystemExit
илиKeyboardInterrupt
. Рекомендуемая идиома для обработки всех исключений, за исключением этой последней категории, заключается в использованииexcept
Exception
.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 - это любое выражение, которое создает объект exception, возможно, исключение, которое было перехвачено ранее). В этом случае первичное исключение сохраняется в атрибуте
__cause__
вторичного исключения. Обратная трассировка, выводимая при возникновении необработанного исключения, проходит по цепочке атрибутов__cause__
и__context__
и выводит отдельную обратную трассировку для каждого компонента цепочки с основным исключением наверху. (Пользователи Java могут распознать такое поведение).PEP 3134: Объекты исключений теперь сохраняют свою обратную трассировку в виде атрибута
__traceback__
. Это означает, что объект exception теперь содержит всю информацию, относящуюся к исключению, и есть меньше причин использоватьsys.exc_info()
(хотя последнее не удаляется).Исправлено несколько сообщений об исключениях, когда Windows не удается загрузить модуль расширения. Например,
error code 193
теперь означает%1 is not a valid Win32 application
. Строки теперь обрабатываются неанглоязычными языками.
Прочие изменения¶
Операторы И Специальные Методы¶
!=
теперь возвращает значение, противоположное==
, если только==
не возвращает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()
. Теперь существует несколько различных типов потоков, которые open может возвращать в модулеio
.Удален
reduce()
. Используйтеfunctools.reduce()
, если вам это действительно нужно; однако в 99 процентах случаев явный циклfor
более удобочитаем.Удалено
reload()
. Используйтеimp.reload()
.Удаленный.
dict.has_key()
– вместо этого используйте операторin
.
Изменения в сборке и C API¶
Из-за нехватки времени, вот очень неполный список изменений в C API.
Была прекращена поддержка нескольких платформ, включая, помимо прочего, Mac OS 9, BeOS, RISC OS, Irix и Tru64.
PEP 3118: Новый API буфера.
PEP 3121: Инициализация и завершение работы модуля расширения.
PEP 3123: Приведение
PyObject_HEAD
в соответствие со стандартом C.Больше нет поддержки C API для ограниченного выполнения.
PyNumber_Coerce()
,PyNumber_CoerceEx()
,PyMember_Get()
иPyMember_Set()
C API-интерфейсы удалены.Новый C API: c:func:PyImport_ImportModuleNoBlock, работает как: c:func: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 — Автоматизированный перевод кода с Python 2 на 3) Запустите результат перевода на Python 3.0. Вручную исправьте все оставшиеся ошибки, устраняя неполадки до тех пор, пока все тесты не пройдут снова.
Не рекомендуется пытаться писать исходный код, который работает без изменений как на Python 2.6, так и на Python 3.0; вам придется использовать очень искаженный стиль кодирования, например, избегать операторов print
, метаклассов и многого другого. Если вы поддерживаете библиотеку, которая должна поддерживать как Python 2.6, так и Python 3.0, лучшим подходом будет изменить шаг 3, описанный выше, отредактировав версию исходного кода 2.6 и снова запустив транслятор 2to3
, вместо того, чтобы редактировать версию исходного кода 3.0.
Информацию о переносе расширений C на Python 3.0 смотрите в разделе Перенос модулей расширения на Python 3.