Документация Python неофициальный перевод

3.1.md

369 строк · 36.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3/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/library/collections.html#collections.OrderedDict).1819API OrderedDict в основном такой же, как у обычных словарей, но гарантированно перебирает ключи и значения в порядке, зависящем от времени первой вставки ключа. Если новая запись перезаписывает существующую, исходная позиция вставки остаётся неизменной. Удаление записи и повторная вставка перемещает её в конец.2021Стандартная библиотека теперь поддерживает использование упорядоченных словарей в нескольких модулях. Модуль [`configparser`](https://python-all.ru/3/library/configparser.html#module-configparser) использует их по умолчанию. Это позволяет читать, изменять и затем записывать конфигурационные файлы в исходном порядке. Метод *\_asdict()* для [`collections.namedtuple()`](https://python-all.ru/3/library/collections.html#collections.namedtuple) теперь возвращает упорядоченный словарь, в котором значения располагаются в том же порядке, что и индексы базового кортежа. Модуль [`json`](https://python-all.ru/3/library/json.html#module-json) дополняется параметром *object\_pairs\_hook*, позволяющим декодеру строить упорядоченные словари. Также добавлена поддержка сторонних инструментов, таких как [PyYAML](https://python-all.ru/3/whatsnew/3.1.html).2223> **См. также**24>25> **[**PEP 372**](https://python-all.ru/3/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/library/functions.html#format) и метод [`str.format()`](https://python-all.ru/3/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/library/functions.html#int), [`float`](https://python-all.ru/3/library/functions.html#float), [`complex`](https://python-all.ru/3/library/functions.html#complex) и [`decimal.Decimal`](https://python-all.ru/3/library/decimal.html#decimal.Decimal).6667Обсуждаются способы указания альтернативных разделителей, таких как точки, пробелы, апострофы или подчёркивания. Приложения, учитывающие локаль, должны использовать существующий спецификатор формата *n*, который уже имеет некоторую поддержку разделителей тысяч.6869> **См. также**70>71> **[**PEP 378**](https://python-all.ru/3/whatsnew/3.1.html) - Спецификатор формата для разделителя тысяч**72>73> PEP написан Реймондом Хеттингером, реализован Эриком Смитом и Марком Дикинсоном.7475## Другие изменения языка7677Некоторые более мелкие изменения в ядре языка Python:7879- Каталоги и zip-архивы, содержащие файл `__main__.py`, теперь можно выполнять напрямую, передавая их имя интерпретатору. Каталог/zip-файл автоматически вставляется как первая запись в sys.path. (Предложение и начальный патч: Энди Чу; доработанный патч: Филлип Дж. Эби и Ник Коглан; [bpo-1739468](https://python-all.ru/3/whatsnew/3.1.html).)80- Тип [`int()`](https://python-all.ru/3/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/whatsnew/3.1.html).)96- Поля в строках [`format()`](https://python-all.ru/3/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/whatsnew/3.1.html).)106- Функция `string.maketrans()` объявлена устаревшей и заменяется новыми статическими методами [`bytes.maketrans()`](https://python-all.ru/3/library/stdtypes.html#bytes.maketrans) и [`bytearray.maketrans()`](https://python-all.ru/3/library/stdtypes.html#bytearray.maketrans). Это изменение устраняет путаницу относительно того, какие типы поддерживаются модулем [`string`](https://python-all.ru/3/library/string.html#module-string). Теперь [`str`](https://python-all.ru/3/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3/library/stdtypes.html#bytearray) имеют собственные методы **maketrans** и **translate** с промежуточными таблицами перевода соответствующего типа.107108  (Автор: Георг Брандль; [bpo-5675](https://python-all.ru/3/whatsnew/3.1.html).)109- Синтаксис оператора [`with`](https://python-all.ru/3/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  (Авторы: Георг Брандль и Маттиас Брэндстрём; [appspot issue 53094](https://python-all.ru/3/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/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/whatsnew/3.1.html))142143## Новые, улучшенные и устаревшие модули144145- Добавлен класс [`collections.Counter`](https://python-all.ru/3/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/whatsnew/3.1.html).)153- Добавлен новый модуль [`tkinter.ttk`](https://python-all.ru/3/library/tkinter.ttk.html#module-tkinter.ttk) для доступа к набору темизированных виджетов Tk. Основная идея ttk – разделить, насколько это возможно, код, реализующий поведение виджета, и код, реализующий его внешний вид.154155  (Автор: Guilherme Polo; [bpo-2983](https://python-all.ru/3/whatsnew/3.1.html).)156- Классы [`gzip.GzipFile`](https://python-all.ru/3/library/gzip.html#gzip.GzipFile) и [`bz2.BZ2File`](https://python-all.ru/3/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/library/decimal.html#module-decimal) теперь поддерживает методы создания десятичного объекта из двоичного [`float`](https://python-all.ru/3/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/library/itertools.html#module-itertools) обзавёлся двумя новыми функциями. Функция [`itertools.combinations_with_replacement()`](https://python-all.ru/3/library/itertools.html#itertools.combinations_with_replacement) – одна из четырёх для генерации комбинаторных объектов, включая перестановки и декартовы произведения. Функция [`itertools.compress()`](https://python-all.ru/3/library/itertools.html#itertools.compress) имитирует своего тёзку из APL. Кроме того, существующая функция [`itertools.count()`](https://python-all.ru/3/library/itertools.html#itertools.count) теперь имеет необязательный аргумент *step* и может принимать любой тип счётной последовательности, включая [`fractions.Fraction`](https://python-all.ru/3/library/fractions.html#fractions.Fraction) и [`decimal.Decimal`](https://python-all.ru/3/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/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/whatsnew/3.1.html).)206- Функции [`re.sub()`](https://python-all.ru/3/library/re.html#re.sub), [`re.subn()`](https://python-all.ru/3/library/re.html#re.subn) и [`re.split()`](https://python-all.ru/3/library/re.html#re.split) теперь принимают параметр flags.207208  (Автор: Gregory Smith.)209- Модуль [`logging`](https://python-all.ru/3/library/logging.html#module-logging) теперь реализует простой класс [`logging.NullHandler`](https://python-all.ru/3/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/whatsnew/3.1.html)).217- Модуль [`runpy`](https://python-all.ru/3/library/runpy.html#module-runpy), который поддерживает ключ командной строки `-m`, теперь поддерживает выполнение пакетов: при указании имени пакета ищется и выполняется подмодуль `__main__`.218219  (Автор: Andi Vajda; [bpo-4195](https://python-all.ru/3/whatsnew/3.1.html).)220- Модуль [`pdb`](https://python-all.ru/3/library/pdb.html#module-pdb) теперь может получать доступ и отображать исходный код, загруженный через [`zipimport`](https://python-all.ru/3/library/zipimport.html#module-zipimport) (или любой другой совместимый загрузчик [**PEP 302**](https://python-all.ru/3/whatsnew/3.1.html)).221222  (Автор: Alexander Belopolsky; [bpo-4201](https://python-all.ru/3/whatsnew/3.1.html).)223- Объекты [`functools.partial`](https://python-all.ru/3/library/functools.html#functools.partial) теперь можно упаковывать с помощью pickle.224225> (Предложено Антуаном Питру и Джесси Ноллером. Реализовано Джеком Дидерихом; [bpo-5228](https://python-all.ru/3/whatsnew/3.1.html).)226227- Добавлены темы справки [`pydoc`](https://python-all.ru/3/library/pydoc.html#module-pydoc) для символов, чтобы `help('@')` работала в интерактивной среде как ожидается.228229  (Автор: Дэвид Лабан; [bpo-4739](https://python-all.ru/3/whatsnew/3.1.html).)230- Модуль [`unittest`](https://python-all.ru/3/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/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/library/unittest.html#unittest.TestCase.assertSetEqual), [`assertDictEqual()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertDictEqual), `assertDictContainsSubset()`, [`assertListEqual()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertListEqual), [`assertTupleEqual()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertTupleEqual), [`assertSequenceEqual()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertSequenceEqual), [`assertRaisesRegexp()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertRaisesRegex), [`assertIsNone()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertIsNone) и [`assertIsNotNone()`](https://python-all.ru/3/library/unittest.html#unittest.TestCase.assertIsNotNone).253254  (Авторы: Бенджамин Петерсон и Антуан Питру.)255- Модуль [`io`](https://python-all.ru/3/library/io.html#module-io) содержит три новые константы для метода [`seek()`](https://python-all.ru/3/library/io.html#io.IOBase.seek): [`SEEK_SET`](https://python-all.ru/3/library/os.html#os.SEEK_SET), [`SEEK_CUR`](https://python-all.ru/3/library/os.html#os.SEEK_CUR) и [`SEEK_END`](https://python-all.ru/3/library/os.html#os.SEEK_END).256- Кортеж [`sys.version_info`](https://python-all.ru/3/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/whatsnew/3.1.html).)264- Модули `nntplib` и [`imaplib`](https://python-all.ru/3/library/imaplib.html#module-imaplib) теперь поддерживают IPv6.265266  (Автор: Дерек Морр; [bpo-1655](https://python-all.ru/3/whatsnew/3.1.html) и [bpo-1664](https://python-all.ru/3/whatsnew/3.1.html).)267- Модуль [`pickle`](https://python-all.ru/3/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/whatsnew/3.1.html).)280- Добавлен новый модуль [`importlib`](https://python-all.ru/3/library/importlib.html#module-importlib). Он предоставляет полную, переносимую, эталонную реализацию на чистом Python оператора [`import`](https://python-all.ru/3/reference/simple_stmts.html#import) и его аналога – функции [`__import__()`](https://python-all.ru/3/library/functions.html#import__). Это представляет собой существенный шаг вперёд в документировании и определении действий, происходящих во время импорта.281282  (Автор: Бретт Кэннон.)283284## Оптимизации285286Добавлены значительные улучшения производительности:287288- Новая библиотека ввода-вывода (определённая в [**PEP 3116**](https://python-all.ru/3/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/whatsnew/3.1.html).)294- При включении опции configure с именем `--with-computed-gotos` на компиляторах, которые её поддерживают (в частности: gcc, SunPro, icc), цикл выполнения байт-кода компилируется с новым механизмом диспетчеризации, что даёт прирост производительности до 20% в зависимости от системы, компилятора и теста.295296  (Автор: Антуан Питру совместно с рядом других участников, [bpo-4753](https://python-all.ru/3/whatsnew/3.1.html)).297- Декодирование UTF-8, UTF-16 и LATIN-1 теперь в два-четыре раза быстрее.298299  (Авторы: Антуан Питру и Амори Форжо д'Арк, [bpo-4868](https://python-all.ru/3/whatsnew/3.1.html).)300- Модуль [`json`](https://python-all.ru/3/library/json.html#module-json) теперь имеет расширение на C для существенного повышения его производительности. Кроме того, API был изменён так, что json работает только с [`str`](https://python-all.ru/3/library/stdtypes.html#str), а не с [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes). Это изменение делает модуль более соответствующим [спецификации JSON](https://python-all.ru/3/whatsnew/3.1.html), которая определена в терминах Unicode.301302  (Автор: Боб Ипполито, адаптировано для Py3.1 Антуаном Питру и Бенджамином Петерсоном; [bpo-4136](https://python-all.ru/3/whatsnew/3.1.html).)303- При распаковке имена атрибутов упакованных объектов теперь интернируются. Это экономит память и позволяет уменьшить размер файлов pickle.304305  (Авторы: Джейк МакГуайр и Антуан Питру; [bpo-5084](https://python-all.ru/3/whatsnew/3.1.html).)306307## IDLE308309- Меню «Формат» в IDLE теперь содержит опцию удаления завершающих пробелов из исходного файла.310311  (Автор: Roger D. Serwy; [bpo-5150](https://python-all.ru/3/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/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/whatsnew/3.1.html).)328- Функция [`PyLong_AsUnsignedLongLong()`](https://python-all.ru/3/c-api/long.html#c.PyLong_AsUnsignedLongLong) теперь обрабатывает отрицательное *pylong*, вызывая [`OverflowError`](https://python-all.ru/3/library/exceptions.html#OverflowError) вместо [`TypeError`](https://python-all.ru/3/library/exceptions.html#TypeError).329330  (Автор: Mark Dickinson и Lisandro Dalcrin; [bpo-5175](https://python-all.ru/3/whatsnew/3.1.html).)331- Устарело `PyNumber_Int()`. Вместо этого используйте [`PyNumber_Long()`](https://python-all.ru/3/c-api/number.html#c.PyNumber_Long).332333  (Автор: Mark Dickinson; [bpo-4910](https://python-all.ru/3/whatsnew/3.1.html).)334- Добавлена новая функция [`PyOS_string_to_double()`](https://python-all.ru/3/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/whatsnew/3.1.html).)337- Добавлен [`PyCapsule`](https://python-all.ru/3/c-api/capsule.html#c.PyCapsule) как замена API `PyCObject`. Основное различие в том, что новый тип имеет чётко определённый интерфейс для передачи информации о типобезопасности и менее сложную сигнатуру для вызова деструктора. Старый тип имел проблемный API и теперь является устаревшим.338339  (Автор: Larry Hastings; [bpo-5630](https://python-all.ru/3/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