3.1.md
1> **Источник:** https://python-all.ru/3.15/whatsnew/3.1.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Что нового в Python 3.189**Автор:**1011Raymond Hettinger1213В этой статье описываются новые возможности Python 3.1 по сравнению с 3.0. Python 3.1 был выпущен 27 июня 2009 года.1415## PEP 372: Упорядоченные словари1617Обычные словари Python перебирают пары ключ/значение в произвольном порядке. С годами ряд авторов написали альтернативные реализации, запоминающие порядок исходной вставки ключей. Основываясь на опыте этих реализаций, был введён новый класс [`collections.OrderedDict`](https://python-all.ru/3.15/library/collections.html#collections.OrderedDict).1819API OrderedDict в основном такой же, как у обычных словарей, но гарантированно перебирает ключи и значения в порядке, зависящем от времени первой вставки ключа. Если новая запись перезаписывает существующую, исходная позиция вставки остаётся неизменной. Удаление записи и повторная вставка перемещает её в конец.2021Стандартная библиотека теперь поддерживает использование упорядоченных словарей в нескольких модулях. Модуль [`configparser`](https://python-all.ru/3.15/library/configparser.html#module-configparser) использует их по умолчанию. Это позволяет читать, изменять и затем записывать конфигурационные файлы в исходном порядке. Метод *\_asdict()* для [`collections.namedtuple()`](https://python-all.ru/3.15/library/collections.html#collections.namedtuple) теперь возвращает упорядоченный словарь, в котором значения располагаются в том же порядке, что и индексы базового кортежа. Модуль [`json`](https://python-all.ru/3.15/library/json.html#module-json) дополняется параметром *object\_pairs\_hook*, позволяющим декодеру строить упорядоченные словари. Также добавлена поддержка сторонних инструментов, таких как [PyYAML](https://python-all.ru/3.15/whatsnew/3.1.html).2223> **См. также**24>25> **[**PEP 372**](https://python-all.ru/3.15/whatsnew/3.1.html) - Упорядоченные словари**26>27> PEP написан Армином Ронахером и Реймондом Хеттингером. Реализация написана Реймондом Хеттингером.2829Поскольку упорядоченный словарь запоминает порядок вставки, его можно использовать в сочетании с сортировкой для создания отсортированного словаря:3031```python32>>> # обычный неотсортированный словарь33>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}3435>>> # словарь, отсортированный по ключу36>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))37OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])3839>>> # словарь, отсортированный по значению40>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))41OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])4243>>> # словарь, отсортированный по длине строки ключа44>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))45OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])46```4748Новые отсортированные словари сохраняют порядок сортировки при удалении записей. Но при добавлении новых ключей они добавляются в конец, и сортировка не сохраняется.4950## PEP 378: Спецификатор формата для разделителя тысяч5152Встроенная функция [`format()`](https://python-all.ru/3.15/library/functions.html#format) и метод [`str.format()`](https://python-all.ru/3.15/library/stdtypes.html#str.format) используют мини-язык, который теперь включает простой, не зависящий от локали способ форматирования числа с разделителем тысяч. Это позволяет «очеловечить» вывод программы, улучшая его профессиональный вид и читаемость:5354```python55>>> format(1234567, ',d')56'1,234,567'57>>> format(1234567.89, ',.2f')58'1,234,567.89'59>>> format(12345.6 + 8901234.12j, ',f')60'12,345.600000+8,901,234.120000j'61>>> format(Decimal('1234567.89'), ',f')62'1,234,567.89'63```6465Поддерживаемые типы: [`int`](https://python-all.ru/3.15/library/functions.html#int), [`float`](https://python-all.ru/3.15/library/functions.html#float), [`complex`](https://python-all.ru/3.15/library/functions.html#complex) и [`decimal.Decimal`](https://python-all.ru/3.15/library/decimal.html#decimal.Decimal).6667Обсуждаются способы указания альтернативных разделителей, таких как точки, пробелы, апострофы или подчёркивания. Приложения, учитывающие локаль, должны использовать существующий спецификатор формата *n*, который уже имеет некоторую поддержку разделителей тысяч.6869> **См. также**70>71> **[**PEP 378**](https://python-all.ru/3.15/whatsnew/3.1.html) - Спецификатор формата для разделителя тысяч**72>73> PEP написан Реймондом Хеттингером, реализован Эриком Смитом и Марком Дикинсоном.7475## Прочие изменения языка7677Некоторые небольшие изменения, внесённые в ядро языка Python:7879- Каталоги и zip-архивы, содержащие файл `__main__.py`, теперь можно выполнять напрямую, передавая их имя интерпретатору. Каталог/zip-файл автоматически вставляется как первая запись в sys.path. (Предложение и начальный патч: Энди Чу; доработанный патч: Филлип Дж. Эби и Ник Коглан; [bpo-1739468](https://python-all.ru/3.15/whatsnew/3.1.html).)80- Тип [`int()`](https://python-all.ru/3.15/library/functions.html#int) получил метод `bit_length`, который возвращает количество битов, необходимое для представления своего аргумента в двоичном виде:8182 ```python83 >>> n = 3784 >>> bin(37)85 '0b100101'86 >>> n.bit_length()87 688 >>> n = 2**123-189 >>> n.bit_length()90 12391 >>> (n+1).bit_length()92 12493 ```9495 (Авторы: Фредрик Йоханссон, Виктор Стиннер, Реймонд Хеттингер и Марк Дикинсон; [bpo-3439](https://python-all.ru/3.15/whatsnew/3.1.html).)96- Поля в строках [`format()`](https://python-all.ru/3.15/library/functions.html#format) теперь могут автоматически нумероваться:9798 ```python99 >>> 'Sir {} of {}'.format('Gallahad', 'Camelot')100 'Sir Gallahad of Camelot'101 ```102103 Раньше строка требовала нумерованных полей, например: `'Sir {0} of {1}'`.104105 (Автор: Эрик Смит; [bpo-5237](https://python-all.ru/3.15/whatsnew/3.1.html).)106- Функция `string.maketrans()` объявлена устаревшей и заменяется новыми статическими методами [`bytes.maketrans()`](https://python-all.ru/3.15/library/stdtypes.html#bytes.maketrans) и [`bytearray.maketrans()`](https://python-all.ru/3.15/library/stdtypes.html#bytearray.maketrans). Это изменение устраняет путаницу относительно того, какие типы поддерживаются модулем [`string`](https://python-all.ru/3.15/library/string.html#module-string). Теперь [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.15/library/stdtypes.html#bytearray) имеют собственные методы **maketrans** и **translate** с промежуточными таблицами перевода соответствующего типа.107108 (Предложено Georg Brandl; [bpo-5675](https://python-all.ru/3.15/whatsnew/3.1.html).)109- Синтаксис оператора [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with) теперь позволяет использовать несколько контекстных менеджеров в одном операторе:110111 ```python112 >>> with open('mylog.txt') as infile, open('a.out', 'w') as outfile:113 ... for line in infile:114 ... if '<critical>' in line:115 ... outfile.write(line)116 ```117118 С новым синтаксисом функция `contextlib.nested()` больше не нужна и теперь объявлена устаревшей.119120 (Предложено Georg Brandl и Mattias Brändström; [appspot issue 53094](https://python-all.ru/3.15/whatsnew/3.1.html).)121- `round(x, n)` теперь возвращает целое число, если *x* – целое. Ранее возвращалось число с плавающей запятой:122123 ```python124 >>> round(1123, -2)125 1100126 ```127128 (Автор: Mark Dickinson; [bpo-4707](https://python-all.ru/3.15/whatsnew/3.1.html).)129- Python теперь использует алгоритм Дэвида Гея для поиска кратчайшего представления числа с плавающей запятой, не изменяющего его значение. Это должно помочь уменьшить некоторую путаницу, связанную с двоичными числами с плавающей запятой.130131 Значение хорошо видно на примере числа `1.1`, которое не имеет точного эквивалента в двоичной арифметике с плавающей запятой. Поскольку точного эквивалента нет, выражение `float('1.1')` вычисляется как ближайшее представимое значение, которое равно `0x1.199999999999ap+0` в шестнадцатеричной записи или `1.100000000000000088817841970012523233890533447265625` в десятичной. Это ближайшее значение использовалось и продолжает использоваться в последующих вычислениях с плавающей запятой.132133 Новшество заключается в том, как число отображается. Раньше Python использовал простой подход. Значение `repr(1.1)` вычислялось как `format(1.1, '.17g')`, что давало `'1.1000000000000001'`. Преимущество использования 17 знаков заключалось в том, что оно опиралось на гарантии IEEE-754, обеспечивающие, что `eval(repr(1.1))` при обратном преобразовании даст исходное значение. Недостаток в том, что многие находили такой вывод запутанным (принимая внутренние ограничения двоичного представления чисел с плавающей запятой за проблему самого Python).134135 Новый алгоритм для `repr(1.1)` умнее и возвращает `'1.1'`. По сути, он ищет все эквивалентные строковые представления (те, которые сохраняются с тем же базовым значением float) и возвращает кратчайшее представление.136137 Новый алгоритм стремится выдавать более чистые представления, когда это возможно, но не изменяет базовые значения. Поэтому по-прежнему верно, что `1.1 + 2.2 != 3.3`, даже если представления могут намекать на обратное.138139 Новый алгоритм зависит от определённых возможностей базовой реализации чисел с плавающей запятой. Если необходимые возможности отсутствуют, будет продолжать использоваться старый алгоритм. Кроме того, текстовые протоколы pickle обеспечивают кроссплатформенную переносимость за счёт использования старого алгоритма.140141 (Авторы: Eric Smith и Mark Dickinson; [bpo-1580](https://python-all.ru/3.15/whatsnew/3.1.html))142143## Новые, улучшенные и устаревшие модули144145- Добавлен класс [`collections.Counter`](https://python-all.ru/3.15/library/collections.html#collections.Counter) для удобного подсчёта уникальных элементов в последовательности или итерируемом объекте:146147 ```python148 >>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])149 Counter({'blue': 3, 'red': 2, 'green': 1})150 ```151152 (Автор: Raymond Hettinger; [bpo-1696199](https://python-all.ru/3.15/whatsnew/3.1.html).)153- Добавлен новый модуль [`tkinter.ttk`](https://python-all.ru/3.15/library/tkinter.ttk.html#module-tkinter.ttk) для доступа к набору темизированных виджетов Tk. Основная идея ttk – разделить, насколько это возможно, код, реализующий поведение виджета, и код, реализующий его внешний вид.154155 (Автор: Guilherme Polo; [bpo-2983](https://python-all.ru/3.15/whatsnew/3.1.html).)156- Классы [`gzip.GzipFile`](https://python-all.ru/3.15/library/gzip.html#gzip.GzipFile) и [`bz2.BZ2File`](https://python-all.ru/3.15/library/bz2.html#bz2.BZ2File) теперь поддерживают протокол менеджера контекста:157158 ```python159 >>> # Автоматически закрыть файл после записи160 >>> with gzip.GzipFile(filename, "wb") as f:161 ... f.write(b"xxx")162 ```163164 (Предоставлено Antoine Pitrou.)165- Модуль [`decimal`](https://python-all.ru/3.15/library/decimal.html#module-decimal) теперь поддерживает методы создания десятичного объекта из двоичного [`float`](https://python-all.ru/3.15/library/functions.html#float). Преобразование является точным, но иногда может быть неожиданным:166167 ```python168 >>> Decimal.from_float(1.1)169 Decimal('1.100000000000000088817841970012523233890533447265625')170 ```171172 Длинный десятичный результат показывает фактическую двоичную дробь, хранящуюся для *1.1*. Дробь имеет много цифр, потому что *1.1* не может быть точно представлена в двоичном виде.173174 (Авторы: Raymond Hettinger и Mark Dickinson.)175- Модуль [`itertools`](https://python-all.ru/3.15/library/itertools.html#module-itertools) обзавёлся двумя новыми функциями. Функция [`itertools.combinations_with_replacement()`](https://python-all.ru/3.15/library/itertools.html#itertools.combinations_with_replacement) – одна из четырёх для генерации комбинаторных объектов, включая перестановки и декартовы произведения. Функция [`itertools.compress()`](https://python-all.ru/3.15/library/itertools.html#itertools.compress) имитирует своего тёзку из APL. Кроме того, существующая функция [`itertools.count()`](https://python-all.ru/3.15/library/itertools.html#itertools.count) теперь имеет необязательный аргумент *step* и может принимать любой тип счётной последовательности, включая [`fractions.Fraction`](https://python-all.ru/3.15/library/fractions.html#fractions.Fraction) и [`decimal.Decimal`](https://python-all.ru/3.15/library/decimal.html#decimal.Decimal):176177 ```python178 >>> [p+q for p,q in combinations_with_replacement('LOVE', 2)]179 ['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE']180181 >>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0]))182 [2, 3, 5, 7]183184 >>> c = count(start=Fraction(1,2), step=Fraction(1,6))185 >>> [next(c), next(c), next(c), next(c)]186 [Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)]187 ```188189 (Автор: Raymond Hettinger.)190- [`collections.namedtuple()`](https://python-all.ru/3.15/library/collections.html#collections.namedtuple) теперь поддерживает именованный аргумент *rename*, который позволяет автоматически преобразовывать недопустимые имена полей в позиционные имена вида \_0, \_1 и т.д. Это полезно, когда имена полей создаются внешним источником, например заголовком CSV, списком полей SQL или пользовательским вводом:191192 ```python193 >>> query = input()194 SELECT region, dept, count(*) FROM main GROUPBY region, dept195196 >>> cursor.execute(query)197 >>> query_fields = [desc[0] for desc in cursor.description]198 >>> UserQuery = namedtuple('UserQuery', query_fields, rename=True)199 >>> pprint.pprint([UserQuery(*row) for row in cursor])200 [UserQuery(region='South', dept='Shipping', _2=185),201 UserQuery(region='North', dept='Accounting', _2=37),202 UserQuery(region='West', dept='Sales', _2=419)]203 ```204205 (Автор: Raymond Hettinger; [bpo-1818](https://python-all.ru/3.15/whatsnew/3.1.html).)206- Функции [`re.sub()`](https://python-all.ru/3.15/library/re.html#re.sub), [`re.subn()`](https://python-all.ru/3.15/library/re.html#re.subn) и [`re.split()`](https://python-all.ru/3.15/library/re.html#re.split) теперь принимают параметр flags.207208 (Автор: Gregory Smith.)209- Модуль [`logging`](https://python-all.ru/3.15/library/logging.html#module-logging) теперь реализует простой класс [`logging.NullHandler`](https://python-all.ru/3.15/library/logging.handlers.html#logging.NullHandler) для приложений, которые не используют логирование, но вызывают библиотечный код, который его использует. Настройка нулевого обработчика подавит ложные предупреждения, такие как «No handlers could be found for logger foo»:210211 ```python212 >>> h = logging.NullHandler()213 >>> logging.getLogger("foo").addHandler(h)214 ```215216 (Автор: Vinay Sajip; [bpo-4384](https://python-all.ru/3.15/whatsnew/3.1.html)).217- Модуль [`runpy`](https://python-all.ru/3.15/library/runpy.html#module-runpy), который поддерживает ключ командной строки `-m`, теперь поддерживает выполнение пакетов: при указании имени пакета ищется и выполняется подмодуль `__main__`.218219 (Автор: Andi Vajda; [bpo-4195](https://python-all.ru/3.15/whatsnew/3.1.html).)220- Модуль [`pdb`](https://python-all.ru/3.15/library/pdb.html#module-pdb) теперь может получать доступ и отображать исходный код, загруженный через [`zipimport`](https://python-all.ru/3.15/library/zipimport.html#module-zipimport) (или любой другой совместимый загрузчик [**PEP 302**](https://python-all.ru/3.15/whatsnew/3.1.html)).221222 (Автор: Alexander Belopolsky; [bpo-4201](https://python-all.ru/3.15/whatsnew/3.1.html).)223- Объекты [`functools.partial`](https://python-all.ru/3.15/library/functools.html#functools.partial) теперь можно упаковывать с помощью pickle.224225> (Предложено Антуаном Питру и Джесси Ноллером. Реализовано Джеком Дидерихом; [bpo-5228](https://python-all.ru/3.15/whatsnew/3.1.html).)226227- Добавлены темы справки [`pydoc`](https://python-all.ru/3.15/library/pydoc.html#module-pydoc) для символов, чтобы `help('@')` работала в интерактивной среде как ожидается.228229 (Автор: Дэвид Лабан; [bpo-4739](https://python-all.ru/3.15/whatsnew/3.1.html).)230- Модуль [`unittest`](https://python-all.ru/3.15/library/unittest.html#module-unittest) теперь поддерживает пропуск отдельных тестов или классов тестов. А также поддерживает пометку теста как ожидаемого сбоя – теста, который заведомо не работает, но не должен учитываться как ошибка в TestResult:231232 ```python233 class TestGizmo(unittest.TestCase):234235 @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")236 def test_gizmo_on_windows(self):237 ...238239 @unittest.expectedFailure240 def test_gimzo_without_required_library(self):241 ...242 ```243244 Кроме того, тесты для исключений были расширены для работы с контекстными менеджерами с помощью оператора [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with):245246 ```python247 def test_division_by_zero(self):248 with self.assertRaises(ZeroDivisionError):249 x / 0250 ```251252 Кроме того, было добавлено несколько новых методов утверждений, включая [`assertSetEqual()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertSetEqual), [`assertDictEqual()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertDictEqual), `assertDictContainsSubset()`, [`assertListEqual()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertListEqual), [`assertTupleEqual()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertTupleEqual), [`assertSequenceEqual()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertSequenceEqual), [`assertRaisesRegexp()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertRaisesRegex), [`assertIsNone()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertIsNone) и [`assertIsNotNone()`](https://python-all.ru/3.15/library/unittest.html#unittest.TestCase.assertIsNotNone).253254 (Авторы: Бенджамин Петерсон и Антуан Питру.)255- Модуль [`io`](https://python-all.ru/3.15/library/io.html#module-io) содержит три новые константы для метода [`seek()`](https://python-all.ru/3.15/library/io.html#io.IOBase.seek): [`SEEK_SET`](https://python-all.ru/3.15/library/os.html#os.SEEK_SET), [`SEEK_CUR`](https://python-all.ru/3.15/library/os.html#os.SEEK_CUR) и [`SEEK_END`](https://python-all.ru/3.15/library/os.html#os.SEEK_END).256- Кортеж [`sys.version_info`](https://python-all.ru/3.15/library/sys.html#sys.version_info) теперь является именованным кортежем:257258 ```python259 >>> sys.version_info260 sys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2)261 ```262263 (Автор: Росс Лайт; [bpo-4285](https://python-all.ru/3.15/whatsnew/3.1.html).)264- Модули `nntplib` и [`imaplib`](https://python-all.ru/3.15/library/imaplib.html#module-imaplib) теперь поддерживают IPv6.265266 (Автор: Дерек Морр; [bpo-1655](https://python-all.ru/3.15/whatsnew/3.1.html) и [bpo-1664](https://python-all.ru/3.15/whatsnew/3.1.html).)267- Модуль [`pickle`](https://python-all.ru/3.15/library/pickle.html#module-pickle) был адаптирован для лучшей совместимости с Python 2.x при использовании протокола 2 и ниже. Реорганизация стандартной библиотеки изменила формальные ссылки на многие объекты. Например, `__builtin__.set` в Python 2 называется `builtins.set` в Python 3. Это изменение затрудняло обмен данными между разными версиями Python. Но теперь, когда выбран протокол 2 или ниже, pickler будет автоматически использовать старые имена Python 2 как для загрузки, так и для выгрузки. Это переназначение включено по умолчанию, но может быть отключено с помощью опции *fix\_imports* :268269 ```python270 >>> s = {1, 2, 3}271 >>> pickle.dumps(s, protocol=0)272 b'c__builtin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'273 >>> pickle.dumps(s, protocol=0, fix_imports=False)274 b'cbuiltins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'275 ```276277 Неприятным, но неизбежным побочным эффектом этого изменения является то, что протокол 2 pickles, созданные Python 3.1, не будут читаться в Python 3.0. Последний протокол pickle, протокол 3, следует использовать при переносе данных между реализациями Python 3.x, так как он не пытается сохранять совместимость с Python 2.x.278279 (Авторы: Александр Вассалотти и Антуан Питру, [bpo-6137](https://python-all.ru/3.15/whatsnew/3.1.html).)280- Добавлен новый модуль [`importlib`](https://python-all.ru/3.15/library/importlib.html#module-importlib). Он предоставляет полную, переносимую, эталонную реализацию на чистом Python оператора [`import`](https://python-all.ru/3.15/reference/simple_stmts.html#import) и его аналога – функции [`__import__()`](https://python-all.ru/3.15/library/functions.html#import__). Это представляет собой существенный шаг вперёд в документировании и определении действий, происходящих во время импорта.281282 (Автор: Бретт Кэннон.)283284## Оптимизации285286Добавлены значительные улучшения производительности:287288- Новая библиотека ввода-вывода (определённая в [**PEP 3116**](https://python-all.ru/3.15/whatsnew/3.1.html)) была в основном написана на Python и быстро показала себя как проблемное узкое место в Python 3.0. В Python 3.1 библиотека ввода-вывода была полностью переписана на C и работает в 2–20 раз быстрее в зависимости от задачи. Версия на чистом Python по-прежнему доступна для экспериментов через модуль `_pyio`.289290 (Авторы: Амори Форжо д'Арк и Антуан Питру.)291- Добавлена эвристика, благодаря которой кортежи и словари, содержащие только неотслеживаемые объекты, не отслеживаются сборщиком мусора. Это может уменьшить размер коллекций и, следовательно, накладные расходы на сборку мусора в долго работающих программах, в зависимости от используемых типов данных.292293 (Автор: Антуан Питру, [bpo-4688](https://python-all.ru/3.15/whatsnew/3.1.html).)294- При включении опции configure с именем `--with-computed-gotos` на компиляторах, которые её поддерживают (в частности: gcc, SunPro, icc), цикл выполнения байт-кода компилируется с новым механизмом диспетчеризации, что даёт прирост производительности до 20% в зависимости от системы, компилятора и теста.295296 (Автор: Антуан Питру совместно с рядом других участников, [bpo-4753](https://python-all.ru/3.15/whatsnew/3.1.html)).297- Декодирование UTF-8, UTF-16 и LATIN-1 теперь в два-четыре раза быстрее.298299 (Авторы: Антуан Питру и Амори Форжо д'Арк, [bpo-4868](https://python-all.ru/3.15/whatsnew/3.1.html).)300- Модуль [`json`](https://python-all.ru/3.15/library/json.html#module-json) теперь имеет расширение на C для существенного повышения его производительности. Кроме того, API был изменён так, что json работает только с [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), а не с [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). Это изменение делает модуль более соответствующим [спецификации JSON](https://python-all.ru/3.15/whatsnew/3.1.html), которая определена в терминах Unicode.301302 (Автор: Боб Ипполито, адаптировано для Py3.1 Антуаном Питру и Бенджамином Петерсоном; [bpo-4136](https://python-all.ru/3.15/whatsnew/3.1.html).)303- При распаковке имена атрибутов упакованных объектов теперь интернируются. Это экономит память и позволяет уменьшить размер файлов pickle.304305 (Авторы: Джейк МакГуайр и Антуан Питру; [bpo-5084](https://python-all.ru/3.15/whatsnew/3.1.html).)306307## IDLE308309- Меню «Формат» в IDLE теперь содержит опцию удаления завершающих пробелов из исходного файла.310311 (Автор: Roger D. Serwy; [bpo-5150](https://python-all.ru/3.15/whatsnew/3.1.html).)312313## Изменения в сборке и C API314315Изменения процесса сборки Python и C API включают:316317- Целые числа теперь хранятся внутри либо по основанию `2**15`, либо по основанию `2**30`, причём основание выбирается во время сборки. Ранее они всегда хранились по основанию `2**15`. Использование основания `2**30` даёт значительное улучшение производительности на 64-битных машинах, но результаты бенчмарков на 32-битных машинах неоднозначны. Поэтому по умолчанию на 64-битных машинах используется основание `2**30`, а на 32-битных – основание `2**15`; в Unix есть новая опция конфигурации `--enable-big-digits`, позволяющая переопределить это поведение.318319 За исключением улучшения производительности, это изменение должно быть незаметно для конечных пользователей, за одним исключением: для целей тестирования и отладки появилась новая [`sys.int_info`](https://python-all.ru/3.15/library/sys.html#sys.int_info), предоставляющая информацию о внутреннем формате: количество бит на разряд и размер в байтах типа C, используемого для хранения каждого разряда:320321 ```python322 >>> import sys323 >>> sys.int_info324 sys.int_info(bits_per_digit=30, sizeof_digit=4)325 ```326327 (Автор: Mark Dickinson; [bpo-4258](https://python-all.ru/3.15/whatsnew/3.1.html).)328- Функция [`PyLong_AsUnsignedLongLong()`](https://python-all.ru/3.15/c-api/long.html#c.PyLong_AsUnsignedLongLong) теперь обрабатывает отрицательное *pylong*, вызывая [`OverflowError`](https://python-all.ru/3.15/library/exceptions.html#OverflowError) вместо [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).329330 (Автор: Mark Dickinson и Lisandro Dalcrin; [bpo-5175](https://python-all.ru/3.15/whatsnew/3.1.html).)331- Устарело `PyNumber_Int()`. Вместо этого используйте [`PyNumber_Long()`](https://python-all.ru/3.15/c-api/number.html#c.PyNumber_Long).332333 (Автор: Mark Dickinson; [bpo-4910](https://python-all.ru/3.15/whatsnew/3.1.html).)334- Добавлена новая функция [`PyOS_string_to_double()`](https://python-all.ru/3.15/c-api/conversion.html#c.PyOS_string_to_double), заменяющая устаревшие функции `PyOS_ascii_strtod()` и `PyOS_ascii_atof()`.335336 (Автор: Mark Dickinson; [bpo-5914](https://python-all.ru/3.15/whatsnew/3.1.html).)337- Добавлен [`PyCapsule`](https://python-all.ru/3.15/c-api/capsule.html#c.PyCapsule) как замена API `PyCObject`. Основное различие в том, что новый тип имеет чётко определённый интерфейс для передачи информации о типобезопасности и менее сложную сигнатуру для вызова деструктора. Старый тип имел проблемный API и теперь является устаревшим.338339 (Автор: Larry Hastings; [bpo-5630](https://python-all.ru/3.15/whatsnew/3.1.html).)340341## Перенос на Python 3.1342343В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в коде:344345- Новые строковые представления чисел с плавающей запятой могут нарушить существующие doctest. Например:346347 ```python348 def e():349 '''Вычислить основание натуральных логарифмов.350351 >>> e()352 2.7182818284590451353354 '''355 return sum(1/math.factorial(x) for x in reversed(range(30)))356357 doctest.testmod()358359 **********************************************************************360 Failed example:361 e()362 Expected:363 2.7182818284590451364 Got:365 2.718281828459045366 **********************************************************************367 ```368- Автоматическое переименование имён в модуле pickle для протокола 2 и ниже может сделать pickle-файлы Python 3.1 нечитаемыми в Python 3.0. Одно из решений – использовать протокол 3. Другое решение – установить опцию *fix\_imports* в `False`. Подробнее см. обсуждение выше.369