3.0.md
1> **Источник:** https://python-all.ru/3.11/whatsnew/3.0.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.089**Автор:**1011Guido van Rossum1213В этой статье описываются новые возможности Python 3.0 по сравнению с 2.6. Python 3.0, также известный как «Python 3000» или «Py3K», стал первым *намеренно несовместимым с предыдущими версиями* релизом Python. Он вышел 3 декабря 2008 года. Изменений больше, чем в обычном релизе, и многие из них важны для всех пользователей Python. Тем не менее, вникнув в изменения, вы заметите, что Python не так уж сильно изменился – в основном мы исправляем известные раздражающие моменты и недочёты и убираем много старого хлама.1415Эта статья не ставит целью дать полную спецификацию всех новых возможностей, а скорее предоставляет удобный обзор. За полными подробностями следует обращаться к документации Python 3.0 и/или к многочисленным PEP, упомянутым в тексте. Чтобы понять все детали реализации и обоснование конкретной возможности, в PEP обычно содержится больше сведений, чем в обычной документации; но учтите, что после полной реализации возможности PEP, как правило, не обновляются.1617Из-за ограничений по времени этот документ не так полон, как должен был бы быть. Как и всегда для нового релиза, файл `Misc/NEWS` в дистрибутиве исходного кода содержит множество подробностей обо всех, даже самых мелких изменениях.1819## Типичные проблемы2021В этом разделе перечислены те немногие изменения, которые с наибольшей вероятностью вызовут затруднения у тех, кто привык к Python 2.5.2223### Print – функция2425Оператор `print` заменён функцией [`print()`](https://python-all.ru/3.11/library/functions.html#print), которая принимает именованные аргументы, заменяющие большую часть специального синтаксиса старого оператора `print` ([**PEP 3105**](https://python-all.ru/3.11/whatsnew/3.0.html)). Примеры:2627```python28Old: print "The answer is", 2*229New: print("The answer is", 2*2)3031Old: print x, # Завершающая запятая подавляет перевод строки32New: print(x, end=" ") # Добавляет пробел вместо перевода строки3334Old: print # Выводит перевод строки35New: print() # Необходимо вызвать функцию!3637Old: print >>sys.stderr, "fatal error"38New: print("fatal error", file=sys.stderr)3940Old: print (x, y) # выводит repr((x, y))41New: print((x, y)) # Не то же самое, что print(x, y)!42```4344Также можно настроить разделитель между элементами, например:4546```python47print("There are <", 2**32, "> possibilities!", sep="")48```4950что выводит:5152```text53There are <4294967296> possibilities!54```5556Примечание:5758- Функция [`print()`](https://python-all.ru/3.11/library/functions.html#print) не поддерживает возможность «softspace» старого оператора `print`. Например, в Python 2.x конструкция `print "A\n", "B"` записывала `"A\nB\n"`; а в Python 3.0 конструкция `print("A\n", "B")` записывает `"A\n B\n"`.59- Поначалу вы будете часто вводить старый `print x` в интерактивном режиме. Пора переучить пальцы набирать вместо него `print(x)`!60- При использовании инструмента преобразования исходного кода `2to3` все операторы `print` автоматически преобразуются в вызовы функции [`print()`](https://python-all.ru/3.11/library/functions.html#print), так что для крупных проектов это, как правило, не проблема.6162### Представления и итераторы вместо списков6364Некоторые известные API больше не возвращают списки:6566- Методы [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict), [`dict.keys()`](https://python-all.ru/3.11/library/stdtypes.html#dict.keys), [`dict.items()`](https://python-all.ru/3.11/library/stdtypes.html#dict.items) и [`dict.values()`](https://python-all.ru/3.11/library/stdtypes.html#dict.values) возвращают «представления» вместо списков. Например, следующий код больше не работает: `k = d.keys(); k.sort()`. Используйте `k = sorted(d)` вместо него (это работает и в Python 2.5, и так же эффективно).67- Кроме того, методы `dict.iterkeys()`, `dict.iteritems()` и `dict.itervalues()` больше не поддерживаются.68- [`map()`](https://python-all.ru/3.11/library/functions.html#map) и [`filter()`](https://python-all.ru/3.11/library/functions.html#filter) возвращают итераторы. Если действительно нужен список и входные последовательности имеют одинаковую длину, быстрым решением будет обернуть [`map()`](https://python-all.ru/3.11/library/functions.html#map) в [`list()`](https://python-all.ru/3.11/library/stdtypes.html#list), например `list(map(...))`, но лучшим решением часто является использование спискового включения (особенно если исходный код использует [`lambda`](https://python-all.ru/3.11/reference/expressions.html#lambda)) или переписывание кода так, чтобы список вообще не требовался. Особенно коварным является [`map()`](https://python-all.ru/3.11/library/functions.html#map), вызываемый ради побочных эффектов функции; правильное преобразование – использовать обычный цикл [`for`](https://python-all.ru/3.11/reference/compound_stmts.html#for) (поскольку создание списка было бы расточительным).6970 Если входные последовательности имеют разную длину, [`map()`](https://python-all.ru/3.11/library/functions.html#map) остановится при завершении самой короткой из них. Для полной совместимости с [`map()`](https://python-all.ru/3.11/library/functions.html#map) из Python 2.x также оберните последовательности в [`itertools.zip_longest()`](https://python-all.ru/3.11/library/itertools.html#itertools.zip_longest), например `map(func, *sequences)` становится `list(map(func, itertools.zip_longest(*sequences)))`.71- [`range()`](https://python-all.ru/3.11/library/stdtypes.html#range) теперь ведёт себя так, как раньше вела себя `xrange()`, за исключением того, что работает со значениями произвольного размера. Последний больше не существует.72- [`zip()`](https://python-all.ru/3.11/library/functions.html#zip) теперь возвращает итератор.7374### Сравнения на упорядочивание7576Python 3.0 упростил правила для сравнений на упорядочивание:7778- Операторы сравнения на упорядочивание (`<`, `<=`, `>=`, `>`) вызывают исключение TypeError, если операнды не имеют осмысленного естественного порядка. Таким образом, выражения вроде `1 < ''`, `0 > None` или `len <= len` больше не допустимы, и, например, `None < None` вызывает [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError) вместо возврата `False`. Следствием является то, что сортировка гетерогенного списка больше не имеет смысла – все элементы должны быть сравнимы друг с другом. Обратите внимание, что это не относится к операторам `==` и `!=`: объекты разных несравнимых типов всегда считаются неравными друг другу.79- `builtin.sorted()` и [`list.sort()`](https://python-all.ru/3.11/library/stdtypes.html#list.sort) больше не принимают аргумент *cmp*, задающий функцию сравнения. Вместо него используйте аргумент *key*. Примечание: аргументы *key* и *reverse* теперь являются только ключевыми (keyword-only).80- Функция `cmp()` должна считаться исчезнувшей, а специальный метод `__cmp__()` больше не поддерживается. Используйте `__lt__()` для сортировки, `__eq__()` с `__hash__()` и другие расширенные сравнения по необходимости. (Если действительно нужна функциональность `cmp()`, можно использовать выражение `(a > b) - (a < b)` как эквивалент `cmp(a, b)`.)8182### Целые числа8384- [**PEP 237**](https://python-all.ru/3.11/whatsnew/3.0.html): По сути, `long` переименован в [`int`](https://python-all.ru/3.11/library/functions.html#int). То есть существует только один встроенный целочисленный тип с именем [`int`](https://python-all.ru/3.11/library/functions.html#int), но в основном он ведёт себя как старый тип `long`.85- [**PEP 238**](https://python-all.ru/3.11/whatsnew/3.0.html): Выражение вида `1/2` возвращает число с плавающей запятой. Используйте `1//2` для получения усекающего поведения. (Последний синтаксис существует уже много лет, по крайней мере начиная с Python 2.2.)86- Константа `sys.maxint` была удалена, поскольку больше нет ограничения на значение целых чисел. Однако [`sys.maxsize`](https://python-all.ru/3.11/library/sys.html#sys.maxsize) может использоваться как целое число, большее любого практического индекса списка или строки. Оно соответствует «естественному» размеру целого числа в реализации и обычно совпадает с `sys.maxint` в предыдущих версиях на той же платформе (при тех же параметрах сборки).87- [`repr()`](https://python-all.ru/3.11/library/functions.html#repr) длинного целого больше не включает завершающий `L`, поэтому код, который безусловно удаляет этот символ, вместо этого отсечёт последнюю цифру. (Используйте [`str()`](https://python-all.ru/3.11/library/stdtypes.html#str).)88- Восьмеричные литералы больше не имеют форму `0720`; используйте `0o720` вместо этого.8990### Текст и данные вместо Unicode и 8-битных строк9192Всё, что вы знали о двоичных данных и Unicode, изменилось.9394- Python 3.0 использует понятия *текста* и (двоичных) *данных* вместо строк Unicode и 8-битных строк. Весь текст – это Unicode; однако *закодированный* Unicode представляется в виде двоичных данных. Типом для хранения текста является [`str`](https://python-all.ru/3.11/library/stdtypes.html#str), типом для хранения данных – [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes). Самое большое отличие от ситуации в 2.x заключается в том, что любая попытка смешать текст и данные в Python 3.0 приводит к [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError), тогда как при смешивании Unicode и 8-битных строк в Python 2.x код работал, если 8-битная строка содержала только 7-битные (ASCII) байты, но возникало [`UnicodeDecodeError`](https://python-all.ru/3.11/library/exceptions.html#UnicodeDecodeError), если в ней были не-ASCII значения. Такое поведение, зависящее от значения, вызывало множество огорчений на протяжении многих лет.95- Как следствие этого изменения в философии, практически весь код, работающий с Unicode, кодировками или двоичными данными, скорее всего, придётся изменить. Это изменение к лучшему, так как в мире 2.x было множество ошибок, связанных со смешиванием закодированного и незакодированного текста. Чтобы подготовиться в Python 2.x, начните использовать `unicode` для всего незакодированного текста, а [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) – только для двоичных или закодированных данных. Тогда инструмент `2to3` сделает большую часть работы за вас.96- Больше нельзя использовать литералы `u"..."` для текста Unicode. Однако для двоичных данных необходимо использовать литералы `b"..."`.97- Поскольку типы [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) и [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) нельзя смешивать, необходимо всегда явно преобразовывать их друг в друга. Используйте [`str.encode()`](https://python-all.ru/3.11/library/stdtypes.html#str.encode) для перехода от [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) к [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) и [`bytes.decode()`](https://python-all.ru/3.11/library/stdtypes.html#bytes.decode) для перехода от [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) к [`str`](https://python-all.ru/3.11/library/stdtypes.html#str). Можно также использовать `bytes(s, encoding=...)` и `str(b, encoding=...)` соответственно.98- Как и [`str`](https://python-all.ru/3.11/library/stdtypes.html#str), тип [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) является неизменяемым. Существует отдельный *изменяемый* тип для хранения буферизованных двоичных данных – [`bytearray`](https://python-all.ru/3.11/library/stdtypes.html#bytearray). Почти все API, принимающие [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes), также принимают [`bytearray`](https://python-all.ru/3.11/library/stdtypes.html#bytearray). Изменяемый API основан на `collections.MutableSequence`.99- Все обратные слеши в сырых строковых литералах интерпретируются буквально. Это означает, что последовательности `'\U'` и `'\u'` в сырых строках не обрабатываются особым образом. Например, `r'\u20ac'` в Python 3.0 – это строка из 6 символов, тогда как в 2.6 `ur'\u20ac'` был одним символом «евро». (Разумеется, это изменение затрагивает только сырые строковые литералы; символ евро в Python 3.0 – это `'\u20ac'`.)100- Встроенный абстрактный тип `basestring` был удалён. Используйте [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) вместо него. Типы [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) и [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) не имеют достаточной общности функциональности, чтобы оправдать общий базовый класс. Инструмент `2to3` (см. ниже) заменяет каждое вхождение `basestring` на [`str`](https://python-all.ru/3.11/library/stdtypes.html#str).101- Файлы, открытые как текстовые (по-прежнему режим по умолчанию для [`open()`](https://python-all.ru/3.11/library/functions.html#open)), всегда используют кодировку для преобразования между строками (в памяти) и байтами (на диске). Двоичные файлы (открытые с `b` в аргументе режима) всегда используют байты в памяти. Это означает, что если файл открыт с неправильным режимом или кодировкой, ввод-вывод, скорее всего, приведёт к явной ошибке, а не к незаметному получению некорректных данных. Это также означает, что даже пользователи Unix должны указывать правильный режим (текстовый или двоичный) при открытии файла. Существует зависимая от платформы кодировка по умолчанию, которая на Unix-подобных платформах может быть задана с помощью переменной окружения `LANG` (а иногда и с помощью некоторых других платформозависимых переменных, связанных с локалью). Во многих случаях, но не во всех, системная кодировка по умолчанию – UTF-8; на неё никогда не следует полагаться. Любое приложение, читающее или записывающее нечто большее, чем чистый ASCII-текст, вероятно, должно иметь способ переопределить кодировку. Больше нет необходимости использовать потоки, поддерживающие кодировку, из модуля [`codecs`](https://python-all.ru/3.11/library/codecs.html#module-codecs).102- Начальные значения [`sys.stdin`](https://python-all.ru/3.11/library/sys.html#sys.stdin), [`sys.stdout`](https://python-all.ru/3.11/library/sys.html#sys.stdout) и [`sys.stderr`](https://python-all.ru/3.11/library/sys.html#sys.stderr) теперь являются текстовыми файлами, предназначенными только для Unicode (т.е. они являются экземплярами [`io.TextIOBase`](https://python-all.ru/3.11/library/io.html#io.TextIOBase)). Для чтения и записи байтовых данных с помощью этих потоков необходимо использовать их атрибут [`io.TextIOBase.buffer`](https://python-all.ru/3.11/library/io.html#io.TextIOBase.buffer).103- Имена файлов передаются в API и возвращаются из них в виде строк (Unicode). Это может вызывать платформозависимые проблемы, поскольку на некоторых платформах имена файлов представляют собой произвольные байтовые строки. (С другой стороны, в Windows имена файлов изначально хранятся как Unicode.) В качестве обходного решения большинство API (например, [`open()`](https://python-all.ru/3.11/library/functions.html#open) и многие функции в модуле [`os`](https://python-all.ru/3.11/library/os.html#module-os)), принимающие имена файлов, принимают как объекты [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes), так и строки, а несколько API имеют способ запросить возвращаемое значение типа [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes). Таким образом, [`os.listdir()`](https://python-all.ru/3.11/library/os.html#os.listdir) возвращает список экземпляров [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes), если аргумент является экземпляром [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes), а [`os.getcwdb()`](https://python-all.ru/3.11/library/os.html#os.getcwdb) возвращает текущую рабочую директорию в виде экземпляра [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes). Обратите внимание, что когда [`os.listdir()`](https://python-all.ru/3.11/library/os.html#os.listdir) возвращает список строк, имена файлов, которые не могут быть корректно декодированы, опускаются, а не вызывают [`UnicodeError`](https://python-all.ru/3.11/library/exceptions.html#UnicodeError).104- Некоторые системные API, такие как [`os.environ`](https://python-all.ru/3.11/library/os.html#os.environ) и [`sys.argv`](https://python-all.ru/3.11/library/sys.html#sys.argv), также могут вызывать проблемы, если байты, предоставленные системой, не интерпретируются с использованием кодировки по умолчанию. Установка переменной `LANG` и повторный запуск программы, вероятно, является лучшим подходом.105- [**PEP 3138**](https://python-all.ru/3.11/whatsnew/3.0.html): [`repr()`](https://python-all.ru/3.11/library/functions.html#repr) строки больше не экранирует не-ASCII символы. Однако он по-прежнему экранирует управляющие символы и кодовые точки, имеющие статус непечатаемых в стандарте Unicode.106- [**PEP 3120**](https://python-all.ru/3.11/whatsnew/3.0.html): Теперь кодировка исходного кода по умолчанию – UTF-8.107- [**PEP 3131**](https://python-all.ru/3.11/whatsnew/3.0.html): Теперь в идентификаторах допускаются не-ASCII буквы. (Однако стандартная библиотека остаётся ASCII-only, за исключением имён участников в комментариях.)108- Модули `StringIO` и `cStringIO` удалены. Вместо этого импортируйте модуль [`io`](https://python-all.ru/3.11/library/io.html#module-io) и используйте [`io.StringIO`](https://python-all.ru/3.11/library/io.html#io.StringIO) или [`io.BytesIO`](https://python-all.ru/3.11/library/io.html#io.BytesIO) для текста и данных соответственно.109- См. также [Unicode HOWTO](https://python-all.ru/3.11/howto/unicode.html#unicode-howto), который был обновлён для Python 3.0.110111## Обзор синтаксических изменений112113В этом разделе даётся краткий обзор всех *синтаксических* изменений в Python 3.0.114115### Новый синтаксис116117- [**PEP 3107**](https://python-all.ru/3.11/whatsnew/3.0.html): аннотации аргументов и возвращаемых значений функций. Это предоставляет стандартизированный способ аннотирования параметров функции и возвращаемого значения. Никакой семантики к таким аннотациям не привязывается, кроме того, что они могут быть проанализированы во время выполнения с помощью атрибута `__annotations__`. Цель – стимулировать эксперименты с помощью метаклассов, декораторов или фреймворков.118- [**PEP 3102**](https://python-all.ru/3.11/whatsnew/3.0.html): Аргументы только по ключевому слову. Именованные параметры, следующие после `*args` в списке параметров, *должны* указываться с помощью синтаксиса ключевых слов в вызове. Можно также использовать голый `*` в списке параметров, чтобы указать, что вы не принимаете список аргументов переменной длины, но у вас есть аргументы только по ключевому слову.119- Ключевые аргументы допускаются после списка базовых классов в определении класса. Это используется в новом соглашении для указания метакласса (см. следующий раздел), но может использоваться и для других целей, при условии, что метакласс это поддерживает.120- [**PEP 3104**](https://python-all.ru/3.11/whatsnew/3.0.html): Оператор [`nonlocal`](https://python-all.ru/3.11/reference/simple_stmts.html#nonlocal). С помощью `nonlocal x` теперь можно напрямую присваивать значение переменной во внешней (но не глобальной) области видимости. `nonlocal` – новое зарезервированное слово.121- [**PEP 3132**](https://python-all.ru/3.11/whatsnew/3.0.html): Расширенная распаковка итерируемых объектов. Теперь можно писать конструкции вида `a, b, *rest = some_sequence`. И даже `*rest, a = stuff`. Объект `rest` всегда является (возможно пустым) списком; правая часть может быть любым итерируемым объектом. Пример:122123 ```python124 (a, *rest, b) = range(5)125 ```126127 Это устанавливает *a* в `0`, *b* в `4`, а *rest* в `[1, 2, 3]`.128- Словарные включения: `{k: v for k, v in stuff}` означает то же самое, что и `dict(stuff)`, но является более гибким. (Это [**PEP 274**](https://python-all.ru/3.11/whatsnew/3.0.html) наконец-то получил признание. :-)129- Литералы множеств, например `{1, 2}`. Обратите внимание, что `{}` – это пустой словарь; используйте `set()` для пустого множества. Генераторы множеств также поддерживаются; например, `{x for x in stuff}` означает то же самое, что и `set(stuff)`, но является более гибким.130- Новые восьмеричные литералы, например `0o720` (уже в 2.6). Старые восьмеричные литералы (`0720`) удалены.131- Новые двоичные литералы, например `0b1010` (уже в 2.6), и появилась соответствующая встроенная функция [`bin()`](https://python-all.ru/3.11/library/functions.html#bin).132- Литералы байтов вводятся с префиксом `b` или `B`, и появилась соответствующая встроенная функция [`bytes()`](https://python-all.ru/3.11/library/stdtypes.html#bytes).133134### Изменённый синтаксис135136- [**PEP 3109**](https://python-all.ru/3.11/whatsnew/3.0.html) и [**PEP 3134**](https://python-all.ru/3.11/whatsnew/3.0.html): новый синтаксис оператора [`raise`](https://python-all.ru/3.11/reference/simple_stmts.html#raise): `raise [expr [from expr]]`. См. ниже.137- `as` и [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with) теперь являются зарезервированными словами. (На самом деле начиная с 2.6.)138- `True`, `False` и `None` – зарезервированные слова. (В 2.6 ограничения для `None` уже частично применялись.)139- Изменение с [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except) *exc*, *var* на `except` *exc* `as` *var*. См. [**PEP 3110**](https://python-all.ru/3.11/whatsnew/3.0.html).140- [**PEP 3115**](https://python-all.ru/3.11/whatsnew/3.0.html): Новый синтаксис метаклассов. Вместо:141142 ```python143 class C:144 __metaclass__ = M145 ...146 ```147148 теперь необходимо использовать:149150 ```python151 class C(metaclass=M):152 ...153 ```154155 Модульная глобальная переменная `__metaclass__` больше не поддерживается. (Это был костыль, чтобы упростить использование новых классов по умолчанию без наследования каждого класса от [`object`](https://python-all.ru/3.11/library/functions.html#object).)156- Генераторы списков больше не поддерживают синтаксическую форму `[... for var in item1, item2, ...]`. Используйте `[... for var in (item1, item2, ...)]` вместо этого. Также обратите внимание, что у генераторов списков другая семантика: они ближе к синтаксическому сахару для выражения-генератора внутри конструктора [`list()`](https://python-all.ru/3.11/library/stdtypes.html#list), и, в частности, переменные цикла больше не просачиваются в окружающую область видимости.157- *Многоточие* (`...`) теперь можно использовать как атомарное выражение в любом месте. (Раньше оно допускалось только в срезах.) Кроме того, теперь его *необходимо* писать как `...`. (Раньше его можно было писать как `. . .`, просто из-за случайности грамматики.)158159### Удалённый синтаксис160161- [**PEP 3113**](https://python-all.ru/3.11/whatsnew/3.0.html): Распаковка параметров-кортежей удалена. Больше нельзя писать `def foo(a, (b, c)): ...`. Используйте `def foo(a, b_c): b, c = b_c` вместо этого.162- Удалены обратные кавычки (используйте [`repr()`](https://python-all.ru/3.11/library/functions.html#repr) вместо них).163- Удалено `<>` (используйте `!=` вместо этого).164- Удалено ключевое слово: [`exec()`](https://python-all.ru/3.11/library/functions.html#exec) больше не является ключевым словом; оно остаётся как функция. (К счастью, синтаксис функции также принимался в 2.x.) Также обратите внимание, что [`exec()`](https://python-all.ru/3.11/library/functions.html#exec) больше не принимает аргумент-поток; вместо `exec(f)` можно использовать `exec(f.read())`.165- Целочисленные литералы больше не поддерживают завершающие `l` или `L`.166- Строковые литералы больше не поддерживают начальные `u` или `U`.167- Синтаксис [`from`](https://python-all.ru/3.11/reference/simple_stmts.html#from) *module* [`import`](https://python-all.ru/3.11/reference/simple_stmts.html#import) `*` разрешён только на уровне модуля, больше не внутри функций.168- Единственный допустимый синтаксис для относительных импортов – это `from .[module] import name`. Все формы [`import`](https://python-all.ru/3.11/reference/simple_stmts.html#import), не начинающиеся с `.`, интерпретируются как абсолютные импорты. ([**PEP 328**](https://python-all.ru/3.11/whatsnew/3.0.html))169- Классические классы удалены.170171## Изменения, уже присутствовавшие в Python 2.6172173Поскольку многие пользователи, вероятно, переходят напрямую с Python 2.5 на Python 3.0, этот раздел напоминает о новых возможностях, которые изначально были разработаны для Python 3.0, но были перенесены в Python 2.6. Для более подробных описаний следует обращаться к соответствующим разделам в [Что нового в Python 2.6](https://python-all.ru/3.11/whatsnew/2.6.html#whats-new-in-2-6).174175- [PEP 343: Оператор 'with'](https://python-all.ru/3.11/whatsnew/2.6.html#pep-0343). Оператор [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with) теперь является стандартной возможностью и больше не требует импорта из [`__future__`](https://python-all.ru/3.11/library/__future__.html#module-__future__). Также обратите внимание на [Написание контекстных менеджеров](https://python-all.ru/3.11/whatsnew/2.6.html#new-26-context-managers) и [Модуль contextlib](https://python-all.ru/3.11/whatsnew/2.6.html#new-module-contextlib).176- [PEP 366: Явные относительные импорты из основного модуля](https://python-all.ru/3.11/whatsnew/2.6.html#pep-0366). Это повышает полезность опции [`-m`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-m), когда импортируемый модуль находится в пакете.177- [PEP 370: Каталог site-packages для каждого пользователя](https://python-all.ru/3.11/whatsnew/2.6.html#pep-0370).178- [PEP 371: Пакет multiprocessing](https://python-all.ru/3.11/whatsnew/2.6.html#pep-0371).179- [PEP 3101: Расширенное форматирование строк](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3101). Примечание: в описании для 2.6 упоминается метод [`format()`](https://python-all.ru/3.11/library/functions.html#format) как для 8-битных, так и для Unicode-строк. В 3.0 только тип [`str`](https://python-all.ru/3.11/library/stdtypes.html#str) (текстовые строки с поддержкой Unicode) поддерживает этот метод; тип [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes) – нет. Планируется со временем сделать это единственным API для форматирования строк и начать устаревание оператора `%` в Python 3.1.180- [PEP 3105: print как функция](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3105). Теперь это стандартная возможность и больше не требует импорта из [`__future__`](https://python-all.ru/3.11/library/__future__.html#module-__future__). Более подробно было описано выше.181- [PEP 3110: Изменения в обработке исключений](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3110). Синтаксис [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except) *exc* `as` *var* теперь стал стандартным, а `except` *exc*, *var* больше не поддерживается. (Конечно, часть `as` *var* по-прежнему необязательна.)182- [PEP 3112: Байтовые литералы](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3112). Обозначение строкового литерала `b"..."` (и его варианты, такие как `b'...'`, `b"""..."""` и `br"..."`) теперь создаёт литерал типа [`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes).183- [PEP 3116: Новая библиотека ввода-вывода](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3116). Модуль [`io`](https://python-all.ru/3.11/library/io.html#module-io) теперь является стандартным способом выполнения файлового ввода-вывода. Встроенная функция [`open()`](https://python-all.ru/3.11/library/functions.html#open) теперь является псевдонимом для [`io.open()`](https://python-all.ru/3.11/library/io.html#io.open) и имеет дополнительные именованные аргументы *encoding*, *errors*, *newline* и *closefd*. Также обратите внимание, что недопустимый аргумент *mode* теперь вызывает [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), а не [`IOError`](https://python-all.ru/3.11/library/exceptions.html#IOError). Двоичный файловый объект, лежащий в основе текстового файлового объекта, доступен как `f.buffer` (но учтите, что текстовый объект хранит собственный буфер для ускорения операций кодирования и декодирования).184- [PEP 3118: Пересмотренный буферный протокол](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3118). Старая встроенная функция `buffer()` теперь окончательно удалена; новая встроенная функция [`memoryview()`](https://python-all.ru/3.11/library/stdtypes.html#memoryview) предоставляет (в основном) аналогичную функциональность.185- [PEP 3119: Абстрактные базовые классы](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3119). Модуль [`abc`](https://python-all.ru/3.11/library/abc.html#module-abc) и ABC, определённые в модуле [`collections`](https://python-all.ru/3.11/library/collections.html#module-collections), теперь играют более заметную роль в языке, а встроенные типы коллекций, такие как [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict) и [`list`](https://python-all.ru/3.11/library/stdtypes.html#list), соответствуют ABC `collections.MutableMapping` и `collections.MutableSequence` соответственно.186- [PEP 3127: Поддержка и синтаксис целочисленных литералов](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3127). Как упоминалось выше, новая нотация восьмеричных литералов является единственной поддерживаемой, а также были добавлены двоичные литералы.187- [PEP 3129: Декораторы классов](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3129).188- [PEP 3141: Иерархия типов для чисел](https://python-all.ru/3.11/whatsnew/2.6.html#pep-3141). Модуль [`numbers`](https://python-all.ru/3.11/library/numbers.html#module-numbers) является ещё одним новым применением ABC, определяющим «числовую башню» Python. Также обратите внимание на новый модуль [`fractions`](https://python-all.ru/3.11/library/fractions.html#module-fractions), который реализует [`numbers.Rational`](https://python-all.ru/3.11/library/numbers.html#numbers.Rational).189190## Изменения в библиотеке191192Из-за нехватки времени этот документ не охватывает все обширные изменения в стандартной библиотеке. [**PEP 3108**](https://python-all.ru/3.11/whatsnew/3.0.html) является справочником по основным изменениям в библиотеке. Вот краткий обзор:193194- Многие старые модули были удалены. Некоторые, такие как `gopherlib` (больше не используется) и `md5` (заменён на [`hashlib`](https://python-all.ru/3.11/library/hashlib.html#module-hashlib)), уже были объявлены устаревшими [**PEP 4**](https://python-all.ru/3.11/whatsnew/3.0.html). Другие были удалены в результате прекращения поддержки различных платформ, таких как Irix, BeOS и Mac OS 9 (см. [**PEP 11**](https://python-all.ru/3.11/whatsnew/3.0.html)). Некоторые модули также были выбраны для удаления в Python 3.0 из-за отсутствия использования или наличия лучшей замены. Полный список см. в [**PEP 3108**](https://python-all.ru/3.11/whatsnew/3.0.html).195- Пакет `bsddb3` был удалён, потому что его присутствие в основной стандартной библиотеке со временем оказалось особо обременительным для основных разработчиков из-за нестабильности тестирования и графика выпуска Berkeley DB. Однако пакет жив и здоров, он поддерживается внешне по адресу [https://www.jcea.es/programacion/pybsddb.htm](https://python-all.ru/3.11/whatsnew/3.0.html).196- Некоторые модули были переименованы, потому что их старые названия нарушали [**PEP 8**](https://python-all.ru/3.11/whatsnew/3.0.html) или по другим причинам. Вот список:197198 | Старое имя | Новое название |199 | --- | --- |200 | \_winreg | winreg |201 | ConfigParser | configparser |202 | copy\_reg | copyreg |203 | очередь | очередь |204 | SocketServer | socketserver |205 | markupbase | \_markupbase |206 | repr | reprlib |207 | test.test\_support | test.support |208- В Python 2.x распространённой практикой было иметь одну версию модуля, реализованную на чистом Python, и опциональную ускоренную версию, реализованную как C-расширение; например, [`pickle`](https://python-all.ru/3.11/library/pickle.html#module-pickle) и `cPickle`. Это возлагало на каждого пользователя этих модулей бремя импорта ускоренной версии и отката к чистой Python-версии. В Python 3.0 ускоренные версии считаются деталями реализации чистых Python-версий. Пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и, в случае неудачи, использует чистую Python-версию. Пара [`pickle`](https://python-all.ru/3.11/library/pickle.html#module-pickle) / `cPickle` была обработана таким образом. Модуль [`profile`](https://python-all.ru/3.11/library/profile.html#module-profile) находится в списке на 3.1. Модуль `StringIO` был преобразован в класс в модуле [`io`](https://python-all.ru/3.11/library/io.html#module-io).209- Некоторые связанные модули были сгруппированы в пакеты, и обычно имена подмодулей были упрощены. Получившиеся новые пакеты:210211 - [`dbm`](https://python-all.ru/3.11/library/dbm.html#module-dbm) (`anydbm`, `dbhash`, `dbm`, `dumbdbm`, `gdbm`, `whichdb`).212 - [`html`](https://python-all.ru/3.11/library/html.html#module-html) (`HTMLParser`, `htmlentitydefs`).213 - [`http`](https://python-all.ru/3.11/library/http.html#module-http) (`httplib`, `BaseHTTPServer`, `CGIHTTPServer`, `SimpleHTTPServer`, `Cookie`, `cookielib`).214 - [`tkinter`](https://python-all.ru/3.11/library/tkinter.html#module-tkinter) (все модули, связанные с `Tkinter`, кроме [`turtle`](https://python-all.ru/3.11/library/turtle.html#module-turtle)). Целевую аудиторию [`turtle`](https://python-all.ru/3.11/library/turtle.html#module-turtle) не особо волнует [`tkinter`](https://python-all.ru/3.11/library/tkinter.html#module-tkinter). Также обратите внимание, что начиная с Python 2.6 функциональность [`turtle`](https://python-all.ru/3.11/library/turtle.html#module-turtle) была значительно расширена.215 - [`urllib`](https://python-all.ru/3.11/library/urllib.html#module-urllib) (`urllib`, `urllib2`, `urlparse`, `robotparse`).216 - `xmlrpc` (`xmlrpclib`, `DocXMLRPCServer`, `SimpleXMLRPCServer`).217218Некоторые другие изменения в модулях стандартной библиотеки, не охваченные [**PEP 3108**](https://python-all.ru/3.11/whatsnew/3.0.html):219220- Удален `sets`. Используйте встроенный класс [`set()`](https://python-all.ru/3.11/library/stdtypes.html#set).221- Очистка модуля [`sys`](https://python-all.ru/3.11/library/sys.html#module-sys): удалены `sys.exitfunc()`, `sys.exc_clear()`, `sys.exc_type`, `sys.exc_value`, `sys.exc_traceback`. (Обратите внимание, что [`sys.last_type`](https://python-all.ru/3.11/library/sys.html#sys.last_type) и т.д. остаются.)222- Очистка типа [`array.array`](https://python-all.ru/3.11/library/array.html#array.array): методы `read()` и `write()` удалены; используйте вместо них `fromfile()` и `tofile()`. Кроме того, код типа `'c'` для array удален – используйте `'b'` для байтов или `'u'` для символов Unicode.223- Очистка модуля [`operator`](https://python-all.ru/3.11/library/operator.html#module-operator): удалены `sequenceIncludes()` и `isCallable()`.224- Очистка модуля `thread`: `acquire_lock()` и `release_lock()` удалены; используйте вместо них [`acquire()`](https://python-all.ru/3.11/library/threading.html#threading.Lock.acquire) и [`release()`](https://python-all.ru/3.11/library/threading.html#threading.Lock.release).225- Очистка модуля [`random`](https://python-all.ru/3.11/library/random.html#module-random): удален API `jumpahead()`.226- Модуль `new` удален.227- Функции `os.tmpnam()`, `os.tempnam()` и `os.tmpfile()` удалены в пользу модуля [`tempfile`](https://python-all.ru/3.11/library/tempfile.html#module-tempfile).228- Модуль [`tokenize`](https://python-all.ru/3.11/library/tokenize.html#module-tokenize) изменен для работы с байтами. Основной точкой входа теперь является [`tokenize.tokenize()`](https://python-all.ru/3.11/library/tokenize.html#tokenize.tokenize) вместо generate\_tokens.229- `string.letters` и его соратники (`string.lowercase` и `string.uppercase`) удалены. Используйте вместо них [`string.ascii_letters`](https://python-all.ru/3.11/library/string.html#string.ascii_letters) и т.д. (Причина удаления в том, что `string.letters` и соратники имели поведение, зависящее от локали, что является плохой идеей для таких привлекательно названных глобальных «констант».)230- Модуль `__builtin__` переименован в [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins) (удалены подчеркивания, добавлена буква 's'). Переменная `__builtins__`, присутствующая в большинстве глобальных пространств имен, не изменилась. Для изменения встроенного объекта следует использовать [`builtins`](https://python-all.ru/3.11/library/builtins.html#module-builtins), а не `__builtins__`!231232## [**PEP 3101**](https://python-all.ru/3.11/whatsnew/3.0.html): Новый подход к форматированию строк233234- Новая система встроенных операций форматирования строк заменяет оператор форматирования строк `%`. (Однако оператор `%` по-прежнему поддерживается; он будет объявлен устаревшим в Python 3.1 и удален из языка в более поздней версии.) Прочтите [**PEP 3101**](https://python-all.ru/3.11/whatsnew/3.0.html) для получения полной информации.235236## Изменения в исключениях237238API для возбуждения и перехвата исключений были очищены и добавлены новые мощные возможности:239240- [**PEP 352**](https://python-all.ru/3.11/whatsnew/3.0.html): Все исключения должны быть производными (прямо или косвенно) от [`BaseException`](https://python-all.ru/3.11/library/exceptions.html#BaseException). Это корень иерархии исключений. Это не ново как рекомендация, но *требование* наследования от [`BaseException`](https://python-all.ru/3.11/library/exceptions.html#BaseException) является новым. (Python 2.6 все еще позволял возбуждать классические классы и не накладывал ограничений на то, что можно перехватывать.) Как следствие, строковые исключения наконец-то действительно и окончательно мертвы.241- Почти все исключения на самом деле должны быть производными от [`Exception`](https://python-all.ru/3.11/library/exceptions.html#Exception); [`BaseException`](https://python-all.ru/3.11/library/exceptions.html#BaseException) следует использовать только как базовый класс для исключений, которые должны обрабатываться только на верхнем уровне, таких как [`SystemExit`](https://python-all.ru/3.11/library/exceptions.html#SystemExit) или [`KeyboardInterrupt`](https://python-all.ru/3.11/library/exceptions.html#KeyboardInterrupt). Рекомендуемая идиома для обработки всех исключений, кроме последней категории, – использовать [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except) [`Exception`](https://python-all.ru/3.11/library/exceptions.html#Exception).242- `StandardError` был удален.243- Исключения больше не ведут себя как последовательности. Используйте вместо этого атрибут `args`.244- [**PEP 3109**](https://python-all.ru/3.11/whatsnew/3.0.html): Возбуждение исключений. Теперь необходимо использовать `raise Exception(args)` вместо `raise Exception, args`. Кроме того, больше нельзя явно указывать трассировку; вместо этого, если вам *нужно* это сделать, можно напрямую присвоить значение атрибуту [`__traceback__`](https://python-all.ru/3.11/library/exceptions.html#BaseException.__traceback__) (см. ниже).245- [**PEP 3110**](https://python-all.ru/3.11/whatsnew/3.0.html): Перехват исключений. Теперь необходимо использовать `except SomeException as variable` вместо `except SomeException, variable`. Более того, *переменная* явно удаляется при выходе из блока [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except).246- [**PEP 3134**](https://python-all.ru/3.11/whatsnew/3.0.html): Цепочки исключений. Есть два случая: неявное и явное связывание. Неявное связывание происходит, когда исключение возбуждается в блоке обработчика [`except`](https://python-all.ru/3.11/reference/compound_stmts.html#except) или [`finally`](https://python-all.ru/3.11/reference/compound_stmts.html#finally). Обычно это происходит из-за ошибки в блоке обработчика; мы называем это *вторичным* исключением. В этом случае исходное исключение (которое обрабатывалось) сохраняется как атрибут [`__context__`](https://python-all.ru/3.11/library/exceptions.html#BaseException.__context__) вторичного исключения. Явное связывание вызывается следующим синтаксисом:247248 ```python249 raise SecondaryException() from primary_exception250 ```251252 (где *primary\_exception* – это любое выражение, которое порождает объект исключения, вероятно, ранее перехваченное исключение). В этом случае первичное исключение сохраняется в атрибуте [`__cause__`](https://python-all.ru/3.11/library/exceptions.html#BaseException.__cause__) вторичного исключения. Трассировка, выводимая при возникновении необработанного исключения, проходит по цепочке атрибутов `__cause__` и [`__context__`](https://python-all.ru/3.11/library/exceptions.html#BaseException.__context__) и выводит отдельную трассировку для каждого компонента цепочки, причем первичное исключение находится вверху. (Пользователи Java могут узнать это поведение.)253- [**PEP 3134**](https://python-all.ru/3.11/whatsnew/3.0.html): Объекты исключений теперь хранят свою трассировку в атрибуте [`__traceback__`](https://python-all.ru/3.11/library/exceptions.html#BaseException.__traceback__). Это означает, что объект исключения теперь содержит всю информацию, относящуюся к исключению, и теперь меньше причин использовать [`sys.exc_info()`](https://python-all.ru/3.11/library/sys.html#sys.exc_info) (хотя последний не удален).254- Некоторые сообщения об исключениях улучшены, когда Windows не удается загрузить модуль расширения. Например, `error code 193` теперь `%1 is not a valid Win32 application`. Строки теперь работают с неанглийскими локалями.255256## Разные другие изменения257258### Операторы и специальные методы259260- `!=` теперь возвращает противоположность `==`, если только `==` не возвращает [`NotImplemented`](https://python-all.ru/3.11/library/constants.html#NotImplemented).261- Концепция «несвязанных методов» удалена из языка. При обращении к методу как к атрибуту класса теперь получается обычный объект функции.262- `__getslice__()`, `__setslice__()` и `__delslice__()` были удалены. Синтаксис `a[i:j]` теперь транслируется в `a.__getitem__(slice(i, j))` (или `__setitem__()` или `__delitem__()`, при использовании в качестве цели присваивания или удаления соответственно).263- [**PEP 3114**](https://python-all.ru/3.11/whatsnew/3.0.html): стандартный метод [`next()`](https://python-all.ru/3.11/library/functions.html#next) переименован в [`__next__()`](https://python-all.ru/3.11/library/stdtypes.html#iterator.__next__).264- Специальные методы `__oct__()` и `__hex__()` удалены – [`oct()`](https://python-all.ru/3.11/library/functions.html#oct) и [`hex()`](https://python-all.ru/3.11/library/functions.html#hex) теперь используют `__index__()` для преобразования аргумента в целое число.265- Убрана поддержка `__members__` и `__methods__`.266- Атрибуты функций с именами `func_X` были переименованы в форму `__X__`, освободив эти имена в пространстве имён атрибутов функций для пользовательских атрибутов. А именно, `func_closure`, `func_code`, `func_defaults`, `func_dict`, `func_doc`, `func_globals`, `func_name` были переименованы в [`__closure__`](https://python-all.ru/3.11/reference/datamodel.html#function.__closure__), [`__code__`](https://python-all.ru/3.11/reference/datamodel.html#function.__code__), [`__defaults__`](https://python-all.ru/3.11/reference/datamodel.html#function.__defaults__), [`__dict__`](https://python-all.ru/3.11/reference/datamodel.html#function.__dict__), [`__doc__`](https://python-all.ru/3.11/reference/datamodel.html#function.__doc__), [`__globals__`](https://python-all.ru/3.11/reference/datamodel.html#function.__globals__), [`__name__`](https://python-all.ru/3.11/reference/datamodel.html#function.__name__), соответственно.267- `__nonzero__()` теперь [`__bool__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__bool__).268269### Встроенные функции270271- [**PEP 3135**](https://python-all.ru/3.11/whatsnew/3.0.html): Новый [`super()`](https://python-all.ru/3.11/library/functions.html#super). Теперь можно вызывать [`super()`](https://python-all.ru/3.11/library/functions.html#super) без аргументов, и (если это обычный метод экземпляра, определённый внутри инструкции [`class`](https://python-all.ru/3.11/reference/compound_stmts.html#class)) правильный класс и экземпляр будут выбраны автоматически. С аргументами поведение [`super()`](https://python-all.ru/3.11/library/functions.html#super) не изменилось.272- [**PEP 3111**](https://python-all.ru/3.11/whatsnew/3.0.html): `raw_input()` переименована в [`input()`](https://python-all.ru/3.11/library/functions.html#input). То есть, новая функция [`input()`](https://python-all.ru/3.11/library/functions.html#input) читает строку из [`sys.stdin`](https://python-all.ru/3.11/library/sys.html#sys.stdin) и возвращает её с удалённым завершающим символом новой строки. Она возбуждает [`EOFError`](https://python-all.ru/3.11/library/exceptions.html#EOFError), если ввод преждевременно завершён. Чтобы получить старое поведение [`input()`](https://python-all.ru/3.11/library/functions.html#input), используйте `eval(input())`.273- Добавлена новая встроенная функция [`next()`](https://python-all.ru/3.11/library/functions.html#next) для вызова метода [`__next__()`](https://python-all.ru/3.11/library/stdtypes.html#iterator.__next__) объекта.274- Стратегия округления и возвращаемый тип функции [`round()`](https://python-all.ru/3.11/library/functions.html#round) изменились. Точные половинные случаи теперь округляются до ближайшего чётного результата, а не от нуля. (Например, `round(2.5)` теперь возвращает `2` вместо `3`.) `round(x[, n])` теперь делегирует `x.__round__([n])` вместо того, чтобы всегда возвращать float. В общем случае она возвращает целое число при вызове с одним аргументом и значение того же типа, что и `x`, при вызове с двумя аргументами.275- `intern()` перенесён в [`sys.intern()`](https://python-all.ru/3.11/library/sys.html#sys.intern).276- Удалено: `apply()`. Вместо `apply(f, args)` используйте `f(*args)`.277- Удалён [`callable()`](https://python-all.ru/3.11/library/functions.html#callable). Вместо `callable(f)` можно использовать `isinstance(f, collections.Callable)`. Функция `operator.isCallable()` также удалена.278- Удалён `coerce()`. Эта функция больше не нужна, поскольку классические классы исчезли.279- Удалён `execfile()`. Вместо `execfile(fn)` используйте `exec(open(fn).read())`.280- Удалён тип `file`. Используйте [`open()`](https://python-all.ru/3.11/library/functions.html#open). Теперь существует несколько различных видов потоков, которые open может возвращать в модуле [`io`](https://python-all.ru/3.11/library/io.html#module-io).281- Удалён `reduce()`. Используйте [`functools.reduce()`](https://python-all.ru/3.11/library/functools.html#functools.reduce), если он действительно нужен; однако в 99% случаев явный цикл [`for`](https://python-all.ru/3.11/reference/compound_stmts.html#for) читается лучше.282- Удалён `reload()`. Используйте [`imp.reload()`](https://python-all.ru/3.11/library/imp.html#imp.reload).283- Удалено. `dict.has_key()` – вместо этого используйте оператор [`in`](https://python-all.ru/3.11/reference/expressions.html#in).284285## Изменения в сборке и C API286287Из-за нехватки времени приведён *очень* неполный список изменений C API.288289- Поддержка нескольких платформ прекращена, включая, но не ограничиваясь Mac OS 9, BeOS, RISCOS, Irix и Tru64.290- [**PEP 3118**](https://python-all.ru/3.11/whatsnew/3.0.html): Новый буферный API.291- [**PEP 3121**](https://python-all.ru/3.11/whatsnew/3.0.html): Инициализация и финализация модулей расширения.292- [**PEP 3123**](https://python-all.ru/3.11/whatsnew/3.0.html): Приведение [`PyObject_HEAD`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject_HEAD) в соответствие со стандартом C.293- Больше нет поддержки C API для ограниченного выполнения.294- C API `PyNumber_Coerce()`, `PyNumber_CoerceEx()`, `PyMember_Get()` и `PyMember_Set()` удалены.295- Новый C API [`PyImport_ImportModuleNoBlock()`](https://python-all.ru/3.11/c-api/import.html#c.PyImport_ImportModuleNoBlock), работает как [`PyImport_ImportModule()`](https://python-all.ru/3.11/c-api/import.html#c.PyImport_ImportModule), но не блокируется на блокировке импорта (вместо этого возвращается ошибка).296- Переименован слот и метод уровня C для преобразования в логическое значение: `nb_nonzero` теперь `nb_bool`.297- Из C API удалены `METH_OLDARGS` и `WITH_CYCLE_GC`.298299## Производительность300301Чистым результатом обобщений в версии 3.0 является то, что Python 3.0 выполняет тест pystone примерно на 10% медленнее, чем Python 2.5. Скорее всего, главная причина – удаление специальной обработки для малых целых чисел. Есть возможность для улучшения, но это произойдёт после выхода версии 3.0!302303## Перенос на Python 3.0304305Для переноса существующего исходного кода с Python 2.5 или 2.6 на Python 3.0 лучшая стратегия – следующая:3063070. (Предварительное условие:) Начните с отличного тестового покрытия.3081. Перенесите код на Python 2.6. Эта работа должна быть не сложнее обычного переноса с Python 2.x на Python 2.(x+1). Убедитесь, что все тесты проходят успешно.3092. (Всё ещё используя 2.6:) Включите флаг командной строки `-3`. Это включает предупреждения о возможностях, которые будут удалены (или изменены) в 3.0. Снова запустите свой набор тестов и исправляйте код, на который выдаются предупреждения, пока предупреждений не останется, а все тесты по-прежнему проходят.3103. Запустите `2to3` транслятор исходного кода в исходный код для вашего дерева исходников. (См. [2to3 – автоматическое преобразование кода Python 2 в Python 3](https://python-all.ru/3.11/library/2to3.html#to3-reference) для получения дополнительной информации об этом инструменте.) Запустите результат трансляции под Python 3.0. Вручную исправьте все оставшиеся проблемы, устраняя неполадки, пока все тесты снова не пройдут.311312Не рекомендуется пытаться писать исходный код, который без изменений работает и в Python 2.6, и в 3.0; для этого пришлось бы использовать очень изощрённый стиль кодирования, например, избегая операторов `print`, метаклассов и много чего ещё. Если вы поддерживаете библиотеку, которая должна работать и в Python 2.6, и в Python 3.0, лучший подход – изменить шаг 3 выше, редактируя версию исходного кода для 2.6 и снова запуская транслятор `2to3`, а не редактируя версию исходного кода для 3.0.313314По вопросам переноса расширений на C в Python 3.0 обратитесь к разделу [Перенос модулей расширений на Python 3](https://python-all.ru/3.11/howto/cporting.html#cporting-howto).315