Вышла первая альфа Python 3.0
Итак, свершилось. В доказательство тому, что Python 3 не превратится в безнадежный долгострой на манер Perl 6 вышла первая альфа. Вместо разработки новой версии с нуля (и как следствие неизбежного попадания в ловушку «эффекта второй системы»), было решено прежде всего очистить язык от накопившихся за долгие годы разнообразных компромисов, обусловленных необходимостью нести бремя обратной совместимости, и ограничиться относительно небольшим колличеством нововеденний.
Рассмотрим основные изменения.
Строки
- Полностью переделана работа со строками. Теперь есть два типа данных — строки (str) и байты (bytes). Строки подобны типу данных unicode из Python 2.x (т.е. все строки теперь юникодные!). Байты хранят двоичные данные (текст в какой-либо кодировке, который обрабатывается как двоичные данные, пока вы не решите декодировать его). Строки и байты нельзя смешивать, вы всегда должны явно преобразовывать их, используя методы .encode() (str -> bytes) или .decode() (bytes -> str).
- Вместо оператора % у строк появился метод format:
"The story of {0}, {1}, and {c}".format(a, b, c=d)
Каждый аргуммент функции format получает порядковый номер начиная с нуля, так в данном примере — ’a’ это аргумент 0, ’b’ - агрумент 1. Именные аргументы идентифицируются по имени. Функция включает в себя возможности выравнивания текста, работу с различными типами данных и проч.Несколько примеров использования:"My name is {<a href="http://0.name" target="_blank">0.name</a>}".format(file('out.txt'))
"My name is {0[name]}".format(dict(name='Fred'))"
"Today is: {0:a b d H:M:S Y}".format(datetime.now())
Предствлен класс Formatter, который позволяет легко создавать свои версии функции format. Например, можно сделать вариант format, котрый получает доступ непсоредственно к переменным из заданной области видимости:fmt = NamespaceFormatter(globals()) greeting = "hello" print(fmt("{greeting}, world!"))
- Кодировка исходного кода по-умолчанию теперь UTF-8.
- Модули StringIO и cStringIO удалены. Вместо них следуют использовать StringIO или BytesIO из модуля io.
Исключения
- Исключения должны наследоваться от BaseException. StandardException удален.
- Вместо except E, e: теперь следует использовать except E as e:, а вместо raise Exception, args — raise Exception(args)
Классы
- Наконец-то в языке остался лишь один вид классов. «Классические» классы удалены.
- Новый синтаксис для метаклассов. Теперь метакласс указывается через аргумент в списке базовых классов: class Foo(base1, base2, metaclass=mymeta): вместо прежнего указания в теле класса __metaclass__ = mymeta
- Появились декораторы для классов.
Различные изменения
- Добавлены аннотации функций.
- Новые возможности распаковки последовательностей. Теперь можно делать так: a, b, *rest = some_sequence и даже так *rest, a = stuff. rest всегда список; правая часть выражения обязательно должна быть итерабельна.
- При делении целых теперь получается вещественное число. Для получения целого используйте 3//2.
- Удален оператор <>. Используйте вместо него !=.
- long переименован в int. Теперь есть только один встроеный тип для целых — int.
- Добавлено ключевое слово nonlocal для доступа к пременным во внешней (не глобальной) области видимости. (Привет полноценные замыкания? ;) )
- print теперь функциия, а не ключевое слово.
- Функция xrange() переименована в range().
- Функции zip(), map() и filter() возвращают итераторы.
- Удалены следующие функции: apply(), callable(), coerce(), execfile(), file(), reduce(), reload().
- Удален метод dict.has_key() (используйте вместо него k in dict)
Ссылки:
Список измененийУтилита для упрощения перевода кода со второй версии на третью
25 комментариев
Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.