Что нового в Python 3.2¶
- Автор:
Раймонд Хеттингер
В этой статье описываются новые возможности Python 3.2 по сравнению с версией 3.1. Версия Python 3.2 была выпущена 20 февраля 2011 года. В ней рассматриваются некоторые основные моменты и приводится несколько примеров. Для получения более подробной информации смотрите файл Misc/NEWS.
См.также
PEP 392 - Расписание выхода Python 3.2
PEP 384: Определение стабильного ABI¶
В прошлом модули расширения, созданные для одной версии Python, часто были недоступны для других версий Python. Особенно в Windows, каждый функциональный выпуск Python требовал перестройки всех модулей расширения, которые хотелось использовать. Это требование было вызвано свободным доступом к внутренним компонентам интерпретатора Python, которые могли использовать модули расширения.
С Python 3.2 становится доступным альтернативный подход: модули расширения, которые ограничивают себя ограниченным API (определяя Py_LIMITED_API), не могут использовать многие внутренние компоненты, но ограничены набором функций API, которые, как обещают, будут стабильными в течение нескольких выпусков. Как следствие, модули расширения, созданные для версии 3.2 в этом режиме, также будут работать с версиями 3.3, 3.4 и т.д. Модули расширения, которые используют детали структур памяти, все еще могут быть созданы, но их необходимо будет перекомпилировать для каждого выпуска функционала.
См.также
- PEP 384 - Определение стабильного ABI
БОДРЯЩИЙ настрой, написанный Мартином фон Левисом.
PEP 389: Модуль синтаксического анализа командной строки Argparse¶
Новый модуль для синтаксического анализа командной строки, argparse
, был введен для преодоления ограничений optparse
, которые не обеспечивали поддержку позиционных аргументов (не только параметров), подкоманд, обязательных параметров и других распространенных шаблонов задания и проверки параметров.
Этот модуль уже завоевал широкую популярность в сообществе как модуль сторонних разработчиков. Благодаря более широкому функционалу, чем у его предшественника, модуль argparse
теперь является предпочтительным модулем для работы с командной строкой. Более старый модуль все еще остается доступным из-за значительного объема устаревшего кода, который зависит от него.
Вот аннотированный пример синтаксического анализатора, показывающий такие функции, как ограничение результатов набором вариантов, указание метаварианты на экране справки, проверка наличия одного или нескольких позиционных аргументов и установка требуемого параметра:
import argparse
parser = argparse.ArgumentParser(
description = 'Manage servers', # main description for help
epilog = 'Tested on Solaris and Linux') # displayed after help
parser.add_argument('action', # argument name
choices = ['deploy', 'start', 'stop'], # three allowed values
help = 'action on each target') # help msg
parser.add_argument('targets',
metavar = 'HOSTNAME', # var name used in help msg
nargs = '+', # require one or more targets
help = 'url for target machines') # help msg explanation
parser.add_argument('-u', '--user', # -u or --user option
required = True, # make it a required argument
help = 'login as user')
Пример вызова синтаксического анализатора для командной строки:
>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'deploy'
>>> result.targets
['sneezy.example.com', 'sleepy.example.com']
>>> result.user
'skycaptain'
Пример автоматически сгенерированной справки синтаксического анализатора:
>>> parser.parse_args('-h'.split())
usage: manage_cloud.py [-h] -u USER
{deploy,start,stop} HOSTNAME [HOSTNAME ...]
Manage servers
positional arguments:
{deploy,start,stop} action on each target
HOSTNAME url for target machines
optional arguments:
-h, --help show this help message and exit
-u USER, --user USER login as user
Tested on Solaris and Linux
Особенно приятной особенностью argparse
является возможность определять подпараметры, каждый из которых имеет свои собственные шаблоны аргументов и отображает справку:
import argparse
parser = argparse.ArgumentParser(prog='HELM')
subparsers = parser.add_subparsers()
parser_l = subparsers.add_parser('launch', help='Launch Control') # first subgroup
parser_l.add_argument('-m', '--missiles', action='store_true')
parser_l.add_argument('-t', '--torpedos', action='store_true')
parser_m = subparsers.add_parser('move', help='Move Vessel', # second subgroup
aliases=('steer', 'turn')) # equivalent names
parser_m.add_argument('-c', '--course', type=int, required=True)
parser_m.add_argument('-s', '--speed', type=int, default=0)
$ ./helm.py --help # top level help (launch and move)
$ ./helm.py launch --help # help for launch options
$ ./helm.py launch --missiles # set missiles=True and torpedos=False
$ ./helm.py steer --course 180 --speed 5 # set movement parameters
См.также
- PEP 389 - Новый модуль синтаксического анализа командной строки
БОДРЯЩИЙ настрой, написанный Стивеном Бетардом.
Обновление кода optparse подробнее об отличиях от optparse
.
PEP 391: Настройка ведения журнала на основе словаря¶
Модуль logging
предоставлял два вида конфигурации: один стиль с вызовами функций для каждой опции или другой стиль, управляемый внешним файлом, сохраненным в формате configparser
. Эти опции не обеспечивали гибкости для создания конфигураций из файлов JSON или YAML, а также не поддерживали инкрементную настройку, которая необходима для указания параметров регистратора из командной строки.
Для поддержки более гибкого стиля модуль теперь предлагает logging.config.dictConfig()
для задания конфигурации ведения журнала с помощью простых словарей Python. Параметры конфигурации включают средства форматирования, обработчики, фильтры и средства ведения журнала. Вот рабочий пример словаря конфигурации:
{"version": 1,
"formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},
"full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}
},
"handlers": {"console": {
"class": "logging.StreamHandler",
"formatter": "brief",
"level": "INFO",
"stream": "ext://sys.stdout"},
"console_priority": {
"class": "logging.StreamHandler",
"formatter": "full",
"level": "ERROR",
"stream": "ext://sys.stderr"}
},
"root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}
Если этот словарь хранится в файле с именем conf.json
, его можно загрузить и вызвать с помощью кода, подобного этому:
>>> import json, logging.config
>>> with open('conf.json') as f:
... conf = json.load(f)
...
>>> logging.config.dictConfig(conf)
>>> logging.info("Transaction completed normally")
INFO : root : Transaction completed normally
>>> logging.critical("Abnormal termination")
2011-02-17 11:14:36,694 root CRITICAL Abnormal termination
См.также
- PEP 391 - Настройка ведения журнала на основе словаря
БОДРЯЩИЙ настрой, написанный Винаем Саджипом.
PEP 3148: Модуль concurrent.futures
¶
Код для создания и управления параллелизмом собран в новом пространстве имен верхнего уровня concurrent. Его первым элементом является пакет futures, который предоставляет единый высокоуровневый интерфейс для управления потоками и процессами.
Дизайн concurrent.futures
был вдохновлен пакетом java.util.concurrent. В этой модели выполняющийся вызов и его результат представлены объектом Future
, который абстрагирует функции, общие для потоков, процессов и удаленных вызовов процедур. Этот объект поддерживает проверку состояния (запущено или выполнено), тайм-ауты, отмены, добавление обратных вызовов и доступ к результатам или исключениям.
Основное предложение нового модуля - это пара классов executor для запуска вызовов и управления ими. Цель executors - упростить использование существующих инструментов для выполнения параллельных вызовов. Они экономят усилия, необходимые для настройки пула ресурсов, запуска вызовов, создания очереди результатов, добавления обработки тайм-аутов и ограничения общего количества потоков, процессов или удаленных вызовов процедур.
В идеале, у каждого приложения должен быть один исполнитель для нескольких компонентов, чтобы можно было централизованно управлять ограничениями на процессы и потоки. Это решает проблему проектирования, которая возникает, когда у каждого компонента своя собственная конкурирующая стратегия управления ресурсами.
Оба класса имеют общий интерфейс с тремя методами: submit()
для планирования вызываемого объекта и возврата Future
объекта; map()
для планирования большого количества асинхронных вызовов одновременно и shutdown()
для освобождения ресурсов. Класс является context manager и может быть использован в инструкции with
, чтобы гарантировать автоматическое высвобождение ресурсов, когда завершается выполнение ожидаемых в данный момент фьючерсов.
Простым примером ThreadPoolExecutor
является запуск четырех параллельных потоков для копирования файлов:
import concurrent.futures, shutil
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
См.также
- PEP 3148 - Фьючерсы - Выполнение вычислений асинхронно
ОБОДРЕНИЕ, написанное Брайаном Квинланом.
Code for Threaded Parallel URL reads, пример использования потоков для параллельной загрузки нескольких веб-страниц.
Code for computing prime numbers in parallel, пример, демонстрирующий ProcessPoolExecutor
.
PEP 3147: Каталоги репозитория PYC¶
Схема кэширования байт-кода Python в файлах .pyc плохо работала в средах с несколькими интерпретаторами Python. Если один интерпретатор обнаружит кэшированный файл, созданный другим интерпретатором, он перекомпилирует исходный код и перезапишет кэшированный файл, тем самым теряя преимущества кэширования.
Проблема «pyc-конфликтов» стала более очевидной, поскольку для дистрибутивов Linux стало обычным делом поставлять несколько версий Python. Эти конфликты также возникают с альтернативами CPython, такими как Unladen Swallow.
Чтобы решить эту проблему, механизм импорта Python был расширен, чтобы использовать разные имена файлов для каждого интерпретатора. Вместо того, чтобы Python 3.2 и Python 3.3 и Unladen Swallow конкурировали друг с другом за файл с именем «mymodule.pyc», теперь они будут искать «mymodule.cpython-32.pyc», «mymodule.cpython-33.pyc» и «mymodule.unladen10.pyc». И чтобы все эти новые файлы не загромождали исходные каталоги, файлы pyc теперь собраны в каталоге «__pycache__», который хранится в каталоге пакетов.
Помимо имен файлов и целевых каталогов, новая схема имеет несколько аспектов, которые видны программисту:
Импортированные модули теперь имеют атрибут
__cached__
, который хранит имя фактического файла, который был импортирован:>>> import collections >>> collections.__cached__ 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
Тег, уникальный для каждого интерпретатора, доступен из модуля
imp
:>>> import imp >>> imp.get_tag() 'cpython-32'
Скрипты, которые пытаются вычислить имя исходного файла из импортированного файла, теперь должны быть умнее. Теперь недостаточно просто удалить «c» из имени файла «.pyc». Вместо этого используйте новые функции в модуле
imp
:>>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc') 'c:/py32/lib/collections.py' >>> imp.cache_from_source('c:/py32/lib/collections.py') 'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
Модули
py_compile
иcompileall
были обновлены, чтобы отразить новое соглашение об именовании и целевой каталог. Вызов из командной строки функции compileall имеет новые опции:-i
для указания списка файлов и каталогов для компиляции и-b
, который приводит к записи файлов с байт-кодом в их прежнее расположение, а не в __pycache__.Модуль
importlib.abc
был обновлен с помощью нового abstract base classes для загрузки файлов байт-кода. Устаревшие азбукиPyLoader
иPyPycLoader
были признаны устаревшими (инструкции о том, как сохранить совместимость с Python 3.1, прилагаются к документации).
См.также
- PEP 3147 - Каталоги репозитория PYC
БОДРЯЩИЙ настрой, написанный Барри Уоршоу.
PEP 3149: Файлы с тегом .so версии ABI¶
Каталог репозитория PYC позволяет совместно размещать несколько файлов кэша байт-кода. Этот PEP реализует аналогичный механизм для общих объектных файлов, предоставляя им общий каталог и разные имена для каждой версии.
Общий каталог является «pyshared» и имена файлов выделены путем выявления реализация Python (например, с CPython, в PyPy, языка Jython и т. д.), основной и дополнительный номера версии, и необязательные флаги сборки (например, «D» для отладки «м» для pymalloc, «у», Для Юникода). Для произвольного пакета «foo» вы можете увидеть эти файлы при установке дистрибутива:
/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so
В самом Python теги доступны из функций в модуле sysconfig
:
>>> import sysconfig
>>> sysconfig.get_config_var('SOABI') # find the version tag
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX') # find the full filename extension
'.cpython-32mu.so'
См.также
- PEP 3149 - Файлы с тегом .so версии ABI
БОДРЯЩИЙ настрой, написанный Барри Уоршоу.
PEP 3333: Интерфейс шлюза веб-сервера Python версии 1.0.1¶
В этом информационном руководстве разъясняется, как проблемы с байтами/текстом должны решаться с помощью протокола WSGI. Проблема заключается в том, что обработка строк в Python 3 удобнее всего выполняется с помощью типа str
, хотя сам протокол HTTP ориентирован на байты.
PEP проводит различие между так называемыми «собственными строками», которые используются для заголовков запросов/ответов и метаданных, и «байтовыми строками», которые используются для текстов запросов и ответов.
Исходные строки всегда имеют тип str
, но ограничены кодовыми точками от U+0000 до U+00FF, которые могут быть преобразованы в байты с использованием кодировки Latin-1. Эти строки используются для ключей и значений в словаре среды, а также для заголовков ответов и статусов в функции start_response()
. Они должны соответствовать RFC 2616 в отношении кодировки. То есть они должны быть либо символами ISO-8859-1, либо использовать кодировку RFC 2047 MIME.
Для разработчиков, портирующих приложения WSGI с Python 2, вот основные моменты:
Если приложение уже использовало строки для заголовков в Python 2, никаких изменений не требуется.
Если вместо этого приложение закодировало выходные заголовки или декодировало входные заголовки, то заголовки нужно будет перекодировать на латиницу-1. Например, в выходном заголовке, закодированном в utf-8, использовался
h.encode('utf-8')
, теперь необходимо преобразовать байты в собственные строки, используяh.encode('utf-8').decode('latin-1')
.Значения, выдаваемые приложением или отправляемые с помощью метода
write()
, должны быть байтовыми строками. Функцияstart_response()
и среда должны использовать собственные строки. Их нельзя смешивать.
Для разработчиков серверов, пишущих пути CGI-to-WSGI или другие протоколы в стиле CGI, пользователи должны иметь возможность доступа к среде, используя собственные строки, даже если базовая платформа может иметь другое соглашение. Чтобы устранить этот пробел, в модуле wsgiref
появилась новая функция wsgiref.handlers.read_environ()
для перекодирования CGI-переменных из os.environ
в собственные строки и возврата нового словаря.
См.также
- PEP 3333 - Интерфейс шлюза веб-сервера Python версии 1.0.1
Ободряющая фраза, написанная Филиппом Эби.
Другие языковые изменения¶
Вот некоторые небольшие изменения, внесенные в основной язык Python:
Форматирование строк для
format()
иstr.format()
получило новые возможности для символа формата #. Ранее для целых чисел в двоичном, восьмеричном или шестнадцатеричном формате это приводило к тому, что выходные данные имели префикс «0b», «0o» или «0x» соответственно. Теперь он также может обрабатывать значения с плавающей запятой, сложные и десятичные числа, в результате чего выходные данные всегда содержат десятичную точку, даже если за ней не следуют цифры.>>> format(20, '#o') '0o24' >>> format(12.34, '#5.0f') ' 12.'
(Предложено Марком Дикинсоном и реализовано Эриком Смитом в bpo-7094.)
Существует также новый метод
str.format_map()
, который расширяет возможности существующего методаstr.format()
, принимая произвольные объекты mapping. Этот новый метод позволяет использовать форматирование строк с любым из множества словарных объектов Python, таких какdefaultdict
,Shelf
,ConfigParser
, илиdbm
. Это также полезно для пользовательских подклассовdict
, которые нормализуют ключи перед поиском или предоставляют метод__missing__()
для неизвестных ключей:>>> import shelve >>> d = shelve.open('tmp.shl') >>> 'The {project_name} status is {status} as of {date}'.format_map(d) 'The testing project status is green as of February 15, 2011' >>> class LowerCasedDict(dict): ... def __getitem__(self, key): ... return dict.__getitem__(self, key.lower()) >>> lcd = LowerCasedDict(part='widgets', quantity=10) >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd) 'There are 10 widgets in stock' >>> class PlaceholderDict(dict): ... def __missing__(self, key): ... return '<{}>'.format(key) >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict()) 'Hello <name>, welcome to <location>'
(Предложено Раймондом Хеттингером и реализовано Эриком Смитом в bpo-6081.)
Теперь интерпретатор можно запускать с параметром
-q
, чтобы предотвратить отображение информации об авторских правах и версии в интерактивном режиме. Этот параметр можно настроить с помощью атрибутаsys.flags
.:$ python -q >>> sys.flags sys.flags(debug=0, division_warning=0, inspect=0, interactive=0, optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0, ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)
(Автор: Марцин Войдир в статье bpo-1772833).
Функция
hasattr()
работает путем вызоваgetattr()
и определения того, возникает ли исключение. Этот метод позволяет обнаруживать методы, созданные динамически с помощью__getattr__()
или__getattribute__()
, которые в противном случае отсутствовали бы в словаре классов. Ранее hasattr перехватывал любое исключение, возможно, маскируя подлинные ошибки. Теперь hasattr был ужесточен, чтобы перехватывать толькоAttributeError
и пропускать другие исключения:>>> class A: ... @property ... def f(self): ... return 1 // 0 ... >>> a = A() >>> hasattr(a, 'f') Traceback (most recent call last): ... ZeroDivisionError: integer division or modulo by zero
(Обнаружено Юрием Селивановым и исправлено Бенджамином Питерсоном; bpo-9666.)
Значение
str()
для числа с плавающей запятой или комплексного числа теперь совпадает с его значениемrepr()
. Раньше формаstr()
была короче, но это только вызывало путаницу и теперь больше не нужно, поскольку по умолчанию отображается максимально короткийrepr()
:>>> import math >>> repr(math.pi) '3.141592653589793' >>> str(math.pi) '3.141592653589793'
(Предложено и реализовано Марком Дикинсоном; bpo-9337.)
memoryview
у объектов теперь есть методrelease()
, и они также теперь поддерживают протокол управления контекстом. Это позволяет своевременно освобождать любые ресурсы, которые были получены при запросе буфера у исходного объекта.>>> with memoryview(b'abcdefgh') as v: ... print(v.tolist()) [97, 98, 99, 100, 101, 102, 103, 104]
(Добавлено Антуаном Питру; bpo-9757.)
Ранее было запрещено удалять имя из локального пространства имен, если оно встречается как свободная переменная во вложенном блоке:
def outer(x): def inner(): return x inner() del x
Это недопустимо. Помните, что цель предложения
except
очищена, поэтому этот код, который раньше работал с Python 2.6, вызвалSyntaxError
в Python 3.1 и теперь снова работает:def f(): def print_error(): print(e) try: something except Exception as e: print_error() # implicit "del e" here
(См. bpo-4617.)
Struct sequence types теперь являются подклассами tuple. Это означает, что структуры C, подобные тем, которые возвращаются с помощью
os.stat()
,time.gmtime()
, иsys.version_info
, теперь работают как named tuple и теперь работают с функциями и методами, которые ожидают кортеж в качестве аргумента. Это большой шаг вперед в том, чтобы сделать структуры языка Си такими же гибкими, как и их аналоги на чистом Python:>>> import sys >>> isinstance(sys.version_info, tuple) True >>> 'Version %d.%d.%d %s(%d)' % sys.version_info 'Version 3.2.0 final(0)'
(Предложено Арфревером Фрехтесом Тайферсаром Арахесисом и реализовано Бенджамином Питерсоном в bpo-8413.)
Предупреждениями теперь проще управлять, используя переменную окружения
PYTHONWARNINGS
в качестве альтернативы использованию-W
в командной строке:$ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'
(Предложено Барри Уоршоу и реализовано Филипом Дженви в bpo-7301.)
Добавлена новая категория предупреждений
ResourceWarning
. Они выдаются при обнаружении потенциальных проблем с потреблением ресурсов или очисткой. По умолчанию в обычных релизных сборках он отключен, но может быть включен с помощью средств, предоставляемых модулемwarnings
, или в командной строке.При завершении работы интерпретатора выдается
ResourceWarning
, если списокgc.garbage
не пуст, а если задано значениеgc.DEBUG_UNCOLLECTABLE
, то выводятся все объекты, которые невозможно собрать. Это делается для того, чтобы программист осознал, что в его коде есть проблемы с завершением работы с объектами.ResourceWarning
также выдается, когда file object уничтожается без явного закрытия. Хотя средство освобождения такого объекта гарантирует, что он закроет базовый системный ресурс (обычно файловый дескриптор), задержка с освобождением объекта может привести к различным проблемам, особенно в Windows. Вот пример включения предупреждения из командной строки:$ python -q -Wdefault >>> f = open("foo", "wb") >>> del f __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>
(Добавлено Антуаном Питру и Георгом Брандлом в bpo-10093 и bpo-477863.)
range
объекты теперь поддерживают методы index и count. Это является частью усилий, направленных на то, чтобы большее число объектов полностью реализовывалоcollections.Sequence
abstract base class. В результате язык будет иметь более унифицированный API. Кроме того, объектыrange
теперь поддерживают нарезку и отрицательные индексы даже для значений, превышающихsys.maxsize
. Это делает range более совместимым со списками:>>> range(0, 100, 2).count(10) 1 >>> range(0, 100, 2).index(10) 5 >>> range(0, 100, 2)[5] 10 >>> range(0, 100, 2)[0:5] range(0, 10, 2)
(Авторы: Даниэль Штутцбах в bpo-9213, Александр Белопольский в bpo-2690 и Ник Коглан в bpo-10889.)
Была восстановлена встроенная функция
callable()
из Py2.x. Она предоставляет краткую и удобочитаемую альтернативу использованию abstract base class в выражении, подобномisinstance(x, collections.Callable)
:>>> callable(max) True >>> callable(20) False
(См. bpo-10518.)
Механизм импорта Python теперь позволяет загружать модули, установленные в каталогах с символами, отличными от ASCII, в имени пути. Это решило проблему, которая усугублялась домашними каталогами для пользователей с символами, отличными от ASCII, в именах пользователей.
(Потребовалась обширная работа Виктора Стиннера в bpo-9425.)
Новые, улучшенные и устаревшие модули¶
Стандартная библиотека Python претерпела значительные изменения в обслуживании и улучшении качества.
Самой большой новостью для Python 3.2 является то, что пакет email
, модуль mailbox
и модули nntplib
теперь корректно работают с моделью bytes/text в Python 3. Впервые появилась корректная обработка сообщений со смешанными кодировками.
В стандартной библиотеке было уделено больше внимания кодировкам и соотношению текста и байтов. В частности, взаимодействие с операционной системой теперь позволяет обмениваться данными, отличными от ASCII, с использованием кодировки Windows MBCS, кодировок, учитывающих региональные стандарты, или UTF-8.
Еще одним важным преимуществом является значительно улучшенная поддержка SSL-соединений и сертификатов безопасности.
Кроме того, все больше классов теперь реализуют context manager для поддержки удобной и надежной очистки ресурсов с помощью инструкции with
.
электронная почта¶
Удобство использования пакета email
в Python 3 было в основном исправлено благодаря интенсивным усилиям Р. Дэвида Мюррея. Проблема заключалась в том, что электронные письма обычно считываются и сохраняются в виде текста bytes
, а не str
, и они могут содержать несколько кодировок в одном электронном письме. Таким образом, пакет электронной почты пришлось расширить для анализа и генерации сообщений электронной почты в байтовом формате.
Новые функции
message_from_bytes()
иmessage_from_binary_file()
, а также новые классыBytesFeedParser
иBytesParser
позволяют преобразовывать двоичные данные сообщений в объекты модели.Учитывая байты, введенные в модель,
get_payload()
по умолчанию декодирует текст сообщения, который имеет Content-Transfer-Encoding из 8 бит, используя кодировку, указанную в заголовках MIME, и возвращает результирующую строку.Учитывая байты, введенные в модель,
Generator
преобразует тела сообщений, которые имеют Content-Transfer-Encoding значение 8 бит, в 7 бит Content-Transfer-Encoding.Заголовки с незакодированными байтами, отличными от ASCII, считаются закодированными RFC 2047 с использованием набора символов unknown-8bit.
Новый класс
BytesGenerator
выдает байты в качестве выходных данных, сохраняя все неизмененные данные, отличные от ASCII, которые присутствовали во входных данных, используемых для построения модели, включая тела сообщений с Content-Transfer-Encoding, равными 8 битам.Класс
smtplib
SMTP
теперь принимает байтовую строку в качестве аргумента msg для методаsendmail()
, а новый методsend_message()
принимает объектMessage
и может дополнительно получать адреса from_addr и to_addrs непосредственно из объекта.
(Предложено и реализовано Р. Дэвидом Мюрреем, bpo-4661 и bpo-10321.)
элементарное дерево¶
Пакет xml.etree.ElementTree
и его аналог xml.etree.cElementTree
были обновлены до версии 1.3.
Было добавлено несколько новых и полезных функций и методов:
xml.etree.ElementTree.fromstringlist()
который создает XML-документ из последовательности фрагментовxml.etree.ElementTree.register_namespace()
для регистрации префикса глобального пространства именxml.etree.ElementTree.tostringlist()
для строкового представления, включающего все подспискиxml.etree.ElementTree.Element.extend()
для добавления последовательности из нуля или более элементовxml.etree.ElementTree.Element.iterfind()
выполняет поиск по элементу и подэлементамxml.etree.ElementTree.Element.itertext()
создает текстовый итератор для элемента и его подэлементовxml.etree.ElementTree.TreeBuilder.end()
закрывает текущий элементxml.etree.ElementTree.TreeBuilder.doctype()
обрабатывает объявление типа документа
Два метода были признаны устаревшими:
вместо
xml.etree.ElementTree.getchildren()
используйтеlist(elem)
.вместо
xml.etree.ElementTree.getiterator()
используйтеElement.iter
.
Подробную информацию об обновлении смотрите в разделе Introducing ElementTree на веб-сайте Фредрика Лунда.
(Авторы: Флоран Шиклуна и Фредрик Лунд, bpo-6472.)
функциональные средства¶
Модуль
functools
включает в себя новый декоратор для кэширования вызовов функций.functools.lru_cache()
позволяет сохранять повторяющиеся запросы к внешнему ресурсу всякий раз, когда ожидается, что результаты будут одинаковыми.Например, добавление декоратора кэширования к функции запроса базы данных может сохранить доступ к базе данных для популярных поисковых запросов:
>>> import functools >>> @functools.lru_cache(maxsize=300) ... def get_phone_number(name): ... c = conn.cursor() ... c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,)) ... return c.fetchone()[0]
>>> for name in user_requests: ... get_phone_number(name) # cached lookup
Чтобы помочь с выбором эффективного размера кэша, функция wrapped предназначена для отслеживания статистики кэша:
>>> get_phone_number.cache_info() CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)
Если таблица списка телефонов будет обновлена, устаревшее содержимое кэша может быть удалено с помощью:
>>> get_phone_number.cache_clear()
(Материал подготовлен Раймондом Хеттингером и включает дизайнерские идеи Джима Бейкера, Мики Тебеки и Ника Коглана; смотрите recipe 498245, recipe 577479, bpo-10586, и bpo-10593.)
Декоратор
functools.wraps()
теперь добавляет атрибут__wrapped__
, указывающий на исходную вызываемую функцию. Это позволяет анализировать встроенные функции. Он также копирует__annotations__
, если он определен. И теперь он также изящно пропускает отсутствующие атрибуты, такие как__doc__
, которые могут быть не определены для обернутого вызываемого объекта.В приведенном выше примере кэш можно удалить, восстановив исходную функцию:
>>> get_phone_number = get_phone_number.__wrapped__ # uncached function
(Авторы: Ник Коглан и Терренс Коул; bpo-9567, bpo-3445, и bpo-8814.)
Чтобы облегчить написание классов с расширенными методами сравнения, новый декоратор
functools.total_ordering()
будет использовать существующие методы равенства и неравенства для заполнения оставшихся методов.Например, указание __eq__ и __lt__ позволит
total_ordering()
заполнить __le__, __gt__ и __ge__:@total_ordering class Student: def __eq__(self, other): return ((self.lastname.lower(), self.firstname.lower()) == (other.lastname.lower(), other.firstname.lower())) def __lt__(self, other): return ((self.lastname.lower(), self.firstname.lower()) < (other.lastname.lower(), other.firstname.lower()))
С помощью декоратора total_ordering остальные методы сравнения заполняются автоматически.
(Автор - Раймонд Хеттингер.)
Чтобы облегчить перенос программ с Python 2, функция
functools.cmp_to_key()
преобразует функцию сравнения старого образца в современную key function:>>> # locale-aware sort order >>> sorted(iterable, key=cmp_to_key(locale.strcoll))
Примеры сортировки и краткое руководство по сортировке приведены в руководстве Sorting HowTo.
(Автор - Раймонд Хеттингер.)
итеративные инструменты¶
Модуль
itertools
имеет новую функциюaccumulate()
, созданную по образцу оператора Apple scan и функции Numpy accumulate:>>> from itertools import accumulate >>> list(accumulate([8, 2, 50])) [8, 10, 60]
>>> prob_dist = [0.1, 0.4, 0.2, 0.3] >>> list(accumulate(prob_dist)) # cumulative probability distribution [0.1, 0.5, 0.7, 1.0]
Пример использования
accumulate()
смотрите в examples for the random module.(Автор - Раймонд Хеттингер, с учетом дизайнерских предложений Марка Дикинсона.)
коллекции¶
В классе
collections.Counter
теперь есть две формы вычитания на месте: существующий оператор -= для saturating subtraction и новый методsubtract()
для обычного вычитания. Первый вариант подходит для multisets, которые имеют только положительные значения, а второй больше подходит для вариантов использования, которые допускают отрицательные значения:>>> from collections import Counter >>> tally = Counter(dogs=5, cats=3) >>> tally -= Counter(dogs=2, cats=8) # saturating subtraction >>> tally Counter({'dogs': 3})
>>> tally = Counter(dogs=5, cats=3) >>> tally.subtract(dogs=2, cats=8) # regular subtraction >>> tally Counter({'dogs': 3, 'cats': -5})
(Автор - Раймонд Хеттингер.)
В классе
collections.OrderedDict
есть новый методmove_to_end()
, который берет существующий ключ и перемещает его либо в первую, либо в последнюю позицию в упорядоченной последовательности.По умолчанию элемент перемещается на последнюю позицию. Это эквивалентно обновлению записи с помощью
od[k] = od.pop(k)
.Операция быстрого перехода к концу полезна для изменения последовательности записей. Например, упорядоченный словарь можно использовать для отслеживания порядка доступа к записям по возрастанию от самой старой к последней, к которой был осуществлен доступ.
>>> from collections import OrderedDict >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e']) >>> list(d) ['a', 'b', 'X', 'd', 'e'] >>> d.move_to_end('X') >>> list(d) ['a', 'b', 'd', 'e', 'X']
(Автор - Раймонд Хеттингер.)
В классе
collections.deque
появились два новых методаcount()
иreverse()
, которые делают их более взаимозаменяемыми с объектамиlist
:>>> from collections import deque >>> d = deque('simsalabim') >>> d.count('s') 2 >>> d.reverse() >>> d deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])
(Автор - Раймонд Хеттингер.)
нарезание резьбы¶
Модуль threading
имеет новый класс синхронизации Barrier
, позволяющий нескольким потокам ожидать, пока все они не достигнут общей точки барьера. Барьеры полезны для обеспечения того, чтобы задача с несколькими предварительными условиями не выполнялась до тех пор, пока не будут выполнены все предшествующие задачи.
Барьеры могут работать с произвольным количеством потоков. Это обобщение Rendezvous, которое определено только для двух потоков.
Реализованный в виде двухфазного циклического барьера, Barrier
объекты подходят для использования в циклах. Отдельные фазы заполнения и слива гарантируют, что все потоки будут освобождены (осушены), прежде чем какой-либо из них сможет вернуться в цикл и снова войти в барьер. Барьер полностью сбрасывается после каждого цикла.
Пример использования барьеров:
from threading import Barrier, Thread
def get_votes(site):
ballots = conduct_election(site)
all_polls_closed.wait() # do not count until all polls are closed
totals = summarize(ballots)
publish(site, totals)
all_polls_closed = Barrier(len(sites))
for site in sites:
Thread(target=get_votes, args=(site,)).start()
В этом примере барьер устанавливает правило, согласно которому голоса не могут быть подсчитаны ни на одном избирательном участке до тех пор, пока не будут закрыты все избирательные участки. Обратите внимание, что решение с барьером похоже на решение с threading.Thread.join()
, но потоки остаются активными и продолжают выполнять свою работу (подведение итогов голосования) после преодоления барьерной точки.
Если какая-либо из предыдущих задач может зависнуть или быть отложена, можно создать барьер с необязательным параметром timeout. Затем, если период ожидания истекает до того, как все предыдущие задачи достигнут точки барьера, все ожидающие потоки освобождаются и возникает исключение BrokenBarrierError
:
def get_votes(site):
ballots = conduct_election(site)
try:
all_polls_closed.wait(timeout=midnight - time.now())
except BrokenBarrierError:
lockbox = seal_ballots(ballots)
queue.put(lockbox)
else:
totals = summarize(ballots)
publish(site, totals)
В этом примере барьер применяет более строгое правило. Если на некоторых избирательных участках работа не завершается до полуночи, время действия барьера истекает, бюллетени опечатываются и помещаются в очередь для последующей обработки.
Смотрите Barrier Synchronization Patterns для получения дополнительных примеров того, как барьеры могут использоваться в параллельных вычислениях. Кроме того, в The Little Book of Semaphores, разделе 3.6, есть простое, но подробное объяснение барьеров.
((Автор - Кристиан Валюр Йонссон, а обзор API - Джеффри Ясскин опубликовал в bpo-8777.)
дата и время¶
Модуль
datetime
имеет новый типtimezone
, который реализует интерфейсtzinfo
, возвращая фиксированное смещение по UTC и название часового пояса. Это упрощает создание объектов даты и времени, зависящих от часового пояса:>>> from datetime import datetime, timezone >>> datetime.now(timezone.utc) datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc) >>> datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z") datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
Кроме того, объекты
timedelta
теперь можно умножать наfloat
и делить на объектыfloat
иint
. Иtimedelta
объекты теперь могут делить друг друга.Метод
datetime.date.strftime()
больше не ограничен годами после 1900 года. Новый поддерживаемый диапазон лет составляет от 1000 до 9999 включительно.Всякий раз, когда в кортеже времени используется двузначный год, интерпретация определяется значением
time.accept2dyear
. Значение по умолчанию равноTrue
, что означает, что для двузначного года столетие определяется в соответствии с правилами POSIX, регулирующими формат strptime%y
.Начиная с Py3.2, при использовании эвристики угадывания века будет выдаваться значение
DeprecationWarning
. Вместо этого рекомендуется установить значениеtime.accept2dyear
наFalse
, чтобы можно было использовать большие диапазоны дат без использования догадок:>>> import time, warnings >>> warnings.resetwarnings() # remove the default warning filters >>> time.accept2dyear = True # guess whether 11 means 11 or 2011 >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0)) Warning (from warnings module): ... DeprecationWarning: Century info guessed for a 2-digit year. 'Fri Jan 1 12:34:56 2011' >>> time.accept2dyear = False # use the full range of allowable dates >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0)) 'Fri Jan 1 12:34:56 11'
Некоторые функции теперь имеют значительно расширенные диапазоны дат. Когда
time.accept2dyear
равно false, функцияtime.asctime()
будет принимать любой год, который соответствует C int, в то время как функцииtime.mktime()
иtime.strftime()
будут принимать весь диапазон функций, поддерживаемых соответствующей операционной системой .
(Материалы предоставлены Александром Белопольским и Виктором Стиннером в bpo-1289118, bpo-5094, bpo-6641, bpo-2706, bpo-1777412, bpo-8013, и bpo-10827.)
математика¶
Модуль math
был обновлен шестью новыми функциями, разработанными в соответствии со стандартом C99.
Функция isfinite()
обеспечивает надежный и быстрый способ определения специальных значений. Она возвращает True
для обычных чисел и False
для Nan или Infinity.:
>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]
Функция expm1()
вычисляет e**x-1
для малых значений x без потери точности, которая обычно сопровождает вычитание почти равных величин:
>>> from math import expm1
>>> expm1(0.013671875) # more accurate way to compute e**x-1 for a small x
0.013765762467652909
Функция erf()
вычисляет интеграл вероятности или Gaussian error function. Дополнительная функция ошибки, erfc()
, равна 1 - erf(x)
:
>>> from math import erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0)) # portion of normal distribution within 1 standard deviation
0.682689492137086
>>> erfc(1.0/sqrt(2.0)) # portion of normal distribution outside 1 standard deviation
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0
Функция gamma()
является непрерывным продолжением факториальной функции. Подробности смотрите в разделе https://en.wikipedia.org/wiki/Gamma_function. Поскольку функция связана с факториалами, она становится большой даже при малых значениях x, поэтому существует также функция lgamma()
для вычисления натурального логарифма гамма-функции:
>>> from math import gamma, lgamma
>>> gamma(7.0) # six factorial
720.0
>>> lgamma(801.0) # log(800 factorial)
4551.950730698041
(Автор: Марк Дикинсон.)
азбука¶
Модуль abc
теперь поддерживает abstractclassmethod()
и abstractstaticmethod()
.
Эти инструменты позволяют определить abstract base class, для реализации которого требуется определенный classmethod()
или staticmethod()
:
class Temperature(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def from_fahrenheit(cls, t):
...
@abc.abstractclassmethod
def from_celsius(cls, t):
...
(Патч, представленный Дэниелом Урбаном; bpo-5867.)
ио¶
В io.BytesIO
добавлен новый метод, getbuffer()
, который обеспечивает функциональность, аналогичную memoryview()
. Он создает редактируемое представление данных без создания копии. Произвольный доступ к буферу и поддержка нотации фрагментов хорошо подходят для редактирования на месте:
>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11
>>> def change_location(buffer, record_number, location):
... start = record_number * REC_LEN + LOC_START
... buffer[start: start+LOC_LEN] = location
>>> import io
>>> byte_stream = io.BytesIO(
... b'G3805 storeroom Main chassis '
... b'X7899 shipping Reserve cog '
... b'L6988 receiving Primary sprocket'
... )
>>> buffer = byte_stream.getbuffer()
>>> change_location(buffer, 1, b'warehouse ')
>>> change_location(buffer, 0, b'showroom ')
>>> print(byte_stream.getvalue())
b'G3805 showroom Main chassis '
b'X7899 warehouse Reserve cog '
b'L6988 receiving Primary sprocket'
(Автор: Антуан Питру в статье bpo-5506.)
повторная публикация¶
При написании метода __repr__()
для пользовательского контейнера легко забыть обработать случай, когда элемент ссылается на сам контейнер. Встроенные объекты Python, такие как list
и set
, обрабатывают самореференцию, отображая «…» в рекурсивной части строки представления.
Чтобы облегчить написание таких методов __repr__()
, в модуле reprlib
появился новый декоратор recursive_repr()
, который обнаруживает рекурсивные вызовы __repr__()
и заменяет их строкой-заполнителем:
>>> class MyList(list):
... @recursive_repr()
... def __repr__(self):
... return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>
(Материал подготовлен Раймондом Хеттингером в bpo-9826 и bpo-9840.)
регистрация¶
В дополнение к конфигурации на основе словаря, описанной выше, пакет logging
имеет множество других улучшений.
Документация по ведению журнала была дополнена basic tutorial, advanced tutorialи cookbook рецептами ведения журнала. Эти документы - самый быстрый способ узнать о ведении журнала.
Функция настройки logging.basicConfig()
получила аргумент style для поддержки трех различных типов форматирования строк. По умолчанию используется «%» для традиционного %-форматирования, может быть установлено значение «{» для нового стиля str.format()
или может быть установлено значение «$» для форматирования в стиле оболочки, предоставляемого string.Template
. Следующие три конфигурации эквивалентны:
>>> from logging import basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='{', format="{name} -> {levelname} {message}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")
Если до возникновения события ведения журнала не была настроена никакая конфигурация, то теперь используется конфигурация по умолчанию с использованием StreamHandler
, направленная на sys.stderr
для событий уровня WARNING
или выше. Ранее событие, произошедшее до настройки конфигурации, либо вызывало исключение, либо автоматически отбрасывало событие в зависимости от значения logging.raiseExceptions
. Новый обработчик по умолчанию хранится в logging.lastResort
.
Использование фильтров было упрощено. Вместо создания объекта Filter
предикатом может быть любой вызываемый объект Python, который возвращает True
или False
.
Был внесен ряд других улучшений, которые повышают гибкость и упрощают настройку. Полный список изменений в Python 3.2 приведен в документации по модулю.
csv-файл¶
Модуль csv
теперь поддерживает новый диалект, unix_dialect
, который использует кавычки для всех полей и традиционный стиль Unix с '\n'
в качестве окончания строки. Зарегистрированное название диалекта - unix
.
В csv.DictWriter
есть новый метод, writeheader()
для записи начальной строки для документирования имен полей:
>>> import csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')
>>> w.writeheader()
"name","dept"
>>> w.writerows([
... {'name': 'tom', 'dept': 'accounting'},
... {'name': 'susan', 'dept': 'Salesl'}])
"tom","accounting"
"susan","sales"
(Новый диалект, предложенный Джеем Тэлботом в bpo-5975, и новый метод, предложенный Эдом Абрахамом в bpo-1537721.)
контекстная библиотека¶
Существует новый и немного сногсшибательный инструмент ContextDecorator
, который полезен для создания context manager, который выполняет двойную функцию декоратора функций.
Для удобства эта новая функциональность используется contextmanager()
, так что для поддержки обеих ролей не требуется никаких дополнительных усилий.
Основная идея заключается в том, что как контекстные менеджеры, так и декораторы функций могут использоваться для создания оболочек до и после выполнения действия. Контекстные менеджеры обертывают группу инструкций, используя инструкцию with
, а декораторы функций обертывают группу инструкций, заключенных в функцию. Таким образом, иногда возникает необходимость в написании предварительной или последующей оболочки, которую можно использовать в любой роли.
Например, иногда бывает полезно дополнить функции или группы инструкций средством ведения журнала, которое может отслеживать время входа и время выхода. Вместо того, чтобы писать для задачи как средство оформления функций, так и контекстный менеджер, contextmanager()
предоставляет обе возможности в одном определении:
from contextlib import contextmanager
import logging
logging.basicConfig(level=logging.INFO)
@contextmanager
def track_entry_and_exit(name):
logging.info('Entering: %s', name)
yield
logging.info('Exiting: %s', name)
Раньше это можно было использовать только в качестве контекстного менеджера:
with track_entry_and_exit('widget loader'):
print('Some time consuming activity goes here')
load_widget()
Теперь его можно использовать и в качестве декоратора:
@track_entry_and_exit('widget loader')
def activity():
print('Some time consuming activity goes here')
load_widget()
Попытка выполнять две роли одновременно накладывает некоторые ограничения на технику. Контекстные менеджеры обычно обладают достаточной гибкостью, чтобы возвращать аргумент, используемый оператором with
, но аналогов для декораторов функций нет.
В приведенном выше примере не существует простого способа для контекстного менеджера track_entry_and_exit вернуть экземпляр журнала для использования в теле вложенных инструкций.
(Автор: Майкл Фурд в статье bpo-9110.)
десятичная система счисления и дроби¶
Марк Дикинсон разработал элегантную и эффективную схему, гарантирующую, что различные числовые типы данных будут иметь одинаковое хэш-значение всякий раз, когда их фактические значения равны (bpo-8188).:
assert hash(Fraction(3, 2)) == hash(1.5) == \
hash(Decimal("1.5")) == hash(complex(1.5, 0))
Некоторые детали хэширования доступны с помощью нового атрибута sys.hash_info
, который описывает разрядность хэш-значения, модуль простого числа, значения хэша для infinity и nan, а также множитель, используемый для мнимой части числа:
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)
Ранее было принято решение об ограничении функциональной совместимости различных числовых типов. По-прежнему не поддерживается (и не рекомендуется) неявное смешивание в арифметических выражениях, таких как Decimal('1.1') + float('1.1')
, поскольку последнее теряет информацию в процессе построения двоичного числа с плавающей точкой. Однако, поскольку существующее значение с плавающей запятой может быть преобразовано без потерь в десятичное или рациональное представление, имеет смысл добавить их в конструктор и поддерживать сравнения смешанного типа.
Конструктор
decimal.Decimal
теперь принимает объектыfloat
напрямую, поэтому больше нет необходимости использовать методfrom_float()
(bpo-8257).Теперь полностью поддерживаются сравнения смешанных типов, так что объекты
Decimal
можно напрямую сравнивать с объектамиfloat
иfractions.Fraction
(bpo-2531 и bpo-8188).
Аналогичные изменения были внесены в fractions.Fraction
, так что методы from_float()
и from_decimal()
больше не нужны (bpo-8294):
>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
Другим полезным изменением для модуля decimal
является то, что атрибут Context.clamp
теперь является общедоступным. Это полезно при создании контекстов, соответствующих десятичным форматам обмена, указанным в IEEE 754 (см. bpo-8540).
(Авторы: Марк Дикинсон и Рэймонд Хеттингер.)
ftp-сервер¶
Класс ftplib.FTP
теперь поддерживает протокол управления контекстом для безусловного использования исключений socket.error
и закрытия FTP-соединения по завершении:
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
ftp.login()
ftp.dir()
'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 .
dr-xr-xr-x 9 ftp ftp 154 May 6 10:43 ..
dr-xr-xr-x 5 ftp ftp 4096 May 6 10:43 CentOS
dr-xr-xr-x 3 ftp ftp 18 Jul 10 2008 Fedora
Другие файлообразные объекты, такие как mmap.mmap
и fileinput.input()
, также получили возможность автоматического закрытия контекстных менеджеров:
with fileinput.input(files=('log1.txt', 'log2.txt')) as f:
for line in f:
process(line)
((Материалы предоставлены Тареком Зиаде и Джампаоло Родола в bpo-4972, а также Георгом Брандлом в bpo-8046 и bpo-1286.)
Класс FTP_TLS
теперь принимает параметр context, который представляет собой объект ssl.SSLContext
, позволяющий объединять параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долговечную) структуру.
(Автор: Джампаоло Родола; bpo-8806.)
всплывающий¶
Функции os.popen()
и subprocess.Popen()
теперь поддерживают инструкции with
для автоматического закрытия файловых дескрипторов.
(Авторы - Антуан Питру и Брайан Кертин в bpo-7461 и bpo-10554.)
выбирать¶
Модуль select
теперь предоставляет новый постоянный атрибут PIPE_BUF
, который указывает минимальное количество байт, которые гарантированно не будут заблокированы, когда select.select()
сообщит, что канал готов к записи.
>>> import select
>>> select.PIPE_BUF
512
(Доступно в системах Unix. Исправление от Себастьена Сабле в bpo-9862)
gzip и zipfile¶
gzip.GzipFile
теперь реализован io.BufferedIOBase
abstract base class ( за исключением truncate()
). Он также имеет метод peek()
и поддерживает невидимые файловые объекты, а также файловые объекты с нулевым заполнением.
Модуль gzip
также поддерживает функции compress()
и decompress()
для упрощения сжатия и распаковки данных в памяти. Имейте в виду, что текст должен быть закодирован как bytes
перед сжатием и распаковкой.:
>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode() # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42] # decompress and convert to text
'Three shall be the number thou shalt count'
(Автор - Ананд Б. Пиллаи в bpo-3488; и Антуан Питру, Нир Эйдес и Брайан Кертин в bpo-9962, bpo-1675951, bpo-7471 и bpo-2846.)
Кроме того, класс zipfile.ZipExtFile
был переработан для представления файлов, хранящихся в архиве. Новая реализация значительно быстрее и может быть преобразована в объект io.BufferedReader
для большего ускорения. Это также решает проблему, из-за которой чередующиеся вызовы read и readline давали неверные результаты.
(Исправление отправлено помощниками Nir в bpo-7610.)
архивный файл¶
Класс TarFile
теперь можно использовать в качестве контекстного менеджера. Кроме того, его метод add()
имеет новую опцию filter, которая управляет тем, какие файлы добавляются в архив, и позволяет редактировать метаданные файла.
Новая опция filter заменяет старый, менее гибкий параметр exclude, который теперь считается устаревшим. Если он указан, необязательный параметр filter должен быть равен keyword argument. Предоставленная пользователем функция фильтрации принимает объект TarInfo
и возвращает обновленный объект TarInfo
, или, если требуется исключить файл, функция может вернуть None
:
>>> import tarfile, glob
>>> def myfilter(tarinfo):
... if tarinfo.isfile(): # only save real files
... tarinfo.uname = 'monty' # redact the user name
... return tarinfo
>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:
... for filename in glob.glob('*.txt'):
... tf.add(filename, filter=myfilter)
... tf.list()
-rw-r--r-- monty/501 902 2011-01-26 17:59:11 annotations.txt
-rw-r--r-- monty/501 123 2011-01-26 17:59:11 general_questions.txt
-rw-r--r-- monty/501 3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501 124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501 1399 2011-01-26 17:59:11 semaphore_notes.txt
((Предложено Тареком Зиаде и реализовано Ларсом Густабелем в bpo-6856.)
хэшлиб¶
Модуль hashlib
имеет два новых постоянных атрибута, в которых перечислены алгоритмы хеширования, которые гарантированно присутствуют во всех реализациях, и те, которые доступны в текущей реализации:
>>> import hashlib
>>> hashlib.algorithms_guaranteed
{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}
>>> hashlib.algorithms_available
{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}
(Предложено Карлом Шене в bpo-7418.)
аст¶
Модуль ast
содержит замечательный универсальный инструмент для безопасного вычисления строк выражений с использованием синтаксиса Python literal. Функция ast.literal_eval()
служит безопасной альтернативой функции построения eval()
, которой легко злоупотребить. Python 3.2 добавляет bytes
и set
литералы в список поддерживаемых типов: строки, байты, числа, кортежи, списки, диктовки, множества, логические значения и None
.
>>> from ast import literal_eval
>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"
>>> literal_eval(request)
{'args': (2, 0.5), 'req': 3, 'func': 'pow'}
>>> request = "os.system('do something harmful')"
>>> literal_eval(request)
Traceback (most recent call last):
...
ValueError: malformed node or string: <_ast.Call object at 0x101739a10>
(Реализовано Бенджамином Петерсоном и Георгом Брандлом.)
ос¶
В разных операционных системах используются разные кодировки имен файлов и переменных среды. Модуль os
предоставляет две новые функции, fsencode()
и fsdecode()
, для кодирования и декодирования имен файлов:
>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'
Некоторые операционные системы допускают прямой доступ к закодированным байтам в среде. Если это так, то константа os.supports_bytes_environ
будет иметь значение true.
Для прямого доступа к закодированным переменным среды (если они доступны) используйте новую функцию os.getenvb()
или используйте os.environb
, которая является байтовой версией os.environ
.
(Автор: Виктор Стиннер.)
выключил¶
Функция shutil.copytree()
имеет две новые опции:
ignore_dangling_symlinks: когда
symlinks=False
, функция копирует файл, на который указывает символическая ссылка, а не саму символическую ссылку. Этот параметр отключает ошибку, возникающую, если файл не существует.copy_function: вызываемая функция, которая будет использоваться для копирования файлов.
shutil.copy2()
используется по умолчанию.
((Автор: Тарек Зиаде.)
Кроме того, модуль shutil
теперь поддерживает archiving operations для zip-файлов, несжатых tar-файлов, gzip-файлов tar и bzip-файлов tar. Также есть функции для регистрации дополнительных форматов архивируемых файлов (таких как xz-сжатые tarf-файлы или пользовательские форматы).
Основными функциями являются make_archive()
и unpack_archive()
. По умолчанию обе работают с текущим каталогом (который можно задать с помощью os.chdir()
) и с любыми подкаталогами. В имени файла архива необходимо указать полный путь. Процесс архивации является неразрушающим (исходные файлы сохраняются без изменений).
>>> import shutil, pprint
>>> os.chdir('mydata') # change to the source directory
>>> f = shutil.make_archive('/var/backup/mydata',
... 'zip') # archive the current directory
>>> f # show the name of archive
'/var/backup/mydata.zip'
>>> os.chdir('tmp') # change to an unpacking
>>> shutil.unpack_archive('/var/backup/mydata.zip') # recover the data
>>> pprint.pprint(shutil.get_archive_formats()) # display known formats
[('bztar', "bzip2'ed tar-file"),
('gztar', "gzip'ed tar-file"),
('tar', 'uncompressed tar file'),
('zip', 'ZIP file')]
>>> shutil.register_archive_format( # register a new archive format
... name='xz',
... function=xz.compress, # callable archiving function
... extra_args=[('level', 8)], # arguments to the function
... description='xz compression'
... )
((Автор: Тарек Зиаде.)
sqlite3¶
Модуль sqlite3
был обновлен до версии pysqlite 2.6.0. В нем появились две новые возможности.
Атрибут
sqlite3.Connection.in_transit
имеет значение true, если существует активная транзакция для незафиксированных изменений.Методы
sqlite3.Connection.enable_load_extension()
иsqlite3.Connection.load_extension()
позволяют загружать расширения SQLite из файлов «.so». Одним из хорошо известных расширений является расширение для полнотекстового поиска, распространяемое вместе с SQLite.
(Авторы: Р. Дэвид Мюррей и Шашват Ананд; bpo-8845.)
HTML¶
Был представлен новый модуль html
, содержащий только одну функцию, escape()
, которая используется для экранирования зарезервированных символов из HTML-разметки:
>>> import html
>>> html.escape('x > 2 && x < 7')
'x > 2 && x < 7'
разъем¶
Модуль socket
имеет два новых улучшения.
У объектов Socket теперь есть метод
detach()
, который переводит сокет в закрытое состояние без фактического закрытия базового файлового дескриптора. Последний затем можно повторно использовать для других целей. (Добавлено Антуаном Питру; bpo-8524.)socket.create_connection()
теперь поддерживается протокол управления контекстом для безусловного использования исключенийsocket.error
и закрытия сокета по завершении. (Автор: Джампаоло Родола; bpo-9794.)
протокол ssl¶
Модуль ssl
добавил ряд функций, удовлетворяющих общим требованиям к безопасным (зашифрованным, аутентифицированным) подключениям к Интернету:
Новый класс,
SSLContext
, служит контейнером для постоянных данных SSL, таких как настройки протокола, сертификаты, закрытые ключи и различные другие параметры. Он включает в себяwrap_socket()
для создания SSL-сокета из контекста SSL.Новая функция,
ssl.match_hostname()
, поддерживает проверку подлинности сервера для протоколов более высокого уровня, реализуя правила HTTPS (из RFC 2818), которые также подходят для других протоколов.Функция-конструктор
ssl.wrap_socket()
теперь принимает аргумент ciphers. В строке ciphers перечислены разрешенные алгоритмы шифрования в формате, описанном в OpenSSL documentation.При подключении к последним версиям OpenSSL модуль
ssl
теперь поддерживает расширение протокола TLS для указания имени сервера, позволяющее нескольким «виртуальным хостам» использовать разные сертификаты на одном IP-порту. Это расширение поддерживается только в клиентском режиме и активируется путем передачи аргумента server_hostname в значениеssl.SSLContext.wrap_socket()
.В модуль
ssl
добавлены различные опции, такие какOP_NO_SSLv2
, которая отключает небезопасный и устаревший протокол SSLv2.Теперь расширение загружает все шифры OpenSSL и алгоритмы дайджеста. Если некоторые SSL-сертификаты не могут быть проверены, о них сообщается как об ошибке «неизвестный алгоритм».
Используемая версия OpenSSL теперь доступна с помощью атрибутов модуля
ssl.OPENSSL_VERSION
(строка),ssl.OPENSSL_VERSION_INFO
( кортеж из 5) иssl.OPENSSL_VERSION_NUMBER
(целое число).
(Предоставлено Антуаном Питру в bpo-8850, bpo-1589, bpo-8322, bpo-5639, bpo-4870, bpo-8484, и bpo-8321.)
nntp¶
Модуль nntplib
имеет обновленную реализацию с улучшенной семантикой байтов и текста, а также более практичными API. Эти улучшения нарушают совместимость с версией nntplib в Python 3.1, которая сама по себе была частично неработоспособной.
Также была добавлена поддержка защищенных подключений как через неявный (с использованием nntplib.NNTP_SSL
), так и через явный (с использованием nntplib.NNTP.starttls()
) протокол TLS.
сертификаты¶
http.client.HTTPSConnection
, urllib.request.HTTPSHandler
и urllib.request.urlopen()
теперь примите необязательные аргументы, чтобы разрешить проверку сертификата сервера с помощью набора центров сертификации, как рекомендуется при публичном использовании HTTPS.
(Добавлено Антуаном Питру, bpo-9003.)
imaplib¶
Поддержка явного TLS для стандартных подключений IMAP4 была добавлена с помощью нового метода imaplib.IMAP4.starttls
.
(Авторы: Лоренцо М. Катуччи и Антуан Питру, bpo-4471.)
http.клиент¶
В модуле http.client
был внесен ряд небольших улучшений в API. Простые ответы HTTP 0.9 старого образца больше не поддерживаются, а параметр strict устарел во всех классах.
Классы HTTPConnection
и HTTPSConnection
теперь имеют параметр source_address для кортежа (хост, порт), указывающий, откуда осуществляется HTTP-соединение.
В HTTPSConnection
была добавлена поддержка проверки сертификатов и виртуальных хостов HTTPS.
Метод request()
для объектов connection допускал необязательный аргумент body, так что для предоставления содержимого запроса можно было использовать file object. Удобно, что аргумент body теперь также принимает объект iterable, если он содержит явный заголовок Content-Length
. Этот расширенный интерфейс стал гораздо более гибким, чем раньше.
Для установления HTTPS-соединения через прокси-сервер существует новый метод set_tunnel()
, который устанавливает хост и порт для туннелирования HTTP-соединения.
Чтобы соответствовать поведению http.server
, клиентская библиотека HTTP теперь также кодирует заголовки в кодировке ISO-8859-1 (Latin-1). Это уже делалось для входящих заголовков, так что теперь поведение согласовано как для входящего, так и для исходящего трафика. (Смотрите работу Армина Ронахера в bpo-10980.)
единичный тест¶
Модуль unittest содержит ряд улучшений, поддерживающих обнаружение тестов для пакетов, упрощающих экспериментирование в интерактивном режиме, новые методы тестирования, улучшенные диагностические сообщения о сбоях тестирования и улучшенные названия методов.
Вызов командной строки
python -m unittest
теперь может принимать пути к файлам вместо имен модулей для выполнения определенных тестов (bpo-10620). Новое средство обнаружения тестов позволяет находить тесты внутри пакетов, обнаруживая любой тест, который можно импортировать из каталога верхнего уровня. Каталог верхнего уровня можно указать с помощью параметра-t
, шаблон для сопоставления файлов с-p
и каталог для запуска поиска с помощью-s
:$ python -m unittest discover -s my_proj_dir -p _test.py
(Автор: Майкл Фурд.)
Экспериментировать с интерактивной подсказкой теперь стало проще, поскольку класс
unittest.TestCase
теперь может быть создан без аргументов:>>> from unittest import TestCase >>> TestCase().assertEqual(pow(2, 3), 8)
(Автор: Майкл Фурд.)
Модуль
unittest
содержит два новых метода:assertWarns()
иassertWarnsRegex()
для проверки того, что тестируемый код запускает данный тип предупреждения:with self.assertWarns(DeprecationWarning): legacy_function('XYZ')
(Автор: Антуан Питру, bpo-9754.)
Другой новый метод,
assertCountEqual()
, используется для сравнения двух итераций, чтобы определить, равно ли количество их элементов (присутствуют ли одни и те же элементы с одинаковым количеством вхождений независимо от порядка).:def test_anagram(self): self.assertCountEqual('algorithm', 'logarithm')
(Автор - Раймонд Хеттингер.)
Основной особенностью модуля unittest является попытка провести значимую диагностику при сбое теста. Когда это возможно, сбой регистрируется вместе с результатами тестирования. Это особенно полезно для анализа файлов журналов неудачных запусков тестов. Однако, поскольку различия иногда могут быть объемными, появился новый атрибут
maxDiff
, который устанавливает максимальную длину отображаемых различий.Кроме того, названия методов в модуле подверглись ряду исправлений.
Например,
assertRegex()
- это новое имя дляassertRegexpMatches()
, которое было неправильно названо, поскольку в тесте используетсяre.search()
, а неre.match()
. Другие методы, использующие регулярные выражения, теперь называются с использованием краткой формы «Regex» вместо «Regexp» - это соответствует именам, используемым в других реализациях unittest, соответствует старому названию модуляre
в Python и имеет однозначную верблюжью оболочку.(Автор - Раймонд Хеттингер, автор - Эцио Мелотти.)
Чтобы повысить согласованность, некоторые давние псевдонимы методов устарели в пользу предпочтительных имен:
Старое название
Предпочитаемое имя
assert_()
assertEquals()
assertNotEquals()
assertAlmostEquals()
assertNotAlmostEquals()
Аналогичным образом, ожидается, что методы
TestCase.fail*
, которые устарели в Python 3.1, будут удалены в Python 3.3. Также смотрите раздел Устаревшие псевдонимы в документацииunittest
.(Автор: Эцио Мелотти; bpo-9424.)
Метод
assertDictContainsSubset()
был признан устаревшим, поскольку он был неправильно реализован с аргументами в неправильном порядке. Это создавало труднообрабатываемые оптические иллюзии, при которых тесты, подобныеTestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})
, завершались неудачей.(Автор - Раймонд Хеттингер.)
случайный¶
Целочисленные методы в модуле random
теперь лучше справляются с получением равномерных распределений. Ранее они вычисляли выборки с помощью int(n*random())
, которые имели небольшое отклонение всякий раз, когда n не было степенью двойки. Теперь выполняется множественный выбор в диапазоне до следующей степени двойки, и выбор сохраняется только в том случае, если он попадает в диапазон 0 <= x < n
. Затронутыми функциями и методами являются randrange()
, randint()
, choice()
, shuffle()
и sample()
.
(Автор: Раймонд Хеттингер; bpo-9025.)
поплиб¶
POP3_SSL
класс теперь принимает параметр context, который представляет собой объект ssl.SSLContext
, позволяющий объединять параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долговечную) структуру.
(Автор: Джампаоло Родола; bpo-8807.)
асинхронный процессор¶
asyncore.dispatcher
теперь предоставляет метод handle_accepted()
, возвращающий пару (sock, addr)
, который вызывается, когда фактически установлено соединение с новой удаленной конечной точкой. Предполагается, что это будет использоваться в качестве замены старого handle_accept()
и позволит пользователю не вызывать accept()
напрямую.
(Автор: Джампаоло Родола; bpo-6706.)
временный файл¶
Модуль tempfile
имеет новый контекстный менеджер, TemporaryDirectory
который обеспечивает простую детерминированную очистку временных каталогов:
with tempfile.TemporaryDirectory() as tmpdirname:
print('created temporary dir:', tmpdirname)
(Авторы - Нил Шеменауэр и Ник Коглан; bpo-5178.)
проверить¶
В модуле
inspect
появилась новая функцияgetgeneratorstate()
, позволяющая легко определять текущее состояние генератора-итератора:>>> from inspect import getgeneratorstate >>> def gen(): ... yield 'demo' >>> g = gen() >>> getgeneratorstate(g) 'GEN_CREATED' >>> next(g) 'demo' >>> getgeneratorstate(g) 'GEN_SUSPENDED' >>> next(g, None) >>> getgeneratorstate(g) 'GEN_CLOSED'
(Авторы: Родольфо Экхардт и Ник Коглан, bpo-10220.)
Для поддержки поиска без возможности активации динамического атрибута в модуле
inspect
добавлена новая функцияgetattr_static()
. В отличие отhasattr()
, это настоящий поиск только для чтения, гарантирующий, что состояние не изменится во время поиска:>>> class A: ... @property ... def f(self): ... print('Running') ... return 10 ... >>> a = A() >>> getattr(a, 'f') Running 10 >>> inspect.getattr_static(a, 'f') <property object at 0x1022bd788>
(Автор: Майкл Фурд.)
pydoc¶
Модуль pydoc
теперь предоставляет значительно улучшенный интерфейс веб-сервера, а также новую опцию командной строки -b
, позволяющую автоматически открывать окно браузера для отображения этого сервера:
$ pydoc3.2 -b
(Автор: Рон Адам; bpo-2001.)
дис¶
Модуль dis
получил две новые функции для проверки кода, code_info()
и show_code()
. Обе предоставляют подробную информацию об объекте кода для предоставленной функции, метода, строки исходного кода или объекта кода. Первый возвращает строку, а второй выводит ее на экран:
>>> import dis, random
>>> dis.show_code(random.choice)
Name: choice
Filename: /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Argument count: 2
Kw-only arguments: 0
Number of locals: 3
Stack size: 11
Flags: OPTIMIZED, NEWLOCALS, NOFREE
Constants:
0: 'Choose a random element from a non-empty sequence.'
1: 'Cannot choose from an empty sequence'
Names:
0: _randbelow
1: len
2: ValueError
3: IndexError
Variable names:
0: self
1: seq
2: i
Кроме того, функция dis()
теперь принимает строковые аргументы, так что распространенная идиома dis(compile(s, '', 'eval'))
может быть сокращена до dis(s)
:
>>> dis('3*x+1 if x%2==1 else x//2')
1 0 LOAD_NAME 0 (x)
3 LOAD_CONST 0 (2)
6 BINARY_MODULO
7 LOAD_CONST 1 (1)
10 COMPARE_OP 2 (==)
13 POP_JUMP_IF_FALSE 28
16 LOAD_CONST 2 (3)
19 LOAD_NAME 0 (x)
22 BINARY_MULTIPLY
23 LOAD_CONST 1 (1)
26 BINARY_ADD
27 RETURN_VALUE
>> 28 LOAD_NAME 0 (x)
31 LOAD_CONST 0 (2)
34 BINARY_FLOOR_DIVIDE
35 RETURN_VALUE
Взятые вместе, эти улучшения упрощают изучение того, как реализован CPython, и позволяют самостоятельно увидеть, что делает синтаксис языка «под капотом».
(Автор: Ник Коглан в статье bpo-9147.)
дбм¶
Все модули базы данных теперь поддерживают методы get()
и setdefault()
.
(Предложено Рэем Алленом в bpo-9523.)
типы данных¶
Новый тип ctypes.c_ssize_t
представляет тип данных C ssize_t
.
сайт¶
Модуль site
содержит три новые функции, полезные для составления отчетов о деталях конкретной установки Python.
getsitepackages()
содержит список всех глобальных каталогов пакетов сайтов.getuserbase()
сообщает о базовом каталоге пользователя, в котором могут храниться данные.getusersitepackages()
показывает путь к каталогу пакетов сайта для конкретного пользователя.
>>> import site
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
'/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
'/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Users/raymondhettinger/Library/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'
Удобно, что некоторые функции сайта доступны непосредственно из командной строки:
$ python -m site --user-base
/Users/raymondhettinger/.local
$ python -m site --user-site
/Users/raymondhettinger/.local/lib/python3.2/site-packages
(Автор: Тарек Зиаде в статье bpo-6693.)
системная настройка¶
Новый модуль sysconfig
упрощает поиск путей установки и переменных конфигурации, которые различаются в зависимости от платформы и установки.
Модуль предоставляет доступ к простым функциям доступа к информации о платформе и версии:
get_platform()
возвращает значения типа linux-i586 или macosx-10.6-ppc.get_python_version()
возвращает строку версии Python, например «3.2».
Он также предоставляет доступ к путям и переменным, соответствующим одной из семи именованных схем, используемых distutils
. К ним относятся posix_prefix, posix_home, posix_user, nt, nt_user, os2, os2_home:
get_paths()
создает словарь, содержащий пути установки для текущей схемы установки.get_config_vars()
возвращает словарь переменных, зависящих от платформы.
Существует также удобный интерфейс командной строки:
C:\Python32>python -m sysconfig
Platform: "win32"
Python version: "3.2"
Current installation scheme: "nt"
Paths:
data = "C:\Python32"
include = "C:\Python32\Include"
platinclude = "C:\Python32\Include"
platlib = "C:\Python32\Lib\site-packages"
platstdlib = "C:\Python32\Lib"
purelib = "C:\Python32\Lib\site-packages"
scripts = "C:\Python32\Scripts"
stdlib = "C:\Python32\Lib"
Variables:
BINDIR = "C:\Python32"
BINLIBDEST = "C:\Python32\Lib"
EXE = ".exe"
INCLUDEPY = "C:\Python32\Include"
LIBDEST = "C:\Python32\Lib"
SO = ".pyd"
VERSION = "32"
abiflags = ""
base = "C:\Python32"
exec_prefix = "C:\Python32"
platbase = "C:\Python32"
prefix = "C:\Python32"
projectbase = "C:\Python32"
py_version = "3.2"
py_version_nodot = "32"
py_version_short = "3.2"
srcdir = "C:\Python32"
userbase = "C:\Documents and Settings\Raymond\Application Data\Python"
(Удалено из дистрибутива Тареком Зиаде.)
pdb (почтовый индекс)¶
Модуль отладчика pdb
получил ряд улучшений в удобстве использования:
pdb.py
теперь есть опция-c
, которая выполняет команды, указанные в файле сценария.pdbrc
.Файл сценария
.pdbrc
может содержатьcontinue
иnext
команды, которые продолжают отладку.Конструктор класса
Pdb
теперь принимает аргумент nosigint.Новые команды:
l(list)
,ll(long list)
иsource
для отображения исходного кода.Новые команды:
display
иundisplay
для отображения или скрытия значения выражения, если оно изменилось.Новая команда:
interact
для запуска интерактивного интерпретатора, содержащего глобальные и локальные имена, найденные в текущей области видимости.Точки останова могут быть очищены по номеру точки останова.
(Авторы: Георг Брандл, Антонио Куни и Илья Сандлер.)
анализатор конфигурации¶
Модуль configparser
был изменен для улучшения удобства использования и предсказуемости синтаксического анализатора по умолчанию и поддерживаемого им синтаксиса INI. Старый класс ConfigParser
был удален в пользу SafeConfigParser
, который, в свою очередь, был переименован в ConfigParser
. Поддержка встроенных комментариев теперь отключена по умолчанию, и дублирование разделов или параметров запрещено в одном источнике конфигурации.
Анализаторы конфигурации получили новый API, основанный на протоколе сопоставления:
>>> parser = ConfigParser()
>>> parser.read_string("""
... [DEFAULT]
... location = upper left
... visible = yes
... editable = no
... color = blue
...
... [main]
... title = Main Menu
... color = green
...
... [options]
... title = Options
... """)
>>> parser['main']['color']
'green'
>>> parser['main']['editable']
'no'
>>> section = parser['options']
>>> section['title']
'Options'
>>> section['title'] = 'Options (editable: %(editable)s)'
>>> section['title']
'Options (editable: no)'
Новый API реализован поверх классического API, поэтому пользовательские подклассы синтаксического анализатора должны иметь возможность использовать его без изменений.
Структура INI-файла, принятая анализаторами конфигурации, теперь может быть изменена. Пользователи могут указать альтернативные разделители параметров/значений и префиксы комментариев, изменить название раздела «ПО УМОЛЧАНИЮ» или переключить синтаксис интерполяции.
Имеется поддержка подключаемой интерполяции, включая дополнительный обработчик интерполяции ExtendedInterpolation
:
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},
... 'custom': {'prefix': '/usr/local'}})
>>> parser.read_string("""
... [buildout]
... parts =
... zope9
... instance
... find-links =
... ${buildout:directory}/downloads/dist
...
... [zope9]
... recipe = plone.recipe.zope9install
... location = /opt/zope
...
... [instance]
... recipe = plone.recipe.zope9instance
... zope9-location = ${zope9:location}
... zope-conf = ${custom:prefix}/etc/zope.conf
... """)
>>> parser['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> parser['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = parser['instance']
>>> instance['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance['zope9-location']
'/opt/zope'
Также был добавлен ряд более мелких функций, таких как поддержка указания кодировки в операциях чтения, указание резервных значений для функций get или чтение непосредственно из словарей и строк.
(Все изменения внес Лукаш Ланга.)
urllib.синтаксический анализ¶
Для модуля urllib.parse
был внесен ряд улучшений в удобство использования.
Функция urlparse()
теперь поддерживает IPv6 адресов, как описано в RFC 2732:
>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/')
ParseResult(scheme='http',
netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
path='/foo/',
params='',
query='',
fragment='')
Функция urldefrag()
теперь возвращает значение named tuple:
>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', fragment='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'target'
Кроме того, функция urlencode()
теперь стала гораздо более гибкой, принимая в качестве аргумента query либо тип string, либо тип bytes. Если это строка, то параметры safe, encoding и error отправляются в quote_plus()
для кодирования:
>>> urllib.parse.urlencode([
... ('type', 'telenovela'),
... ('name', '¿Dónde Está Elisa?')],
... encoding='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'
Как подробно описано в Синтаксический анализ байтов, закодированных в формате ASCII, все функции urllib.parse
теперь принимают в качестве входных данных байтовые строки в кодировке ASCII, если они не смешаны с обычными строками. Если в качестве параметров заданы байтовые строки в кодировке ASCII, то возвращаемые типы также будут байтовыми строками в кодировке ASCII:
>>> urllib.parse.urlparse(b'http://www.python.org:80/about/')
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
path=b'/about/', params=b'', query=b'', fragment=b'')
(Работа Ника Коглана, Дэна Мана и Сентила Кумарана в книге bpo-2987, bpo-5468, и bpo-9873.)
почтовый ящик¶
Благодаря совместным усилиям Р. Дэвида Мюррея в Python 3.2 был исправлен модуль mailbox
. Проблема заключалась в том, что изначально почтовый ящик был спроектирован с текстовым интерфейсом, но сообщения электронной почты лучше всего отображать с помощью bytes
, поскольку различные части сообщения могут быть изменены. могут иметь разные кодировки.
Решение использовало двоичную поддержку пакета email
для анализа произвольных сообщений электронной почты. Кроме того, решение потребовало внесения ряда изменений в API.
Как и ожидалось, метод add()
для объектов mailbox.Mailbox
теперь принимает двоичный ввод.
StringIO
и ввод текстового файла устарели. Кроме того, ввод строки завершится ошибкой на ранней стадии, если используются символы, отличные от ASCII. Ранее это приводило к сбою при обработке электронного письма на более позднем этапе.
Также поддерживается двоичный вывод. Метод get_file()
теперь возвращает файл в двоичном режиме (раньше он неправильно переводил файл в текстовый режим). Существует также новый метод get_bytes()
, который возвращает bytes
представление сообщения, соответствующего заданному ключу.
Все еще возможно получить недвоичный вывод, используя метод get_string()
старого API, но этот подход не очень полезен. Вместо этого лучше извлекать сообщения из объекта Message
или загружать их из двоичного ввода.
(Автор - Р. Дэвид Мюррей, при содействии Штеффена Даоде Нурпмесо и первоначальном исправлении Виктором Стиннером в bpo-9124.)
обезглавленный демон¶
Демонстрационный код для модуля turtle
был перенесен из каталога Demo в основную библиотеку. Он включает в себя более десятка примеров сценариев с живым отображением. Поскольку он включен в sys.path
, его теперь можно запускать непосредственно из командной строки:
$ python -m turtledemo
(Перенесено из демонстрационного каталога Александром Белопольским в bpo-10199.)
Многопоточность¶
Был переписан механизм сериализации выполнения одновременно запущенных потоков Python (обычно известный как GIL или глобальная блокировка интерпретатора). Среди целей были более предсказуемые интервалы переключения и снижение накладных расходов из-за конфликта блокировок и количества последующих системных вызовов. Понятие «контрольный интервал», позволяющий переключать потоки, было отменено и заменено абсолютной продолжительностью, выраженной в секундах. Этот параметр можно настроить с помощью
sys.setswitchinterval()
. В настоящее время по умолчанию он равен 5 миллисекундам.Дополнительные сведения о реализации можно прочитать из python-dev mailing-list message (однако «приоритетные запросы», указанные в этом сообщении, не были сохранены для включения).
(Автор - Антуан Питру.)
Обычные и рекурсивные блокировки теперь принимают необязательный аргумент timeout для своего метода
acquire()
. (Автор - Антуан Питру; bpo-7316.)Аналогично,
threading.Semaphore.acquire()
также получил аргумент «тайм-аут». (Автор: Торстен Ландшофф; bpo-850728.)Регулярное и рекурсивное получение блокировок теперь может быть прервано сигналами на платформах, использующих Pthreads. Это означает, что программы на Python, которые блокируются при получении блокировок, могут быть успешно завершены повторной отправкой SIGINT процессу (нажатием Ctrl+C в большинстве оболочек). (Автор: Рид Клекнер; bpo-8844.)
Оптимизация¶
Был добавлен ряд небольших улучшений производительности:
Оптимизатор peephole в Python теперь распознает такие шаблоны, как
x in {1, 2, 3}
, как тест на принадлежность к набору констант. Оптимизатор преобразуетset
вfrozenset
и сохраняет предварительно созданную константу.Теперь, когда ограничение скорости устранено, целесообразно начать писать тесты членства с использованием нотации set. Этот стиль является одновременно семантически понятным и оперативным:
extension = name.rpartition('.')[2] if extension in {'xml', 'html', 'xhtml', 'css'}: handle(name)
(Исправление и дополнительные тесты предоставлены Дэйвом Малкольмом; bpo-6690).
Сериализация и несериализация данных с помощью модуля
pickle
теперь выполняется в несколько раз быстрее.(Материалы предоставлены Александром Вассалотти, Антуаном Питру и командой Unladen Swallow в bpo-9410 и bpo-3873.)
Timsort algorithm, используемый в
list.sort()
иsorted()
, теперь работает быстрее и использует меньше памяти при вызове с помощью key function. Ранее каждый элемент списка был обернут временным объектом, который запоминал значение ключа, связанное с каждым элементом. Теперь два массива ключей и значений сортируются параллельно. Это экономит память, занимаемую обработчиками сортировки, и время, потраченное на делегирование сравнений.(Исправление от Дэниела Штутцбаха в bpo-9915.)
Производительность декодирования JSON улучшена, а потребление памяти сокращено всякий раз, когда одна и та же строка повторяется для нескольких ключей. Кроме того, при кодировании в формате JSON теперь используется ускорение C, когда аргумент
sort_keys
имеет значение true.(Авторы: Антуан Питру в bpo-7451 и Раймонд Хеттингер и Антуан Питру в bpo-10314.)
Рекурсивные блокировки (созданные с помощью
threading.RLock()
API) теперь выигрывают от реализации на C, которая делает их такими же быстрыми, как и обычные блокировки, и в 10-15 раз быстрее, чем их предыдущая реализация на чистом Python.(Автор: Антуан Питру; bpo-3001.)
Алгоритм быстрого поиска в stringlib теперь используется методами
split()
,rsplit()
,splitlines()
иreplace()
для объектовbytes
,bytearray
иstr
. Аналогично, этот алгоритм также используется вrfind()
,rindex()
,rsplit()
иrpartition()
.Преобразование целого числа в строку теперь выполняется по две «цифры» за раз, что сокращает количество операций деления и преобразования по модулю.
(bpo-6713 авторы: Гавейн Болтон, Марк Дикинсон и Виктор Стиннер.)
Было произведено еще несколько незначительных оптимизаций. Определение различий в наборах теперь выполняется быстрее, когда один операнд намного больше другого (исправление от Andress Bennetts в bpo-8685). Метод array.repeat()
имеет более быструю реализацию (bpo-1569291 автор Александр Белопольский). Метод BaseHTTPRequestHandler
имеет более эффективную буферизацию (bpo-3709 автор Эндрю Шааф). Функция operator.attrgetter()
была ускорена (bpo-10160 Кристосом Георгиу). И ConfigParser
загружает многострочные аргументы немного быстрее (bpo-7113 Лукаша Ланга).
Юникод¶
Python был обновлен до Unicode 6.0.0. В обновлении стандарта добавлено более 2000 новых символов, включая символы emoji, которые важны для мобильных телефонов.
Кроме того, обновленный стандарт изменил свойства символов для двух символов каннада (U+0CF1, U+0CF2) и одного нового цифрового символа Тайлу (U+19DA), что позволяет использовать первый из них в идентификаторах, но исключает второй. Дополнительные сведения см. в разделе Unicode Character Database Changes.
Кодеки¶
Добавлена поддержка арабской кодировки DOS для cp720 (bpo-1616979).
Кодировка MBCS больше не игнорирует аргумент обработчика ошибок. В строгом режиме по умолчанию она выдает UnicodeDecodeError
при обнаружении не поддающейся расшифровке последовательности байтов и UnicodeEncodeError
для не поддающегося расшифровке символа.
Кодек MBCS поддерживает 'strict'
и 'ignore'
обработчики ошибок для декодирования, а также 'strict'
и 'replace'
для кодирования.
Чтобы эмулировать кодировку MBCS на Python3.1, выберите обработчик 'ignore'
для декодирования и обработчик 'replace'
для кодирования.
В Mac OS X Python декодирует аргументы командной строки с помощью 'utf-8'
, а не с помощью языковой кодировки.
По умолчанию tarfile
использует кодировку 'utf-8'
в Windows (вместо 'mbcs'
) и обработчик ошибок 'surrogateescape'
во всех операционных системах.
Документация¶
Документация продолжает совершенствоваться.
Таблица быстрых ссылок была добавлена в начало длинных разделов, таких как Встроенные функции. В случае с
itertools
ссылки сопровождаются таблицами с краткими описаниями в стиле читательских таблиц, чтобы обеспечить общий обзор и подзарядку памяти без необходимости читать все документы.В некоторых случаях чистый исходный код Python может быть полезным дополнением к документации, поэтому теперь во многих модулях есть быстрые ссылки на последнюю версию исходного кода. Например, в документации по модулю
functools
вверху есть быстрая ссылка с надписью:Исходный код Lib/functools.py.
(Автор - Раймонд Хеттингер; см. rationale.)
Документы теперь содержат больше примеров и рецептов. В частности, в модуле
re
есть обширный раздел Примеры регулярных выражений. Аналогично, модульitertools
продолжает обновляться новыми Рецепты Itertools.Модуль
datetime
теперь имеет вспомогательную реализацию на чистом Python. Функциональность не была изменена. Это просто обеспечивает более удобную для чтения альтернативную реализацию.(Автор: Александр Белопольский в статье bpo-9528.)
Не поддерживаемый каталог
Demo
был удален. Некоторые демонстрации были включены в документацию, некоторые были перемещены в каталогTools/demo
, а другие были удалены вообще.(Автор: Георг Брандл в статье bpo-7962.)
праздный¶
Хранилище кода¶
В дополнение к существующему репозиторию кода Subversion по адресу https://svn.python.org теперь есть репозиторий Mercurial по адресу https://hg.python.org/.
После выхода версии 3.2 планируется перейти на Mercurial в качестве основного репозитория. Эта распределенная система контроля версий должна упростить для членов сообщества создание внешних наборов изменений и совместное использование ими. Подробности см. в PEP 385.
Чтобы научиться пользоваться новой системой контроля версий, ознакомьтесь с Quick Start или Guide to Mercurial Workflows.
Изменения в сборке и C API¶
Изменения в процессе сборки Python и в C API включают:
Сценарии idle, pydoc и 2to3 теперь устанавливаются с суффиксом, зависящим от версии, на
make altinstall
(bpo-10679).Функции C, которые обращаются к базе данных Unicode, теперь принимают и возвращают символы из полного диапазона Unicode даже в узких сборках unicode (Py_UNICODE_TOLOWER, Py_UNICODE_ISDECIMAL и другие). Заметное отличие в Python заключается в том, что
unicodedata.numeric()
теперь возвращает правильное значение для больших кодовых точек, аrepr()
может использовать больше символов для печати.((Сообщено Бупджо Ли и исправлено Амором Форжо Д’Арком; bpo-5127.)
Вычисляемые переходы теперь включены по умолчанию в поддерживаемых компиляторах (которые определяются сценарием configure). Их по-прежнему можно выборочно отключить, указав
--without-computed-gotos
.(Автор: Антуан Питру; bpo-9203.)
Параметр
--with-wctype-functions
был удален. Теперь для всех функций используется встроенная база данных unicode.(Автор: Амор Форжо Д’Арк; bpo-9210.)
Хэш-значения теперь имеют новый тип:c:type:Py_hash_t, который определяется как размер указателя. Ранее они имели тип long, который в некоторых 64-разрядных операционных системах по-прежнему имеет длину всего 32 бита. В результате этого исправления
set
иdict
теперь могут содержать более2**32
записей в сборках с 64-разрядными указателями (ранее они могли увеличиваться до такого размера, но их производительность катастрофически снижалась).(Предложено Раймондом Хеттингером и реализовано Бенджамином Питерсоном; bpo-9778.)
Новый макрос
Py_VA_COPY
копирует состояние переменной argument list. Он эквивалентен C99 va_copy, но доступен на всех платформах Python (bpo-2443).Новая функция C API: c:func:!PySys_SetArgvEx позволяет встроенному интерпретатору устанавливать
sys.argv
без каких-либо измененийsys.path
(bpo-5753).PyEval_CallObject()
теперь доступен только в виде макроса. Объявление функции, которое было сохранено из соображений обратной совместимости, теперь удалено - макрос был введен в 1997 (bpo-8276).Появилась новая функция : c:func:PyLong_AsLongLongAndOverflow, которая аналогична
PyLong_AsLongAndOverflow()
. Они оба служат для преобразования Pythonint
в собственный тип с фиксированной шириной, обеспечивая обнаружение случаев, когда преобразование не подходит (bpo-7767).Функция
PyUnicode_CompareWithASCIIString()
теперь возвращает значение не равно, если строка Python завершается значением NUL.Появилась новая функция : c:func:PyErr_NewExceptionWithDoc, которая похожа на
PyErr_NewException()
, но позволяет указать строку документации. Это позволяет исключениям на языке Си обладать теми же возможностями самодокументирования, что и их аналоги на чистом Python (bpo-7033).При компиляции с параметром
--with-valgrind
распределитель pymalloc будет автоматически отключен при запуске в Valgrind. Это обеспечивает улучшенное обнаружение утечек памяти при работе под управлением Valgrind, в то же время используя преимущества pymalloc в другое время (bpo-2422).Удален формат
O?
из функций PyArg_Parse. Этот формат больше не используется и никогда не был задокументирован (bpo-8837).
В C-API был внесен ряд других небольших изменений. Полный список приведен в файле Misc/NEWS.
Кроме того, был выпущен ряд обновлений для сборки Mac OS X, подробности смотрите в разделе Mac/BuildScript/README.txt. Пользователям, использующим 32/64-разрядную сборку, известна проблема с Tcl/Tk по умолчанию в Mac OS X 10.6. Соответственно, мы рекомендуем установить обновленную альтернативу, такую как ActiveState Tcl/Tk 8.5.9. Дополнительную информацию смотрите в разделе https://www.python.org/download/mac/tcltk/.
Перенос на Python 3.2¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код:
В модуле
configparser
есть ряд исправлений. Основное изменение заключается в замене старого классаConfigParser
на давно пользующийся спросом альтернативный классSafeConfigParser
. Кроме того, существует ряд более мелких несовместимостей:Синтаксис интерполяции теперь проверен на
get()
иset()
операциях. В схеме интерполяции по умолчанию допустимы только два токена со знаками процента:%(name)s
и%%
, причем последний является экранированным знаком процента.Методы
set()
иadd_section()
теперь проверяют, что значения являются фактическими строками. Ранее неподдерживаемые типы могли вводиться непреднамеренно.Дублирующиеся разделы или параметры из одного источника теперь вызывают либо
DuplicateSectionError
, либоDuplicateOptionError
. Раньше дублирующиеся элементы автоматически перезаписывали предыдущую запись.Встроенные комментарии теперь по умолчанию отключены, так что теперь символ ; можно безопасно использовать в значениях.
Комментарии теперь могут быть с отступом. Следовательно, чтобы ; или #* появлялись в начале строки в многострочных значениях, их необходимо интерполировать. Это предотвращает ошибочное принятие символов префикса комментария в значениях за комментарии.
""
теперь является допустимым значением и больше не преобразуется автоматически в пустую строку. Для пустых строк используйте"option ="
в строке.
Модуль
nntplib
был значительно переработан, что означает, что его API-интерфейсы часто несовместимы с API-интерфейсами версии 3.1.bytearray
объекты больше нельзя использовать в качестве имен файлов; вместо этого их следует преобразовать вbytes
.array.tostring()
иarray.fromstring()
были переименованы вarray.tobytes()
иarray.frombytes()
для большей ясности. Старые названия устарели. (см. bpo-8990).PyArg_Parse*()
функции:формат «t#» был удален: вместо него используйте «s#» или «s*»
форматы «w» и «w#» были удалены: вместо них используйте «w*»
Тип
PyCObject
, который устарел в версии 3.1, был удален. Чтобы обернуть непрозрачные указатели C в объекты Python, вместо этого следует использовать APIPyCapsule
; новый тип имеет четко определенный интерфейс для передачи информации о безопасности ввода и менее сложную сигнатуру для вызова деструктора.Функция
sys.setfilesystemencoding()
была удалена из-за ее некорректного дизайна.Функция и метод
random.seed()
теперь преобразуют начальные значения строк в хэш-функцию sha512. Чтобы получить доступ к предыдущей версии seed для воспроизведения последовательностей Python 3.1, задайте аргументу version значение 1,random.seed(s, version=1)
.Ранее устаревшая функция
string.maketrans()
была удалена в пользу статических методовbytes.maketrans()
иbytearray.maketrans()
. Это изменение устраняет путаницу в отношении того, какие типы поддерживались модулемstring
. Теперь,str
,bytes
, иbytearray
у каждого из них есть свои собственные методы maketrans и translate с промежуточными таблицами перевода соответствующего типа.(Автор: Георг Брандл; bpo-5675.)
Ранее устаревшая функция
contextlib.nested()
была удалена в пользу простого оператораwith
, который может принимать несколько контекстных менеджеров. Последний метод быстрее (поскольку он встроен) и лучше справляется с завершением работы нескольких контекстных менеджеров, когда один из них вызывает исключение:with open('mylog.txt') as infile, open('a.out', 'w') as outfile: for line in infile: if '<critical>' in line: outfile.write(line)
(При участии Георга Брандла и Маттиаса Брандстрема; appspot issue 53094.)
struct.pack()
теперь допускает только байты для кода пакета строкs
. Раньше он принимал текстовые аргументы и неявно кодировал их в байты, используя UTF-8. Это было проблематично, поскольку предполагало правильную кодировку, а также потому, что кодировка переменной длины может привести к сбою при записи в сегмент структуры фиксированной длины.Такой код, как
struct.pack('<6sHHBBB', 'GIF87a', x, y)
, следует переписать, чтобы использовать байты вместо текста,struct.pack('<6sHHBBB', b'GIF87a', x, y)
.(Обнаружено Дэвидом Бизли и исправлено Виктором Стиннером; bpo-10783.)
Класс
xml.etree.ElementTree
теперь выдаетxml.etree.ElementTree.ParseError
при сбое синтаксического анализа. Ранее он выдавалxml.parsers.expat.ExpatError
.Новое, более длинное значение
str()
с плавающей точкой может нарушить работу тестов, которые основаны на старом формате вывода.В
subprocess.Popen
значение по умолчанию для close_fds теперь равноTrue
в Unix; в Windows оно равноTrue
, если для трех стандартных потоков задано значениеNone
,False
в противном случае. Ранее значение close_fds по умолчанию всегда былоFalse
, что приводило к трудноразрешимым ошибкам или условиям гонки, когда дескрипторы открытых файлов попадали в дочерний процесс.Поддержка устаревшего протокола HTTP версии 0.9 была удалена из
urllib.request
иhttp.client
. Такая поддержка по-прежнему присутствует на стороне сервера (вhttp.server
).(Автор: Антуан Питру, bpo-10711.)
SSL-сокеты в режиме тайм-аута теперь выдают
socket.timeout
при истечении времени ожидания, а не обычныйSSLError
.(Автор: Антуан Питру, bpo-10272.)
Вводящие в заблуждение функции
PyEval_AcquireLock()
иPyEval_ReleaseLock()
официально признаны устаревшими. Вместо этого следует использовать API, зависящие от состояния потока (такие как : c:func:PyEval_SaveThread иPyEval_RestoreThread()
).Из-за угроз безопасности
asyncore.handle_accept()
был признан устаревшим, и для его замены была добавлена новая функцияasyncore.handle_accepted()
.(Автор: Джампаоло Родола в bpo-6706.)
Из-за новой реализации GIL,
PyEval_InitThreads()
больше не может быть вызван передPy_Initialize()
.