Текст, Unicode и 8-битные строки
Все, что вы знали о бинарных данных и Unicode, изменилось.
Python 3 использует понятия текста и (бинарных) данных вместо строк Unicode и 8-битных строк. Весь текст - Unicode; Однако кодированные Unicode строки представлены в виде двоичных данных. Тип , используемый для хранения текста является str, тип, используемый для хранения данных -bytes. Самое большое различие с python 2.x является то, что любая попытка комбинировать текст и данные в Python 3.0 поднимает TypeError, в то время как если бы вы смешивали Unicode и 8-битные строки в Python 2.x, это будет работать, если 8-битная строка содержала только 7-битные (ASCII) символы, но вы получите UnicodeDecodeError, если она содержит не-ASCII символы. Такое поведение вызывало многочисленные скорбные лица на протяжении многих лет.
Как следствие этого изменения в философии, значительная часть кода, который использует Unicode, кодировки или бинарные данные, скорее всего, должна измениться. Это изменения к лучшему, так как в python 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. Почти все функции, которые принимают bytes также принимают bytearray.
Все обратные косые черты в "сырых" строковых литералах интерпретируются буквально. Это означает, что "\U" и "\u" в сырых строках не рассматриваются особо. Например, r"\u20ac" это строка из 6 символов в Python 3.0, в то время как в 2.6, ur"\u20ac" был один символ "евро". (Конечно, это изменение влияет только на сырые строковые литералы).
Встроенный абстрактный тип basestring был удален. Используйте str вместо него. str и bytes не имеют достаточно общей функциональности, чтобы оправдать общий базовый класс. Инструмент 2to3 (см. ниже) заменяет каждое вхождение basestring на str.
PEP 3138: repr() для строки больше не экранирует символы, не входящие в набор ASCII. Однако, он по-прежнему экранирует управляющие символы
PEP 3120: Кодировка исходного кода по умолчанию теперь UTF-8.
PEP 3131: не-ASCII символы разрешены в идентификаторах. (Тем не менее, стандартная библиотека остается ASCII, за исключением имен авторов в комментариях.)
Модули StringIO и cStringIO удалены. Вместо этого, импортируйте модуль io и используйте io.StringIO или io.BytesIO для текста и данных соответственно.
Обзор изменений синтаксиса
Этот раздел дает краткий обзор каждого синтаксического изменения Python 3.0.
Новый синтаксис
PEP 3107: аннотации для аргументов функции и возвращаемых значений.
>>> def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):... pass>>> foo.__annotations__{'a': 'x', 'b': 11, 'c': <class 'list'>, 'return': 9}PEP 3102: Keyword-only аргументы.
PEP 3104: nonlocal. Переменная во внешней (но не глобальной) области видимости.
>>> def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) >>> outer()inner: 2outer: 1 >>> def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) >>> outer()inner: 2outer: 2PEP 3132: Extended Iterable Unpacking
>>> (a, *rest, b) = range(5)>>> a0>>> rest[1, 2, 3]>>> b4Генераторы словарей: {k: v for k, v in stuff} (то же самое, что и dict(stuff))
Литералы множеств (например, {1, 2}). Заметьте, что {} - это пустой словарь. Используйте set() для пустых множеств. Генераторы множеств: {x for x in stuff}
Новые восьмеричные литералы, например 0o720, вместо старых (0720).
Новые двоичные литералы, например 0b1010. Новая встроенная функция, bin().
Изменённый синтаксис
PEP 3109 and PEP 3134: новый синтаксис выражения raise: raise [expr [from expr]].
"as" и "with" зарезервированные слова.
"True" и "False" и "None" - зарезервированные слова.
Изменено "except exc, var" на "except exc as var".
PEP 3115: Новый синтаксис для метаклассов. Вместо:
class C: __metaclass__ = M ...Вы должны использовать:
class C(metaclass=M): ...Переменная __metaclass__ более не поддерживается.
Генераторы списков больше не поддерживают синтаксическую форму [... for var in item1, item2, ...]. Используйте [... for var in (item1, item2, ...)].
Удаленный синтаксис
PEP 3113: распаковка кортежей в параметрах удалена. Вы больше не можете писать
def foo(a, (b, c)): ...Пишите
def foo(a, b_c): b, c = b_c ...Удалены обратные кавычки (backtick). Используйте repr().
Удалено <>. Используйте !=.
exec - функция. Перестала быть зарезервированным словом.
from module import * запрещено использовать внутри функций.
Встроенные функции
PEP 3135: Новый super(). Теперь вы можете вызывать super() без аргументов и (при условии, что это метод экземпляра, определенный внутри определении класса) класс и экземпляр будут автоматически выбраны. С аргументами, поведение super() остается без изменений.
PEP 3111: raw_input() переименован в input(). Вместо input() в Python 2, вы можете использовать eval(input()).
Добавлена функция next(), вызывающая метод __next__() объекта.
Перемещен intern() в sys.intern().
Удалено: apply(). Вместо apply(f, args) используйте f(*args).
Удалено: callable(). Вместо callable(f) используйте hasattr(f, "__call__"). Функция operator.isCallable() также удалена.
Удалено: coerce().
Удалено: execfile(). Вместо execfile(fn) используйте exec(open(fn).read()).
Удалено: file. Используйте open().
Перемещено: reduce() в functools.reduce()
Перемещено: reload() в imp.reload().
Удалено: dict.has_key(). Используйте оператор in.