Що нового в Python 2.7¶
- Автор
A.M. Kuchling (amk в amk.ca)
У цій статті пояснюється нові функції в Python 2.7. Python 2.7 був випущений 3 липня 2010 року.
Обробку чисел було покращено багатьма способами, як для чисел з плаваючою комою, так і для класу Decimal
. Є деякі корисні доповнення до стандартної бібліотеки, такі як значно покращений модуль unittest
, модуль argparse
для аналізу параметрів командного рядка, зручний OrderedDict
і Counter
класи в модулі collections
та багато інших покращень.
Планується, що Python 2.7 стане останнім випуском 2.x, тому ми працювали над тим, щоб зробити його хорошим випуском у довгостроковій перспективі. Щоб допомогти з перенесенням на Python 3, кілька нових функцій із серії Python 3.x було включено у 2.7.
Ця стаття не намагається надати повну специфікацію нових функцій, натомість надає зручний огляд. Щоб отримати повну інформацію, зверніться до документації для Python 2.7 за адресою https://docs.python.org. Якщо ви хочете зрозуміти обґрунтування дизайну та реалізації, зверніться до PEP щодо конкретної нової функції або проблеми на https://bugs.python.org, у якій обговорювалася зміна. Коли це можливо, «Що нового в Python» посилається на елемент помилки/виправлення для кожної зміни.
Майбутнє для Python 2.x¶
Python 2.7 є останнім великим випуском серії 2.x, оскільки розробники Python перенесли фокус своїх зусиль щодо розробки нових функцій на серію Python 3.x. Це означає, що в той час як Python 2 продовжує отримувати виправлення помилок і буде оновлюватися для правильного створення на новому апаратному забезпеченні та версіях підтримуваних операційних систем, не буде нових випусків повних функцій для мови або стандартної бібліотеки.
Однак, хоча між Python 2.7 і Python 3 існує велика спільна підмножина, і багато змін, пов’язаних із переходом до цієї спільної підмножини або безпосередньо до Python 3, можна безпечно автоматизувати, деякі інші зміни (зокрема ті, що пов’язані з обробкою Unicode ) може вимагати ретельного розгляду та, бажано, надійних автоматизованих наборів регресійних тестів для ефективної міграції.
Це означає, що Python 2.7 залишатиметься на місці протягом тривалого часу, забезпечуючи стабільну та підтримувану базову платформу для виробничих систем, які ще не перенесено на Python 3. Повний очікуваний життєвий цикл серії Python 2.7 детально описано в PEP 373.
Ось деякі ключові наслідки довгострокового значення 2.7:
Як зазначалося вище, випуск 2.7 має набагато довший період обслуговування порівняно з попередніми версіями 2.x. Наразі очікується, що Python 2.7 підтримуватиметься основною командою розробників (отримаючи оновлення безпеки та інші виправлення помилок) принаймні до 2020 року (через 10 років після початкового випуску порівняно з типовішим періодом підтримки 18–24 місяців).
Оскільки стандартна бібліотека Python 2.7 старіє, ефективне використання індексу пакетів Python (пряме або через розповсюджувач) стає більш важливим для користувачів Python 2. На додаток до широкого спектру пакетів сторонніх розробників для різних завдань, доступні пакети включають бекпорти нових модулів і функцій із стандартної бібліотеки Python 3, які сумісні з Python 2, а також різні інструменти та бібліотеки, які можуть спростити перейдіть на Python 3. Посібник користувача з упаковки Python містить вказівки щодо завантаження та встановлення програмного забезпечення з індексу пакетів Python.
Хоча зараз кращим підходом до покращення Python 2 є публікація нових пакетів у індексі пакетів Python, цей підхід не обов’язково працює у всіх випадках, особливо у випадках, пов’язаних із безпекою мережі. У виняткових випадках, які не можуть бути належним чином оброблені шляхом публікації нових або оновлених пакетів на PyPI, процес Python Enhancement Proposal може бути використаний для аргументації додавання нових функцій безпосередньо до стандартної бібліотеки Python 2. Будь-які такі доповнення та версії обслуговування, де вони були додані, будуть зазначені в розділі Нові функції, додані до випусків обслуговування Python 2.7 нижче.
Для проектів, які бажають перейти з Python 2 на Python 3, або для розробників бібліотек і фреймворків, які бажають підтримувати користувачів як на Python 2, так і на Python 3, доступні різноманітні інструменти та посібники, які допоможуть вибрати відповідний підхід і керувати деякими з технічні деталі. Рекомендованою відправною точкою є Porting Python 2 Code to Python 3 посібник HOWTO.
Зміни в обробці попереджень про припинення підтримки¶
Для Python 2.7 було прийнято політичне рішення за умовчанням вимикати попередження, які цікавлять лише розробників. DeprecationWarning
та його нащадки тепер ігноруються, якщо не вказано інше, що запобігає перегляду попереджень, викликаних програмою. Цю зміну також було внесено у гілку, яка стала Python 3.2. (Обговорено на stdlib-sig і виконано в bpo-7319.)
У попередніх випусках повідомлення DeprecationWarning
було ввімкнено за замовчуванням, надаючи розробникам Python чітке вказівку про те, де їхній код може бути зламаний у майбутній основній версії Python.
Проте все більше користувачів програм на основі Python не беруть безпосередньої участі в розробці цих програм. Повідомлення DeprecationWarning
не мають значення для таких користувачів, змушуючи їх турбуватися про програму, яка справді працює правильно, і обтяжуючи розробників програм реагуванням на ці проблеми.
Ви можете знову ввімкнути відображення повідомлень DeprecationWarning
, запустивши Python із перемикачем -Wdefault
(коротка форма: -Wd
) або встановивши перемикач PYTHONWARNINGS
Перед запуском Python для змінної середовища установіть значення "default"
(або "d"
). Код Python також може повторно ввімкнути їх, викликавши warnings.simplefilter('default')
.
Модуль unittest
також автоматично повторно вмикає попередження про застаріле під час виконання тестів.
Функції Python 3.1¶
Подібно до того, як Python 2.6 включив функції з Python 3.0, версія 2.7 містить деякі нові функції в Python 3.1. Серія 2.x продовжує надавати інструменти для переходу на серію 3.x.
Неповний список функцій 3.1, які були перенесені до 2.7:
Синтаксис літералів набору (
{1,2}
є змінним набором).Словник і набір розуміння (
{i: i*2 for i in range(3)}
).Кілька менеджерів контексту в одному операторі
with
.Нова версія бібліотеки
io
, переписана на C для підвищення продуктивності.Тип упорядкованого словника, описаний у PEP 372: Додавання впорядкованого словника до колекцій.
Новий специфікатор формату
","
, описаний у PEP 378: Специфікатор формату для розділювача тисяч.Об’єкт
memoryview
.Невелика підмножина модуля
importlib
, описаного нижче.repr()
числа з плаваючою точкоюx
у багатьох випадках коротше: тепер воно базується на найкоротшому десятковому рядку, який гарантовано повертає назад доx
. Як і в попередніх версіях Python, гарантовано, щоfloat(repr(x))
відновлюєx
.Перетворення float-to-string і string-to-float правильно округлені. Функція
round()
також тепер правильно округлена.Тип
PyCapsule
, який використовується для надання C API для модулів розширення.Функція C API
PyLong_AsLongAndOverflow()
.
Інші нові попередження режиму Python3 включають:
operator.isCallable()
іoperator.sequenceIncludes()
, які не підтримуються в 3.x, тепер викликають попередження.Перемикач
-3
тепер автоматично вмикає перемикач-Qwarn
, який викликає попередження про використання класичного ділення на цілі та довгі цілі числа.
PEP 372: Додавання впорядкованого словника до колекцій¶
Звичайні словники Python перебирають пари ключ/значення в довільному порядку. Протягом багатьох років кілька авторів написали альтернативні реалізації, які запам’ятовують порядок початкового вставлення ключів. Базуючись на досвіді цих реалізацій, 2.7 представляє новий клас OrderedDict
в модулі collections
.
OrderedDict
API надає той самий інтерфейс, що й звичайні словники, але повторює ключі та значення в гарантованому порядку залежно від того, коли ключ було вперше вставлено:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Якщо новий запис перезаписує існуючий запис, вихідна позиція вставки залишається незмінною:
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
Видалення запису та повторне його вставлення перемістить його в кінець:
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
Метод popitem()
має додатковий останній аргумент, який за умовчанням має значення True
. Якщо last має значення true, повертається та видаляється останній доданий ключ; якщо він false, вибирається найстаріший ключ:
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
Порівняння двох упорядкованих словників перевіряє як ключі, так і значення, і вимагає, щоб порядок вставки був однаковим:
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
Порівняння OrderedDict
зі звичайним словником ігнорує порядок вставки та просто порівнює ключі та значення.
How does the OrderedDict
work? It maintains a
doubly-linked list of keys, appending new keys to the list as they’re inserted.
A secondary dictionary maps keys to their corresponding list node, so
deletion doesn’t have to traverse the entire linked list and therefore
remains O(1).
Стандартна бібліотека тепер підтримує використання впорядкованих словників у кількох модулях.
Модуль
ConfigParser
використовує їх за замовчуванням, тобто файли конфігурації тепер можна читати, змінювати та потім записувати назад у вихідному порядку.Метод
_asdict()
дляcollections.namedtuple()
тепер повертає впорядкований словник із значеннями, що з’являються в тому самому порядку, що й базові індекси кортежу.The
json
module’sJSONDecoder
class constructor was extended with an object_pairs_hook parameter to allowOrderedDict
instances to be built by the decoder. Support was also added for third-party tools like PyYAML.
Дивись також
- PEP 372 - Додавання впорядкованого словника до колекцій
PEP, написаний Арміном Роначером і Раймондом Геттінгером; реалізований Раймондом Хеттінгером.
PEP 378: Специфікатор формату для розділювача тисяч¶
Щоб зробити вихідні дані програми більш читабельними, може бути корисно додати роздільники до великих чисел, відображаючи їх як 18,446,744,073,709,551,616 замість 18446744073709551616.
Повністю загальним рішенням для цього є модуль locale
, який може використовувати різні роздільники («,» у Північній Америці, «.» у Європі) і різні розміри групування, але locale
є складним. для використання та непридатний для багатопоточних програм, де різні потоки створюють вихід для різних локалей.
Таким чином, до міні-мови, яка використовується методом str.format()
, додано простий механізм групування комами. Під час форматування числа з плаваючою комою просто додайте кому між шириною та точністю:
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
Форматуючи ціле число, додайте кому після ширини:
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
Цей механізм взагалі не адаптується; коми завжди використовуються як роздільники, а групування завжди відбувається у тризначні групи. Механізм форматування комами не такий загальний, як модуль locale
, але ним простіше користуватися.
Дивись також
- PEP 378 - Специфікатор формату для розділювача тисяч
PEP, написаний Раймондом Геттінгером; реалізований Еріком Смітом.
PEP 389: Модуль argparse для розбору командних рядків¶
Модуль argparse
для аналізу аргументів командного рядка було додано як більш потужну заміну модулю optparse
.
Це означає, що тепер Python підтримує три різні модулі для аналізу аргументів командного рядка: getopt
, optparse
і argparse
. Модуль getopt
дуже нагадує функцію getopt()
бібліотеки C, тому він залишається корисним, якщо ви пишете прототип Python, який згодом буде переписано на C. optparse
стає зайвий, але немає планів його видалення, оскільки багато сценаріїв все ще використовують його, і немає автоматичного способу оновлення цих сценаріїв. (Створення API argparse
узгодженого з інтерфейсом optparse
обговорювалося, але було відхилено як надто брудне та складне.)
Коротше кажучи, якщо ви пишете новий сценарій і вам не потрібно турбуватися про сумісність із попередніми версіями Python, використовуйте argparse
замість optparse
.
Ось приклад:
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
Якщо ви не заміните його, перемикачі -h
і --help
додаються автоматично та створюють акуратно відформатований вихід:
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
Як і у випадку з optparse
, ключі та аргументи командного рядка повертаються як об’єкт з атрибутами, названими параметрами dest:
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse
має набагато кращу перевірку, ніж optparse
; ви можете вказати точну кількість аргументів у вигляді цілого числа, 0 або більше аргументів, передавши '*'
, 1 або більше, передавши '+'
, або необов’язковий аргумент за допомогою '?'
. Парсер верхнього рівня може містити суб-парсери для визначення підкоманд, які мають різні набори перемикачів, як-от svn commit
, svn checkout
тощо. Ви можете вказати тип аргументу як FileType
, який автоматично відкриватиме для вас файли та розуміє, що '-'
означає стандартне введення або виведення.
Дивись також
argparse
документаціяСторінка документації модуля argparse.
- Оновлення коду optparse
Частина документації Python, яка описує, як конвертувати код, який використовує
optparse
.- PEP 389 - argparse - Новий модуль аналізу командного рядка
PEP написаний і реалізований Стівеном Бетардом.
PEP 391: Конфігурація на основі словника для журналювання¶
Модуль logging
дуже гнучкий; Програми можуть визначати дерево підсистем журналювання, і кожен реєстратор у цьому дереві може фільтрувати певні повідомлення, форматувати їх по-різному та направляти повідомлення до різної кількості обробників.
Уся ця гнучкість може вимагати багато налаштувань. Ви можете писати оператори Python для створення об’єктів і встановлення їхніх властивостей, але для складного налаштування потрібен багатослівний, але нудний код. logging
також підтримує функцію fileConfig()
, яка аналізує файл, але формат файлу не підтримує налаштування фільтрів, і програмно генерувати його складніше.
Python 2.7 додає функцію dictConfig()
, яка використовує словник для налаштування журналювання. Існує багато способів створення словника з різних джерел: створити словник за допомогою коду; розібрати файл, що містить JSON; або використовуйте бібліотеку аналізу YAML, якщо вона встановлена. Для отримання додаткової інформації див. Configuration functions.
У наступному прикладі налаштовуються два реєстратори, кореневий реєстратор і реєстратор під назвою «мережа». Повідомлення, надіслані до кореневого реєстратора, надсилатимуться до системного журналу за допомогою протоколу системного журналу, а повідомлення до «мережевого» реєстратора записуватимуться у файл network.log
, який буде обертатися, коли розмір журналу досягне 1 МБ.
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
Три менші вдосконалення модуля logging
, усі реалізовані Вінаєм Саджипом, це:
Клас
SysLogHandler
тепер підтримує ведення системного журналу через TCP. Конструктор має параметр socktype, що вказує тип сокета для використання:socket.SOCK_DGRAM
для UDP абоsocket.SOCK_STREAM
для TCP. Стандартним протоколом залишається UDP.Екземпляри
Logger
отримали методgetChild()
, який отримує реєстратор-нащадок за допомогою відносного шляху. Наприклад, якщо ви отримуєте реєстратор за допомогоюlog = getLogger('app')
, викликlog.getChild('network.listen')
еквівалентнийgetLogger('app.network. слухай')
.Клас
LoggerAdapter
отримав методisEnabledFor()
, який приймає рівень і повертає інформацію про те, чи обробить основний реєстратор повідомлення такого рівня важливості.
Дивись також
- PEP 391 - Конфігурація для журналювання на основі словника
PEP написаний і реалізований Вінаєм Саджипом.
PEP 3106: Перегляди словника¶
Методи словника keys()
, values()
і items()
відрізняються в Python 3.x. Вони повертають об’єкт під назвою view замість повністю матеріалізованого списку.
Неможливо змінити значення, що повертаються keys()
, values()
і items()
у Python 2.7, тому що забагато коду порушить роботу. Замість цього було додано версії 3.x під новими назвами viewkeys()
, viewvalues()
і viewitems()
.
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
Подання можна повторювати, але подання ключів і елементів також поводяться як набори. Оператор &
виконує перетин, а |
виконує об’єднання:
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
Перегляд відстежує словник і його вміст змінюється, коли словник змінюється:
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
Однак зауважте, що ви не можете додавати або видаляти ключі під час перегляду перегляду:
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Ви можете використовувати методи перегляду в коді Python 2.x, а конвертер 2to3 змінить їх на стандартні keys()
, values()
і Методи items()
.
PEP 3137: об’єкт memoryview¶
Об’єкт memoryview
забезпечує перегляд вмісту пам’яті іншого об’єкта, який відповідає інтерфейсу типу bytes
.
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
Вміст подання можна перетворити на рядок байтів або список цілих чисел:
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
Об’єкти memoryview
дозволяють змінювати базовий об’єкт, якщо він змінний.
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
Інші зміни мови¶
Деякі менші зміни, внесені до основної мови Python:
Синтаксис літералів набору було перенесено з Python 3.x. Фігурні дужки використовуються для обведення вмісту отриманого змінного набору; Літерали набору відрізняються від словників тим, що вони не містять двокрапки та значень.
{}
продовжує представляти порожній словник; використовуйтеset()
для порожнього набору.>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
Підтримано Александром Вассалотті; bpo-2335.
Розуміння словників і наборів — ще одна функція, портована з версії 3.x, яка узагальнює розуміння списків/генераторів для використання літерального синтаксису для наборів і словників.
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
Підтримано Александром Вассалотті; bpo-2333.
Оператор
with
тепер може використовувати кілька менеджерів контексту в одному операторі. Менеджери контексту обробляються зліва направо, і кожен з них розглядається як початок нового оператораwith
. Це означає що:with A() as a, B() as b: ... suite of statements ...
еквівалентно:
with A() as a: with B() as b: ... suite of statements ...
Функція
contextlib.nested()
надає дуже схожу функцію, тому вона більше не потрібна і є застарілою.(Запропоновано в https://codereview.appspot.com/53094; реалізовано Георгом Брандлом.)
Перетворення між числами з плаваючою комою та рядками тепер правильно округлені на більшості платформ. Ці перетворення відбуваються в багатьох різних місцях:
str()
для чисел з плаваючою точкою та комплексних чисел; конструкториfloat
іcomplex
; форматування чисел; серіалізація та десеріалізація плаваючих і комплексних чисел за допомогою модулівmarshal
,pickle
іjson
; розбір літералів з плаваючою точкою та уявних літералів у коді Python; і перетворення зDecimal
в число з плаваючою точкою.Пов’язано з цим,
repr()
числа з плаваючою комою x тепер повертає результат на основі найкоротшого десяткового рядка, який гарантовано повертається до x за правильного округлення (з округленням від половини до- рівномірний режим округлення). Раніше він давав рядок на основі округлення x до 17 десяткових цифр.Бібліотека округлення, відповідальна за це вдосконалення, працює на платформах Windows і Unix за допомогою компіляторів gcc, icc або suncc. Може існувати невелика кількість платформ, на яких коректна робота цього коду не може бути гарантована, тому код не використовується в таких системах. Ви можете дізнатися, який код використовується, перевіривши
sys.float_repr_style
, який будеshort
, якщо новий код використовується, іlegacy
, якщо він не використовується.Реалізовано Еріком Смітом і Марком Дікінсоном, використовуючи бібліотеку
dtoa.c
Девіда Гея; bpo-7117.Перетворення довгих цілих і звичайних цілих чисел у числа з плаваючою комою тепер округлюються по-різному, повертаючи найближче до числа число з плаваючою комою. Це не має значення для малих цілих чисел, які можна точно перетворити, але для великих чисел, які неминуче втратять точність, Python 2.7 тепер наближається точніше. Наприклад, Python 2.6 обчислив наступне:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Результат Python 2.7 з плаваючою комою більший, але набагато ближчий до справжнього значення:
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(Реалізовано Марком Дікінсоном; bpo-3166.)
Цілочисельне ділення також є більш точним у своїй поведінці округлення. (Також реалізовано Марком Дікінсоном; bpo-1811.)
Неявний примус для комплексних чисел видалено; інтерпретатор більше ніколи не намагатиметься викликати метод
__coerce__()
для складних об’єктів. (Видалено Меадор Інґе та Марком Дікінсоном; bpo-5211.)Метод
str.format()
тепер підтримує автоматичну нумерацію полів заміни. Це робить використанняstr.format()
більш схожим на використання%s
форматування:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
Автоматична нумерація виконує поля зліва направо, тому перший специфікатор
{...}
використовуватиме перший аргументstr.format()
, наступний специфікатор використовуватиме наступний аргумент, а так далі. Ви не можете змішувати автоматичну нумерацію та явну нумерацію — або пронумеруйте всі поля специфікаторів, або жодне з них — але ви можете поєднувати автоматичну нумерацію та іменовані поля, як у другому прикладі вище. (Надав Ерік Сміт; bpo-5237.)Комплексні числа тепер правильно підтримують використання з
format()
і за замовчуванням вирівнюються по правому краю. Вказівка точності або розділення комами застосовується як до дійсної, так і до уявної частин числа, але задана ширина поля та вирівнювання застосовуються до всього результуючого результату1,5+3j
. (Надав Ерік Сміт; bpo-1588 і bpo-7988.)Код формату «F» тепер завжди форматує вихідні дані за допомогою символів у верхньому регістрі, тому тепер він створюватиме «INF» і «NAN». (Надав Ерік Сміт; bpo-3382.)
Зміна низького рівня: метод
object.__format__()
тепер запускаєPendingDeprecationWarning
, якщо передано рядок формату, оскільки метод__format__()
дляobject
перетворює об’єкт до рядкового представлення та форматує це. Раніше метод мовчки застосовував рядок формату до представлення рядка, але це могло приховати помилки в коді Python. Якщо ви надаєте інформацію про форматування, таку як вирівнювання або точність, імовірно, ви очікуєте, що форматування буде застосовано певним чином, що стосується конкретного об’єкта. (Виправлено Еріком Смітом; bpo-7994.)Типи
int()
іlong()
отримали методbit_length
, який повертає кількість бітів, необхідних для представлення свого аргументу в двійковому вигляді:>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(Надано Фредріком Йоханссоном і Віктором Стіннером; bpo-3439.)
Оператор
import
більше не намагатиметься виконати абсолютний імпорт, якщо відносний імпорт (наприклад,from .os import sep
) не вдається. Це виправляє помилку, але, можливо, може порушити певні операториimport
, які працювали лише випадково. (Виправлено Meador Inge; bpo-7902.)Тепер підклас вбудованого типу
unicode
може перевизначати метод__unicode__()
. (Реалізовано Віктором Стіннером; bpo-1583863.)Метод
translate()
типуbytearray
тепер приймає як перший аргументNone
. (Виправлено Георгом Брандлом; bpo-4759.)У разі використання
@classmethod
і@staticmethod
для обгортання методів як методів класу або статичних методів, об’єкт-огортка тепер надає обгорнуту функцію як їхній атрибут__func__
. (Надано Аморі Форже д’Арк за пропозицією Джорджа Саккіса; bpo-5982.)Коли обмежений набір атрибутів було встановлено за допомогою
__slots__
, видалення невстановленого атрибута не викликало бAttributeError
, як ви очікували. Виправлено Бенджаміном Петерсоном; bpo-7604.)Тепер підтримуються два нових кодування: «cp720», що використовується переважно для арабського тексту; і «cp858», варіант CP 850, який додає символ євро. (CP720 надано Олександром Бельченком і Аморі Форже д’Арком у bpo-1616979; CP858 надано Тімом Хетчем у bpo-8016.)
Об’єкт
file
тепер встановлюватиме атрибутfilename
на винятокIOError
під час спроби відкрити каталог на платформах POSIX (відзначено Яном Калішевським; bpo-4764) , і тепер явно перевіряє та забороняє запис у файлові об’єкти, призначені лише для читання, замість того, щоб довіряти бібліотеці C виявити та повідомити про помилку (виправлено Стефаном Крахом; bpo-5677).Токенізатор Python тепер сам перекладає закінчення рядків, тож вбудована функція
compile()
тепер приймає код із використанням будь-якої угоди про закінчення рядків. Крім того, більше не потрібно, щоб код закінчувався символом нового рядка.Додаткові круглі дужки у визначеннях функцій заборонені в Python 3.x, що означає, що ви отримуєте синтаксичну помилку від
def f((x)): pass
. У режимі попередження Python3 Python 2.7 тепер попереджатиме про це дивне використання. (Примітив Джеймс Лінгард; bpo-7362.)Тепер можна створювати слабкі посилання на об’єкти класу старого стилю. Класи нового стилю завжди мали слабкі посилання. (Виправлено Антуаном Пітру; bpo-8268.)
Коли об’єкт модуля збирає сміття, словник модуля тепер очищається, лише якщо ніхто інший не містить посилання на словник (bpo-7140).
Зміни перекладача¶
Нова змінна середовища, PYTHONWARNINGS
, дозволяє контролювати попередження. Його слід встановити на рядок, що містить параметри попередження, еквівалентні тим, що використовуються з перемикачем -W
, розділені комами. (Надав Браян Кертін; bpo-7301.)
Наприклад, наступний параметр друкуватиме попередження кожного разу, коли вони виникають, але перетворюватиме попередження від модуля Cookie
на помилку. (Точний синтаксис для встановлення змінної середовища залежить від операційної системи та оболонки.)
export PYTHONWARNINGS=all,error:::Cookie:0
Оптимізації¶
Додано кілька покращень продуктивності:
Було додано новий код операції, щоб виконати початкове налаштування операторів
with
, шукаючи методи__enter__()
і__exit__()
. (Надав Бенджамін Петерсон.)Збирач сміття тепер працює краще для одного загального шаблону використання: коли багато об’єктів виділяється без відміни жодного з них. Раніше це займало квадратичний час для збирання сміття, але тепер кількість повних збирань сміття зменшується, оскільки кількість об’єктів у купі зростає. Нова логіка виконує повне збирання сміття лише тоді, коли середнє покоління було зібрано 10 разів і коли кількість уцілілих об’єктів із середнього покоління перевищує 10% від кількості об’єктів у найстарішому поколінні. (Запропоновано Мартіном фон Льовісом і реалізовано Антуаном Пітру; bpo-4074.)
Збирач сміття намагається уникати відстеження простих контейнерів, які не можуть бути частиною циклу. У Python 2.7 це тепер вірно для кортежів і dicts, що містять атомарні типи (такі як int, strings тощо). Транзитивно, dict, що містить кортежі атомарних типів, також не відстежуватиметься. Це допомагає зменшити вартість кожного збору сміття за рахунок зменшення кількості об’єктів, які розглядаються та обходяться збирачем. (Надав Антуан Пітру; bpo-4688.)
Довгі цілі числа тепер зберігаються внутрішньо або в основі
2**15
, або в базі2**30
, причому база визначається під час створення. Раніше вони завжди зберігалися в базі2**15
. Використання бази2**30
дає значне покращення продуктивності на 64-розрядних машинах, але результати порівняльного тестування на 32-розрядних машинах були неоднозначними. Тому за замовчуванням на 64-розрядних машинах використовується основа2**30
і основа2**15
на 32-розрядних машинах; в Unix є новий параметр конфігурації--enable-big-digits
, який можна використовувати для заміни цього значення за замовчуванням.Окрім покращення продуктивності, ця зміна має бути непомітною для кінцевих користувачів, за одним винятком: для цілей тестування та налагодження існує новий structseq
sys.long_info
, який надає інформацію про внутрішній формат, надаючи кількість бітів на цифру і розмір у байтах типу C, який використовується для зберігання кожної цифри:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(Надав Марк Дікінсон; bpo-4258.)
Інший набір змін зробив довгі об’єкти на кілька байтів меншими: на 2 байти менше в 32-бітних системах і на 6 байтів у 64-бітних. (Надав Марк Дікінсон; bpo-5260.)
Алгоритм ділення для довгих цілих чисел було зроблено швидшим завдяки посиленню внутрішнього циклу, виконанню зсувів замість множень і виправленню непотрібної додаткової ітерації. Різні контрольні тести показують прискорення від 50% до 150% для довгих цілих ділень і операцій за модулем. (Надано Марком Дікінсоном; bpo-5512.) Побітові операції також значно швидші (початковий патч Грегорі Сміта; bpo-1087418).
Реалізація
%
перевіряє, чи лівий операнд є рядком Python, і вводить його в спеціальні регістри; це призводить до збільшення продуктивності на 1–3% для програм, які часто використовують%
з рядками, наприклад бібліотек шаблонів. (Реалізовано Колліном Вінтером; bpo-5176.)Розуміння списків із умовою
if
компілюється у швидший байт-код. (Патч Антуана Пітру, перенесено на 2.7 Джеффрі Яскіним; bpo-4715.)Перетворення цілого або довгого цілого числа в десятковий рядок стало швидшим за допомогою спеціальної бази 10 замість використання узагальненої функції перетворення, яка підтримує довільні основи. (Патч від Гавейна Болтона; bpo-6713.)
Методи
split()
,replace()
,rindex()
,rpartition()
іrsplit()
рядкових типів (рядки, рядки Unicode таbytearray
об’єкти) тепер використовують швидкий алгоритм зворотного пошуку замість посимвольного сканування. Іноді це швидше в 10 разів. (Додав Florent Xicluna; bpo-7462 і bpo-7622.)Модулі
pickle
іcPickle
тепер автоматично інтернують рядки, які використовуються для імен атрибутів, зменшуючи використання пам’яті об’єктів, отриманих у результаті видалення. (Надав Джейк Макгуайр; bpo-5084.)Модуль
cPickle
тепер використовує словники для спеціальних регістрів, майже вдвічі скорочуючи час, необхідний для їх маринування. (Надав Колін Вінтер; bpo-5670.)
Нові та вдосконалені модулі¶
Як і в кожному випуску, стандартна бібліотека Python отримала низку вдосконалень і виправлень помилок. Ось неповний список найбільш помітних змін, відсортованих за алфавітом назв модулів. Зверніться до файлу Misc/NEWS
у дереві вихідних кодів, щоб отримати більш повний список змін, або перегляньте журнали Subversion, щоб отримати всі деталі.
Базовий клас налагодження
Bdb
модуляbdb
отримав можливість пропускати модулі. Конструктор тепер приймає ітераційний елемент, що містить шаблони у стилі glob, такі якdjango.*
; налагоджувач не ввійде в кадри стека з модуля, який відповідає одному з цих шаблонів. (Надано Maru Newby за пропозицією Senthil Kumaran; bpo-5142.)Модуль
binascii
тепер підтримує API буфера, тому його можна використовувати з примірникамиmemoryview
та іншими подібними об’єктами буфера. (Портпортовано з 3.x Флораном Ксіклюною; bpo-7703.)Updated module: the
bsddb
module has been updated from 4.7.2devel9 to version 4.8.4 of the pybsddb package. The new version features better Python 3.x compatibility, various bug fixes, and adds several new BerkeleyDB flags and methods. (Updated by Jesús Cea Avión; bpo-8156. The pybsddb changelog can be read at http://hg.jcea.es/pybsddb/file/tip/ChangeLog.)Модуль
bz2
BZ2File
тепер підтримує протокол керування контекстом, тому ви можете писатиwith bz2.BZ2File(...) як f:
. (Надав Hagen Fürstenau; bpo-3860.)Новий клас: клас
Counter
у модуліcollections
корисний для підрахунку даних. ЕкземпляриCounter
поводяться здебільшого як словники, але повертають нуль за відсутні ключі замість того, щоб викликатиKeyError
:>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
Є три додаткові методи
Counter
.most_common()
повертає N найпоширеніших елементів та їх кількість.elements()
повертає ітератор над вмістом елементів, повторюючи кожен елемент стільки разів, скільки його кількість.subtract()
приймає iterable і віднімає один для кожного елемента замість додавання; якщо аргументом є словник або іншийCounter
, кількість віднімається.>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
Надав Реймонд Геттінгер; bpo-1696199.
Новий клас:
OrderedDict
описано в попередньому розділі PEP 372: Додавання впорядкованого словника до колекцій.Новий метод: Тип даних
deque
тепер має методcount()
, який повертає кількість елементів, що містяться, що дорівнює наданому аргументу x, іreverse()
метод, який перевертає елементи deque на місці.deque
також показує свою максимальну довжину як атрибутmaxlen
лише для читання. (Обидві функції додав Реймонд Геттінгер.)Клас
namedtuple
тепер має додатковий параметр rename. Якщо rename має значення true, назви полів, які є недійсними через те, що вони повторювалися або не є допустимими ідентифікаторами Python, буде перейменовано на офіційні імена, які походять від позиції поля в списку полів:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(Додав Раймонд Геттінгер; bpo-1818.)
Нарешті,
Mapping
абстрактний базовий клас тепер повертаєNotImplemented
, якщо зіставлення порівнюється з іншим типом, який не єMapping
. (Виправлено Даніелем Штуцбахом; bpo-8729.)Конструктори для класів синтаксичного аналізу в модулі
ConfigParser
тепер приймають параметр allow_no_value, за умовчанням значення false; якщо істина, параметри без значень будуть дозволені. Наприклад:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(Надав Матс Кіндаль; bpo-7005.)
Застаріла функція:
contextlib.nested()
, яка дозволяє працювати з кількома контекстними менеджерами за допомогою одного оператораwith
, застаріла, оскільки операторwith
тепер підтримує кілька контекстних менеджерів .Модуль
cookielib
тепер ігнорує файли cookie з недійсним полем версії, яке не містить цілого значення. (Виправлено Джоном Дж. Лі; bpo-3924.)Функція
deepcopy()
модуляcopy
тепер правильно копіюватиме зв’язані методи примірників. (Реалізовано Робертом Коллінзом; bpo-1515.)Модуль
ctypes
тепер завжди перетворюєNone
на покажчик CNULL
для аргументів, оголошених як покажчики. (Змінено Томасом Хеллером; bpo-4606.) Базову бібліотеку libffi було оновлено до версії 3.0.9, що містить різні виправлення для різних платформ. (Оновлено Маттіасом Клозе; bpo-8142.)Новий метод: клас
timedelta
модуляdatetime
отримав методtotal_seconds()
, який повертає кількість секунд у тривалості. (Надав Браян Квінлан; bpo-5788.)Новий метод: клас
Decimal
отримав метод класуfrom_float()
, який виконує точне перетворення числа з плаваючою комою вDecimal
. Це точне перетворення прагне до найближчого десяткового наближення до значення представлення з плаваючою комою; тому отримане десяткове значення все одно включатиме похибку, якщо така є. Наприклад,Decimal.from_float(0.1)
повертаєDecimal('0.1000000000000000055511151231257827021181583404541015625')
. (Реалізовано Raymond Hettinger; bpo-4796.)Порівняння екземплярів
Decimal
з числами з плаваючою комою тепер дає розумні результати на основі числових значень операндів. Раніше такі порівняння поверталися до стандартних правил Python для порівняння об’єктів, які давали довільні результати на основі їх типу. Зауважте, що ви все ще не можете поєднуватиDecimal
і число з плаваючою точкою в інших операціях, таких як додавання, оскільки вам слід явно вибирати спосіб конвертації між float іDecimal
. (Виправлено Марком Дікінсоном; bpo-2531.)Конструктор для
Decimal
тепер приймає числа з плаваючою комою (додано Raymond Hettinger; bpo-8257) і неєвропейські символи Unicode, такі як арабсько-індійські цифри (надано Марком Дікінсоном; : випуск: 6595).Більшість методів класу
Context
тепер приймають цілі числа, а також екземпляриDecimal
; єдиним винятком є методиcanonical()
іis_canonical()
. (Патч від Хуана Хосе Конті; bpo-7633.)Під час використання екземплярів
Decimal
із методомformat()
рядка вирівнювання за замовчуванням раніше було лівим. Це було змінено на вирівнювання по правому краю, що є більш розумним для числових типів. (Змінено Марком Дікінсоном; bpo-6857.)Порівняння, що включають сигнальне значення NaN (або
sNAN
), тепер сигналізуютьInvalidOperation
замість мовчки повертати значення true або false залежно від оператора порівняння. Тихі значення NaN (абоNaN
) тепер можна хешувати. (Виправлено Марком Дікінсоном; bpo-7279.)Модуль
difflib
тепер створює вивід, який є більш сумісним із сучасними інструментами diff/patch завдяки одній невеликій зміні, використовуючи символ табуляції замість пробілів як роздільник у заголовку, що дає ім’я файлу. (Виправлено Анатолієм Техтоніком; bpo-7585.)Команда Distutils
sdist
тепер завжди повторно генерує файлMANIFEST
, оскільки навіть якщо файлиMANIFEST.in
абоsetup.py
не були змінені, користувач міг створити кілька нових файлів, які слід включити. (Виправлено Тареком Зіаде; bpo-8688.)Прапор
IGNORE_EXCEPTION_DETAIL
модуляdoctest
тепер ігноруватиме назву модуля, що містить виняток, що перевіряється. (Патч від Lennart Regebro; bpo-7490.)Клас
Message
модуляemail
тепер прийматиме корисне навантаження зі значенням Unicode, автоматично перетворюючи корисне навантаження на кодування, визначенеoutput_charset
. (Додав Р. Девід Мюррей; bpo-1368247.)Клас
Fraction
тепер приймає один екземпляр float абоDecimal
, або два раціональних числа, як аргументи свого конструктора. (Реалізовано Марком Дікінсоном; раціональні числа додано в bpo-5812, а число з плаваючою точкою/десяткове число в bpo-8294.)Порядок порівнянь (
<
,<=
,>
,>=
) між дробами та комплексними числами тепер викликаєTypeError
. Це виправляє недогляд, завдяки чомуFraction
відповідає іншим числовим типам.Новий клас:
FTP_TLS
у модуліftplib
забезпечує безпечні FTP-з’єднання за допомогою інкапсуляції TLS для автентифікації, а також подальший контроль і передачу даних. (Надав Джампаоло Родола; bpo-2054.)Метод
storbinary()
для двійкових завантажень тепер може перезапускати завантаження завдяки доданому параметру rest (патч Пабло Музо; bpo-6845.)Новий декоратор класу:
total_ordering()
у модуліfunctools
приймає клас, який визначає метод__eq__()
та один із__lt__()
,__le__()
,__gt__()
або__ge__()
та генерує відсутні методи порівняння. Оскільки метод__cmp__()
застарів у Python 3.x, цей декоратор полегшує визначення впорядкованих класів. (Додав Реймонд Геттінгер; bpo-5479.)Нова функція:
cmp_to_key()
візьме функцію порівняння старого стилю, яка очікує два аргументи, і поверне новий виклик, який можна використовувати як параметр key для таких функцій, якsorted()
,min()
іmax()
і т. д. Основне призначення полягає в тому, щоб допомогти зробити код сумісним з Python 3.x. (Додав Раймонд Геттінгер.)Нова функція: модуль
gc
is_tracked()
повертає true, якщо даний екземпляр відстежується збирачем сміття, і false в іншому випадку. (Надав Антуан Пітру; bpo-4688.)GzipFile
модуляgzip
тепер підтримує протокол керування контекстом, тому ви можете писатиwith gzip.GzipFile(...) як f:
(надано Hagen Fürstenau; bpo-3860), і тепер він реалізуєio.BufferedIOBase
ABC, тому ви можете обернути йогоio.BufferedReader
для швидшої обробки (надано Nir Aides; bpo-7471). Також тепер можна змінити час модифікації, записаний у файлі, стиснутому gzip, шляхом надання конструктору додаткової позначки часу. (Надав Жак Фреше; bpo-4272.)Файли у форматі gzip можуть бути доповнені нульовими байтами в кінці; модуль
gzip
тепер споживатиме ці кінцеві байти. (Виправлено Tadek Pietraszek і Brian Curtin; bpo-2846.)Новий атрибут: модуль
hashlib
тепер має атрибутalgorithms
, який містить кортеж із назвами підтримуваних алгоритмів. У Python 2.7hashlib.algorithms
містить('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
. (Надав Карл Чене; bpo-7418.)Стандартний клас
HTTPResponse
, який використовується модулемhttplib
, тепер підтримує буферизацію, що призводить до набагато швидшого читання HTTP-відповідей. (Надав Крістіян Валур Йонссон; bpo-4879.)Класи
HTTPConnection
іHTTPSConnection
тепер підтримують параметр source_address, двокортеж(хост, порт)
, що вказує адресу джерела, яка буде використана для підключення. (Надав Елдон Зіглер; bpo-3972.)Модуль
ihooks
тепер підтримує відносний імпорт. Зверніть увагу, щоihooks
є старішим модулем для налаштування імпорту, заміненим модулемimputil
, доданим у Python 2.0. (Підтримку відносного імпорту додав Ніл Шеменауер.)Модуль
imaplib
тепер підтримує адреси IPv6. (Надав Дерек Морр; bpo-1655.)Нова функція: модуль
inspect
getcallargs()
приймає виклик, його позиційні та ключові аргументи, а також визначає, який із параметрів викликаного отримає кожен аргумент, повертаючи словник зіставлення імен аргументів їхні цінності. Наприклад:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Внесено Джорджем Саккісом; bpo-3135.
Оновлений модуль: бібліотеку
io
було оновлено до версії, що постачається з Python 3.1. Для версії 3.1 бібліотеку вводу-виводу було повністю переписано мовою C і вона працює у 2-20 разів швидше залежно від завдання, яке виконується. Оригінальна версія Python була перейменована на модуль_pyio
.Одна незначна результуюча зміна: клас
io.TextIOBase
тепер має атрибутerrors
, що надає параметр помилки, який використовується для помилок кодування та декодування (один із'strict'
,'replace ''
,'ігнорувати''
).Клас
io.FileIO
тепер викликаєOSError
, коли передається недійсний дескриптор файлу. (Реалізовано Бенджаміном Петерсоном; bpo-4991.) Методtruncate()
тепер зберігає позицію файлу; раніше він змінював позицію файлу на кінець нового файлу. (Виправлено Паскалем Шамбоном; bpo-6939.)Нова функція:
itertools.compress(data, selectors)
використовує два ітератори. Елементи data повертаються, якщо відповідне значення в selectors має значення true:itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
Нова функція:
itertools.combinations_with_replacement(iter, r)
повертає всі можливі комбінації елементів довжини r з ітерованого iter. На відміну відcombinations()
, окремі елементи можуть повторюватися у згенерованих комбінаціях:itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
Зауважте, що елементи розглядаються як унікальні залежно від їхньої позиції у вхідних даних, а не від фактичних значень.
Функція
itertools.count()
тепер має аргумент step, який дозволяє збільшувати значення, відмінні від 1.count()
також тепер дозволяє використовувати ключові аргументи та використовувати нецілі значення, наприклад числа з плаваючою точкою абоDecimal
екземпляри. (Реалізовано Raymond Hettinger; bpo-5032.)itertools.combinations()
іitertools.product()
раніше викликалиValueError
для значень r, які перевищують ітерацію введення. Це було визнано помилкою специфікації, тому тепер вони повертають порожній ітератор. (Виправлено Раймондом Геттінгером; bpo-4816.)Оновлений модуль: модуль
json
було оновлено до версії 2.0.9 пакета simplejson, який включає розширення C, яке робить кодування та декодування швидшим. (Надав Боб Іполіто; bpo-4136.)Щоб підтримувати новий тип
collections.OrderedDict
,json.load()
тепер має необов’язковий параметр object_pairs_hook, який буде викликатися з будь-яким літералом об’єкта, який декодує список пар. (Надав Реймонд Геттінгер; bpo-5381.)Клас
Maildir
модуляmailbox
тепер записує мітку часу в каталогах, які він читає, і перечитує їх, лише якщо час модифікації згодом змінився. Це покращує продуктивність, уникаючи непотрібного сканування каталогу. (Виправлено A.M. Kuchling і Antoine Pitrou; bpo-1607951, bpo-6896.)Нові функції: модуль
math
отримавerf()
іerfc()
для функції помилки та додаткової функції помилки,expm1()
який обчислюєe**x - 1
з більшою точністю, ніж використанняexp()
і віднімання 1,gamma()
для функції Gamma таlgamma()
для натурального логарифму функції Гамма. (Надано Марком Дікінсоном і nirinA raseliarison; bpo-3366.)Класам
Manager*
модуляmultiprocessing
тепер можна передати виклик, який буде викликатися кожного разу, коли запускається підпроцес, разом із набором аргументів, які будуть передані викликаному. (Надано lekma; bpo-5585.)Клас
Pool
, який керує пулом робочих процесів, тепер має додатковий параметр maxtasksperchild. Робочі процеси виконають вказану кількість завдань, а потім завершаться, у результаті чогоPool
запустить новий робочий процес. Це корисно, якщо завдання можуть втрачати пам’ять чи інші ресурси, або якщо деякі завдання призведуть до того, що робочий файл стане дуже великим. (Надав Чарльз Казабон; bpo-6963.)Модуль
nntplib
тепер підтримує адреси IPv6. (Надав Дерек Морр; bpo-1664.)Нові функції: модуль
os
обгортає наступні системні виклики POSIX:getresgid()
іgetresuid()
, які повертають справжні, ефективні та збережені GID та UID. ;setresgid()
іsetresuid()
, які встановлюють реальні, ефективні та збережені GID та UID на нові значення;initgroups()
, які ініціалізують список доступу групи для поточного процесу. (Функції GID/UID надав Тревіс Х.; bpo-6508. Підтримку початкових груп додав Жан-Поль Кальдероне; bpo-7333.)Функція
os.fork()
тепер повторно ініціалізує блокування імпорту в дочірньому процесі; це вирішує проблеми в Solaris, колиfork()
викликається з потоку. (Виправлено Жолтом Черною; bpo-7242.)У модулі
os.path
функціїnormpath()
іabspath()
тепер зберігають Unicode; якщо їхній вхідний шлях є рядком Unicode, значення, що повертається, також є рядком Unicode. (normpath()
виправлено Метом Джукою в bpo-5827;abspath()
виправлено Еціо Мелотті в bpo-3426.)Модуль
pydoc
тепер має довідку для різних символів, які використовує Python. Тепер ви можете, наприклад, виконатиhelp('<<')
абоhelp('@')
. (Надав Девід Лабан; bpo-4739.)Модулі
re
split()
,sub()
іsubn()
тепер приймають необов’язковий аргумент flags для узгодженості з інші функції в модулі. (Додав Грегорі П. Сміт.)Нова функція:
run_path()
у модуліrunpy
виконає код за наданим аргументом path. шлях може бути шляхом до вихідного файлу Python (example.py
), скомпільованого файлу байт-коду (example.pyc
), каталогу (./package/
), або архів zip (example.zip
). Якщо вказано каталог або шлях до zip-архіву, його буде додано на початкуsys.path
, а модуль__main__
буде імпортовано. Очікується, що каталог або zip містить__main__.py
; якщо цього не відбувається, якийсь інший__main__.py
може бути імпортовано з розташування пізніше вsys.path
. Це робить більшу частину механізмуrunpy
доступною для сценаріїв, які хочуть імітувати те, як командний рядок Python обробляє явне ім’я шляху. (Додав Нік Коглан; bpo-6816.)Нова функція: у модулі
shutil
make_archive()
приймає назву файлу, тип архіву (формат zip або tar) і шлях до каталогу та створює архів із вмістом каталогу. (Додав Тарек Зіаде.)Функції
shutil
copyfile()
іcopytree()
тепер викликають винятокSpecialFileError
, коли запитують скопіювати іменований канал. Раніше код розглядав іменовані канали як звичайний файл, відкриваючи їх для читання, і це блокувало на невизначений термін. (Виправлено Антуаном Пітру; bpo-3002.)Модуль
signal
більше не перевстановлює обробник сигналу, якщо це не справді необхідно, що виправляє помилку, яка могла зробити неможливим надійне перехоплення сигналу EINTR. (Виправлено Чарльзом-Франсуа Наталі; bpo-8354.)Нові функції: у модулі
site
три нові функції повертають різні шляхи для сайту та користувача.getsitepackages()
повертає список, що містить усі глобальні каталоги пакетів сайту,getusersitepackages()
повертає шлях до каталогу пакетів сайту користувача, аgetuserbase()
повертає значення змінної середовищаUSER_BASE
, надаючи шлях до каталогу, який можна використовувати для зберігання даних. (Надав Тарек Зіаде; bpo-6693.)Модуль
site
тепер повідомляє про винятки, що виникають під час імпорту модуляsitecustomize
, і більше не буде перехоплювати та ковтати винятокKeyboardInterrupt
. (Виправлено Віктором Стіннером; bpo-3137.)Функція
create_connection()
отримала параметр source_address, двокортеж(хост, порт)
, що вказує адресу джерела, яка використовуватиметься для підключення. (Надав Елдон Зіглер; bpo-3972.)Методи
recv_into()
іrecvfrom_into()
тепер записуватимуть в об’єкти, які підтримують API буфера, найбільш корисніbytearray
і об’єктиmemoryview
. (Реалізовано Антуаном Пітру; bpo-8104.)Клас
SocketServer
модуляTCPServer
тепер підтримує тайм-аути сокетів і відключення алгоритму Nagle. Атрибут класуdisable_nagle_algorithm
за умовчанням має значенняFalse
; якщо перевизначено, щоб бути істинним, для нових з’єднань запитів буде встановлено параметр TCP_NODELAY, щоб запобігти буферизації багатьох невеликих відправлень в один пакет TCP. Атрибут класуtimeout
може містити тайм-аут у секундах, який буде застосовано до сокета запиту; якщо протягом цього часу не буде отримано жодного запиту, буде викликаноhandle_timeout()
і повернетьсяhandle_request()
. (Надав Крістіан Валур Йонссон; bpo-6192 і bpo-6267.)Оновлений модуль: модуль
sqlite3
оновлено до версії 2.6.0 пакета pysqlite. Версія 2.6.0 містить низку виправлень помилок і додає можливість завантажувати розширення SQLite із спільних бібліотек. Викличте методenable_load_extension(True)
, щоб увімкнути розширення, а потім викличтеload_extension()
, щоб завантажити певну спільну бібліотеку. (Оновлено Герхардом Херінгом.)Об’єкти
SSLSocket
модуляssl
тепер підтримують API буфера, який виправив помилку набору тестів (виправлено Антуаном Пітру; bpo-7133) і автоматично встановив OpenSSLSSL_MODE_AUTO_RETRY
, який запобігатиме поверненню коду помилки з операційrecv()
, які запускають повторне узгодження SSL (виправлено Антуаном Пітру; bpo-8222).The
ssl.wrap_socket()
constructor function now takes a ciphers argument that’s a string listing the encryption algorithms to be allowed; the format of the string is described in the OpenSSL documentation. (Added by Antoine Pitrou; bpo-8322.)Інша зміна змушує розширення завантажувати всі шифри та алгоритми дайджесту OpenSSL, щоб усі вони були доступними. Деякі сертифікати SSL не вдалося перевірити, повідомляючи про помилку «невідомий алгоритм». (Повідомив Беда Косата та виправив Антуан Пітру; bpo-8484.)
Версія OpenSSL, яка використовується, тепер доступна як атрибути модуля:
ssl.OPENSSL_VERSION
(рядок),ssl.OPENSSL_VERSION_INFO
(кортеж із 5) іssl.OPENSSL_VERSION_NUMBER
(ціле число). (Додав Антуан Пітру; bpo-8321.)Модуль
struct
більше не ігноруватиме помилки переповнення, коли значення надто велике для певного коду цілочисельного формату (один ізbBhHiIlLqQ
); тепер він завжди викликає винятокstruct.error
. (Змінено Марком Дікінсоном; bpo-1523.) Функціяpack()
також спробує використати__index__()
для перетворення та упаковки нецілих чисел, перш ніж спробувати__int__()
або повідомлення про помилку. (Змінено Марком Дікінсоном; bpo-8300.)Нова функція: модуль
subprocess
check_output()
виконує команду з указаним набором аргументів і повертає результат команди як рядок, коли команда виконується без помилок, або викликає ВинятокCalledProcessError
інакше.>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(Надав Грегорі П. Сміт.)
Модуль
subprocess
тепер повторюватиме свої внутрішні системні виклики після отримання сигналуEINTR
. (Повідомлено кількома людьми; останній патч Грегорі П. Смітом у bpo-1068268.)Нова функція:
is_declared_global()
у модуліsymtable
повертає true для змінних, які явно оголошені як глобальні, і false для змінних, які неявно є глобальними. (Надав Джеремі Гілтон.)Модуль
syslog
тепер використовуватиме значенняsys.argv[0]
як ідентифікатор замість попереднього значення за замовчуванням'python'
. (Змінено Шоном Райфшнайдером; bpo-8451.)Значення
sys.version_info
тепер є іменованим кортежем з атрибутамиmajor
,minor
,micro
,releaselevel
іserial
. (Надав Росс Лайт; bpo-4285.)sys.getwindowsversion()
також повертає іменований кортеж з атрибутами під назвоюmajor
,minor
,build
,platform
,service_pack
,service_pack_major
,service_pack_minor
,suite_mask
іproduct_type
. (Надав Браян Кертін; bpo-7766.)Стандартну обробку помилок модуля
tarfile
було змінено, і більше не пригнічуються фатальні помилки. Раніше рівень помилок за замовчуванням був 0, що означало, що помилки призводили лише до запису повідомлення в журнал налагодження, але оскільки журнал налагодження не активовано за замовчуванням, ці помилки залишаються непоміченими. Рівень помилки за замовчуванням тепер становить 1, що викликає виняток у разі виникнення помилки. (Змінено Ларсом Густебелем; bpo-7357.)tarfile
тепер підтримує фільтрацію об’єктівTarInfo
, які додаються до файлу tar. Коли ви викликаєтеadd()
, ви можете надати додатковий аргумент filter, який можна викликати. Викликаний filter отримуватимеTarInfo
для кожного файлу, який додається, і зможе змінювати та повертати його. Якщо виклик повертаєNone
, файл буде виключено з отриманого архіву. Це потужніший аргумент, ніж існуючий аргумент exclude, який, отже, застарів. (Додав Ларс Густебель; bpo-6856.) КласTarFile
тепер також підтримує протокол керування контекстом. (Додав Ларс Густебель; bpo-7232.)Метод
wait()
класуthreading.Event
тепер повертає внутрішній прапор під час виходу. Це означає, що метод зазвичай повертатиме true, оскількиwait()
має блокуватися, доки внутрішній прапор не стане істинним. Повернене значення буде false, лише якщо було надано тайм-аут і час очікування операції минув. (Надав Тім Лешер; bpo-1674032.)База даних Юнікод, надана модулем
unicodedata
, тепер використовується внутрішньо, щоб визначити, які символи є цифрами, пробілами чи представляють розриви рядків. База даних також містить інформацію з файлу данихUnihan.txt
(патч від Anders Chrigström і Amaury Forgeot d’Arc; bpo-1571184) і була оновлена до версії 5.2.0 (оновлено Florent Xicluna ; bpo-8024).Модуль
urlparse
urlsplit()
тепер обробляє невідомі схеми URL відповідно до RFC 3986: якщо URL має форму" <something> ://.. ."
, текст перед://
розглядається як схема, навіть якщо це вигадана схема, про яку модуль не знає. Ця зміна може порушити код, який обійшов стару поведінку. Наприклад, Python 2.6.4 або 2.5 поверне наступне:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (і Python 2.6.5) поверне:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 фактично створює дещо інший вихід, оскільки він повертає іменований кортеж замість стандартного кортежу.)
Модуль
urlparse
також підтримує буквальні адреси IPv6, як визначено RFC 2732 (надано Senthil Kumaran; bpo-2987).>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
Новий клас: клас
WeakSet
у модуліweakref
— це набір, який містить лише слабкі посилання на свої елементи; елементи буде видалено, якщо на них не буде посилань. (Спочатку реалізовано в Python 3.x Реймондом Геттінгером і перенесено до версії 2.7 Майклом Фордом.)Бібліотека ElementTree,
xml.etree
, більше не пропускає амперсанди та кутові дужки під час виведення інструкції обробки XML (яка виглядає як<?xml-stylesheet href="#style1"?>
) або коментаря (яка виглядає як<!-- comment -->
). (Патч Ніла Мюллера; bpo-2746.)Клієнт і сервер XML-RPC, які надаються модулями
xmlrpclib
іSimpleXMLRPCServer
, мають покращену продуктивність завдяки підтримці HTTP/1.1 Keep-Alive і додатковому використанню кодування gzip для стиснення XML, яким обмінюються. Стиснення gzip контролюється атрибутомencode_threshold
SimpleXMLRPCRequestHandler
, який містить розмір у байтах; відповіді, більші за цей, будуть стиснуті. (Надав Крістіян Валур Йонссон; bpo-6267.)Модуль
zipfile
ZipFile
тепер підтримує протокол керування контекстом, тому ви можете писатиwith zipfile.ZipFile(...) як f:
. (Надав Браян Кертін; bpo-5511.)zipfile
тепер також підтримує архівування порожніх каталогів і розпаковує їх правильно. (Виправлено Kuba Wieczorek; bpo-4710.) Читання файлів з архіву відбувається швидше, а чергуванняread()
іreadline()
тепер працює правильно. (Надано Nir Aides; bpo-7610.)Функція
is_zipfile()
тепер приймає об’єкт файлу на додаток до імен шляхів, прийнятих у попередніх версіях. (Надав Габріель Генелліна; bpo-4756.)Метод
writestr()
тепер має необов’язковий параметр compress_type, який дозволяє перевизначити метод стиснення за замовчуванням, указаний у конструкторіZipFile
. (Надав Рональд Оуссорен; bpo-6003.)
Новий модуль: importlib¶
Python 3.1 включає пакет importlib
, повторну реалізацію логіки, що лежить в основі оператора import
Python. importlib
корисний для розробників інтерпретаторів Python і для користувачів, які хочуть написати нові імпортери, які можуть брати участь у процесі імпорту. Python 2.7 не містить повного пакета importlib
, натомість має крихітну підмножину, яка містить одну функцію, import_module()
.
import_module(name, package=None)
імпортує модуль. name — це рядок, що містить назву модуля або пакета. Можна виконати відносний імпорт, надавши рядок, який починається із символу .
, наприклад ..utils.errors
. Для відносного імпорту потрібно вказати аргумент package, який є назвою пакета, який використовуватиметься як прив’язка для відносного імпорту. import_module()
вставляє імпортований модуль у sys.modules
і повертає об’єкт модуля.
Ось кілька прикладів:
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib
був реалізований Бреттом Кенноном і представлений у Python 3.1.
Новий модуль: sysconfig¶
Модуль sysconfig
було вилучено з пакета Distutils, ставши власним новим модулем верхнього рівня. sysconfig
надає функції для отримання інформації про процес збирання Python: перемикачі компілятора, шляхи встановлення, ім’я платформи та те, чи працює Python із вихідного каталогу.
Деякі функції в модулі:
get_config_var()
повертає змінні з Makefile Python і файлуpyconfig.h
.get_config_vars()
повертає словник, що містить усі змінні конфігурації.get_path()
повертає налаштований шлях для певного типу модуля: стандартної бібліотеки, модулів для сайту, модулів для платформи тощо.is_python_build()
повертає true, якщо ви запускаєте двійковий файл із вихідного дерева Python, і false в іншому випадку.
Зверніться до документації sysconfig
, щоб дізнатися більше та отримати повний список функцій.
Пакет Distutils і sysconfig
тепер обслуговуються Тареком Зіаде, який також запустив пакет Distutils2 (сховище вихідних кодів за адресою https://hg.python.org/distutils2/) для розробки версії Distutils наступного покоління. .
ttk: тематичні віджети для Tk¶
Tcl/Tk 8.5 містить набір тематичних віджетів, які повторно реалізують основні віджети Tk, але мають більш настроюваний вигляд і тому можуть більше нагадувати віджети рідної платформи. Цей набір віджетів спочатку називався Tile, але був перейменований на Ttk (для «тематичних Tk») після додавання до випуску Tcl/Tck 8.5.
Щоб дізнатися більше, прочитайте документацію модуля ttk
. Ви також можете прочитати довідкову сторінку Tcl/Tk з описом механізму створення тем Ttk, доступну за адресою https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm. Деякі знімки екрана використовуваного коду Python/Ttk можна знайти на https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki.
Модуль ttk
був написаний Гільєрме Поло та доданий у bpo-2983. Альтернативну версію під назвою Tile.py
, написану Мартіном Франкліном і підтримувану Кевіном Волзером, було запропоновано включити в bpo-2618, але автори стверджували, що робота Гільєрме Поло була більш повною.
Оновлений модуль: unittest¶
Модуль unittest
було значно вдосконалено; було додано багато нових функцій. Якщо не зазначено інше, більшість із цих функцій реалізував Майкл Форд. Розширену версію модуля можна завантажити окремо для використання з версіями Python від 2.4 до 2.6, упакованими як пакет unittest2
, з https://pypi.org/project/unittest2.
When used from the command line, the module can automatically discover
tests. It’s not as fancy as py.test or
nose, but provides a
simple way to run tests kept within a set of package directories. For example,
the following command will search the test/
subdirectory for
any importable test files named test*.py
:
python -m unittest discover -s test
Щоб дізнатися більше, зверніться до документації модуля unittest
. (Розроблено в bpo-6001.)
Функція main()
підтримує деякі інші нові параметри:
-b
або--buffer
буферизує стандартний вихід і стандартні потоки помилок під час кожного тесту. Якщо тест пройдено, будь-які отримані результати будуть відхилені; у разі помилки буде відображено буферизований вихід.-c
або--catch
призведе до того, що переривання control-C оброблятиметься більш витончено. Замість негайного переривання процесу тестування поточний тест буде завершено, а потім буде повідомлено про часткові результати до моменту переривання. Якщо ви нетерплячі, повторне натискання Control-C призведе до негайної перерви.Цей обробник control-C намагається уникнути проблем, коли код, що тестується, або тести, що виконуються, визначили власний обробник сигналу, помічаючи, що обробник сигналу вже встановлено, і викликає його. Якщо це не працює для вас, є декоратор
removeHandler()
, який можна використовувати для позначення тестів, для яких слід вимкнено обробку control-C.-f
або--failfast
негайно припиняє виконання тесту, коли тест не вдається, замість того, щоб продовжувати виконання подальших тестів. (Запропоновано Кліффом Даєром і реалізовано Майклом Фордом; bpo-8074.)
Повідомлення про перебіг тепер показують «x» для очікуваних помилок і «u» для неочікуваних успіхів під час запуску в докладному режимі. (Надав Бенджамін Петерсон.)
Тестові випадки можуть викликати виключення SkipTest
, щоб пропустити тест (bpo-1034053).
Повідомлення про помилки для помилок assertEqual()
, assertTrue()
і assertFalse()
тепер надають більше інформації. Якщо ви встановите атрибут longMessage
ваших класів TestCase
як true, стандартне повідомлення про помилку та будь-яке додаткове повідомлення, яке ви надасте, буде надруковано для помилок. (Додав Майкл Форд; bpo-5663.)
Метод assertRaises()
тепер повертає обробник контексту під час виклику без надання об’єкта для запуску. Наприклад, ви можете написати це:
with self.assertRaises(KeyError):
{}['foo']
(Реалізовано Антуаном Пітру; bpo-4444.)
Тепер підтримуються пристрої налаштування та демонтажу на рівні модуля та класу. Модулі можуть містити функції setUpModule()
і tearDownModule()
. Класи можуть мати методи setUpClass()
і tearDownClass()
, які мають бути визначені як методи класу (використовуючи @classmethod
або еквівалент). Ці функції та методи викликаються, коли виконавець тесту перемикається на тестовий приклад в іншому модулі чи класі.
Додано методи addCleanup()
і doCleanups()
. addCleanup()
дозволяє додавати функції очищення, які будуть викликані безумовно (після setUp()
, якщо setUp()
не вдається, інакше після tearDown()
). Це дозволяє набагато простіше розподіляти та звільняти ресурси під час тестування (bpo-5679).
Було додано ряд нових методів, які забезпечують більш спеціалізовані тести. Багато з цих методів були написані інженерами Google для використання в їхніх наборах тестів; Грегорі П. Сміт, Майкл Форд і GvR працювали над їх об’єднанням у версію Python unittest
.
assertIsNone()
іassertIsNotNone()
беруть один вираз і перевіряють, чи є результатNone
.assertIs()
іassertIsNot()
приймають два значення та перевіряють, чи обидва значення обчислюються для одного об’єкта чи ні. (Додав Майкл Форд; bpo-2578.)assertIsInstance()
іassertNotIsInstance()
перевіряють, чи є отриманий об’єкт екземпляром певного класу чи одного з кортежу класів. (Додав Георг Брандл; bpo-7031.)assertGreater()
,assertGreaterEqual()
,assertLess()
, andassertLessEqual()
порівнюють два значення.assertMultiLineEqual()
порівнює два рядки, і якщо вони не рівні, відображає корисне порівняння, яке підкреслює відмінності в двох рядках. Це порівняння тепер використовується за замовчуванням, коли рядки Unicode порівнюються зassertEqual()
.assertRegexpMatches()
іassertNotRegexpMatches()
перевіряє, чи відповідає перший аргумент рядку регулярному виразу, наданому як другий аргумент (bpo-8038). ).assertRaisesRegexp()
перевіряє, чи виникає певний виняток, а потім також перевіряє, чи рядкове представлення виключення відповідає наданому регулярному виразу.assertIn()
іassertNotIn()
перевіряє, чи є first у second чи ні.assertItemsEqual()
перевіряє, чи дві надані послідовності містять однакові елементи.assertSetEqual()
порівнює, чи рівні два набори, і повідомляє про відмінності між наборами лише в разі помилки.Подібним чином
assertListEqual()
іassertTupleEqual()
порівнюють вказані типи та пояснюють будь-які відмінності, не обов’язково друкуючи їхні повні значення; ці методи тепер використовуються за замовчуванням під час порівняння списків і кортежів за допомогоюassertEqual()
. Загалом,assertSequenceEqual()
порівнює дві послідовності та за бажанням може перевірити, чи обидві послідовності належать до певного типу.assertDictEqual()
порівнює два словники та повідомляє про відмінності; тепер він використовується за замовчуванням, коли ви порівнюєте два словники за допомогоюassertEqual()
.assertDictContainsSubset()
перевіряє, чи всі пари ключ/значення в first знайдені в second.assertAlmostEqual()
andassertNotAlmostEqual()
test whether first and second are approximately equal. This method can either round their difference to an optionally-specified number of places (the default is 7) and compare it to zero, or require the difference to be smaller than a supplied delta value.loadTestsFromName()
належним чином враховує атрибутsuiteClass
TestLoader
. (Виправлено Марком Родді; bpo-6866.)Новий хук дозволяє розширити метод
assertEqual()
для обробки нових типів даних. МетодaddTypeEqualityFunc()
приймає об’єкт типу та функцію. Функція буде використана, якщо обидва порівнювані об’єкти належать до вказаного типу. Ця функція має порівняти два об’єкти та викликати виключення, якщо вони не збігаються; доцільно, щоб функція надавала додаткову інформацію про те, чому два об’єкти не збігаються, подібно до нових методів порівняння послідовностей.
unittest.main()
тепер приймає додатковий аргумент вихід
. Якщо false, main()
не викликає sys.exit()
, що дозволяє використовувати main()
з інтерактивного інтерпретатора. (Надав Дж. Пабло Фернандес; bpo-3379.)
TestResult
має нові методи startTestRun()
і stopTestRun()
, які викликаються безпосередньо перед і після виконання тесту. (Надав Роберт Коллінз; bpo-5728.)
З усіма цими змінами unittest.py
ставав незручно великим, тому модуль перетворили на пакет, а код розділили на кілька файлів (автор Бенджамін Петерсон). Це не впливає на імпорт або використання модуля.
Дивись також
- http://www.voidspace.org.uk/python/articles/unittest2.shtml
Описує нові функції, способи їх використання та обґрунтування різних дизайнерських рішень. (Автор: Майкл Форд.)
Оновлений модуль: ElementTree 1.3¶
Версію бібліотеки ElementTree, яка входить до складу Python, оновлено до версії 1.3. Деякі з нових функцій:
Різні функції аналізу тепер приймають аргумент ключового слова parser, що дає екземпляр
XMLParser
, який буде використано. Це дає змогу змінити внутрішнє кодування файлу:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
Помилки під час синтаксичного аналізу XML тепер викликають виняток
ParseError
, екземпляри якого мають атрибутposition
, що містить кортеж (рядок, стовпець), що вказує місце проблеми.Код ElementTree для перетворення дерев у рядок був суттєво перероблений, завдяки чому він у багатьох випадках став приблизно вдвічі швидшим. Методи
ElementTree.write()
іElement.write()
тепер мають параметр method, який може бути «xml» (за замовчуванням), «html» або «text». У режимі HTML пусті елементи виводитимуться як<empty> </empty>
замість<empty/>
, а текстовий режим пропускатиме елементи та виводитиме лише фрагменти тексту. Якщо ви встановите для атрибутаtag
елемента значенняNone
, але залишите його дочірніх елементів на місці, елемент буде пропущено, коли дерево буде виписано, тому вам не потрібно виконувати більш широке перевпорядкування щоб видалити один елемент.Також покращено обробку простору імен. Усі оголошення
xmlns: <whatever>
тепер виводяться на кореневий елемент, а не розкидані по результуючому XML. Ви можете встановити простір імен за замовчуванням для дерева, установивши атрибутdefault_namespace
, і можете зареєструвати нові префікси за допомогоюregister_namespace()
. У режимі XML ви можете використовувати параметр xml_declaration true/false, щоб приховати декларацію XML.Новий метод
Element
:extend()
додає елементи з послідовності до дочірніх елементів елемента. Самі елементи поводяться як послідовності, тому легко переміщати дітей від одного елемента до іншого:from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
Новий метод
Element
:iter()
дає дочірні елементи елемента як генератор. Також можна написатидля дочірнього елемента в елементі:
, щоб перейти до дочірніх елементів елемента. Існуючий методgetiterator()
тепер не підтримується, як іgetchildren()
, який створює та повертає список дітей.Новий метод
Element
:itertext()
дає всі фрагменти тексту, які є нащадками елемента. Наприклад:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
Застаріле: використання елемента як логічного значення (тобто
if elem:
) повертатиме true, якщо елемент мав дочірніх елементів, або false, якщо дочірніх елементів не було. Така поведінка збиває з пантелику –None
є хибним, але також і бездітний елемент? – тож тепер ініціюватимеFutureWarning
. У вашому коді ви повинні бути чіткими: напишітьlen(elem) != 0
, якщо вас цікавить кількість дітей, абоelem не є None
.
Фредрік Лунд розробляє ElementTree і створив версію 1.3; ви можете прочитати його статтю з описом 1.3 на https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna оновив версію, включену в Python, після обговорень на python-dev і в bpo-6472.)
Зміни збірки та C API¶
Зміни в процесі збирання Python і в API C включають:
Останній випуск GNU Debugger, GDB 7, може бути написаний за допомогою Python. Коли ви починаєте налагоджувати виконувану програму P, GDB шукатиме файл із назвою
P-gdb.py
і автоматично його читатиме. Дейв Малкольм зробивpython-gdb.py
, який додає ряд команд, корисних під час налагодження самого Python. Наприклад,py-up
іpy-down
переміщуються вгору або вниз на один кадр стека Python, який зазвичай відповідає кільком кадрам стеку C.py-print
друкує значення змінної Python, аpy-bt
друкує трасування стека Python. (Додано в результаті bpo-8032.)Якщо ви використовуєте файл
.gdbinit
, що надається разом з Python, макрос «pyo» у версії 2.7 тепер працює правильно, коли потік, який налагоджується, не містить GIL; тепер макрос отримує його перед друком. (Надав Віктор Стіннер; bpo-3632.)Py_AddPendingCall()
тепер потокобезпечний, дозволяючи будь-якому робочому потоку надсилати сповіщення до основного потоку Python. Це особливо корисно для асинхронних операцій введення-виведення. (Надав Крістіян Валур Йонссон; bpo-4293.)Нова функція:
PyCode_NewEmpty()
створює порожній об’єкт коду; потрібні лише назва файлу, назва функції та номер першого рядка. Це корисно для модулів розширення, які намагаються побудувати більш корисний стек трасування. Раніше такі розширення потребували викликуPyCode_New()
, який мав набагато більше аргументів. (Додав Джеффрі Яскін.)Нова функція:
PyErr_NewExceptionWithDoc()
створює новий клас винятків, як і існуючийPyErr_NewException()
, але приймає додатковий аргументchar *
, що містить рядок документації для нового класу винятків . (Додано «lekma» у системі відстеження помилок Python; bpo-7033.)Нова функція:
PyFrame_GetLineNumber()
приймає об’єкт фрейму та повертає номер рядка, який кадр зараз виконує. Раніше коду потрібно було отримати індекс інструкції байт-коду, яка зараз виконується, а потім знайти номер рядка, що відповідає цій адресі. (Додав Джеффрі Яскін.)New functions:
PyLong_AsLongAndOverflow()
andPyLong_AsLongLongAndOverflow()
approximates a Python long integer as a Clong
orlong long
. If the number is too large to fit into the output type, an overflow flag is set and returned to the caller. (Contributed by Case Van Horsen; bpo-7528 and bpo-7767.)Нова функція: була додана нова функція
PyOS_string_to_double()
, яка випливає з перезапису перетворення рядків у плаваючі. Старі функціїPyOS_ascii_strtod()
іPyOS_ascii_atof()
тепер застаріли.Нова функція:
PySys_SetArgvEx()
встановлює значенняsys.argv
і може додатково оновлюватиsys.path
, щоб включити каталог, що містить сценарій, названийsys.argv[0]
залежно від значення параметра updatepath.Цю функцію було додано, щоб закрити дірку в безпеці програм, які вбудовують Python. Стара функція
PySys_SetArgv()
завжди оновлювалаsys.path
, а іноді додавала поточний каталог. Це означало, що якщо ви запускаєте програму, яка вбудовує Python, у каталог, який контролюється кимось іншим, зловмисники можуть розмістити модуль троянського коня в цьому каталозі (скажімо, файл із назвоюos.py
), який потім зробить ваш додаток імпортувати та запускати.Якщо ви підтримуєте програму C/C++, у якій вбудовано Python, перевірте, чи викликаєте ви
PySys_SetArgv()
, і уважно обміркуйте, чи має програма використовуватиPySys_SetArgvEx()
з updatepath, встановленим на false .Про проблему безпеки повідомлено як CVE-2008-5983; обговорено в bpo-5753 та виправлено Антуаном Пітру.
Нові макроси: файли заголовків Python тепер визначають такі макроси:
Py_ISALNUM
,Py_ISALPHA
,Py_ISDIGIT
,Py_ISLOWER
,Py_ISSPACE
,Py_ISUPPER
,Py_ISXDIGIT
,Py_TOLOWER
іPy_TOUPPER
. Усі ці функції є аналогічними стандартним макросам C для класифікації символів, але ігнорують поточні параметри локалі, оскільки в деяких місцях Python потребує аналізу символів у спосіб, незалежний від локалі. (Додав Ерік Сміт; bpo-5793.)Видалена функція:
PyEval_CallObject
тепер доступна лише як макрос. Версія функції зберігалася, щоб зберегти сумісність зв’язування ABI, але це було в 1997 році; його, звичайно, вже можна видалити. (Видалено Антуаном Пітру; bpo-8276.)New format codes: the
PyFormat_FromString()
,PyFormat_FromStringV()
, andPyErr_Format()
functions now accept%lld
and%llu
format codes for displaying C’slong long
types. (Contributed by Mark Dickinson; bpo-7228.)Змінено складну взаємодію між потоками та розгалуженням процесу. Раніше дочірній процес, створений
os.fork()
, міг вийти з ладу, оскільки дочірній процес створюється лише з одним запущеним потоком, потік, який виконуєos.fork()
. Якби інші потоки утримували блокування, наприклад блокування імпорту Python, під час виконання розгалуження блокування все одно було б позначено як «утримано» в новому процесі. Але в дочірньому процесі ніщо ніколи не зніме блокування, оскільки інші потоки не були репліковані, і дочірній процес більше не зможе виконувати імпорт.Python 2.7 отримує блокування імпорту перед виконанням
os.fork()
, а також очищає будь-які блокування, створені за допомогою модуляthreading
. Модулі розширення C, які мають внутрішні блокування або самі викликаютьfork()
, не матимуть користі від цього очищення.(Виправлено Томасом Воутерсом; bpo-1590864.)
Функція
Py_Finalize()
тепер викликає внутрішню функціюthreading._shutdown()
; це запобігає виникненню деяких винятків, коли інтерпретатор вимикається. (Патч від Адама Олсена; bpo-1722344.)У разі використання структури
PyMemberDef
для визначення атрибутів типу Python більше не дозволить вам спробувати видалити або встановити атрибутT_STRING_INPLACE
.Глобальні символи, визначені модулем
ctypes
, тепер мають префіксPy
або_ctypes
. (Реалізовано Томасом Геллером; bpo-3102.)Нова опція конфігурації: перемикач
--with-system-expat
дозволяє створити модульpyexpat
для використання системної бібліотеки Expat. (Надано Arfrever Frehtes Taifersar Arahesis; bpo-7609.)Новий параметр конфігурації: параметр
--with-valgrind
тепер вимикає розподільник pymalloc, який важко правильно аналізувати детектору помилок пам’яті Valgrind. Таким чином, Valgrind буде краще виявляти витоки пам’яті та перевантаження. (Надав Джеймс Хенстрідж; bpo-2422.)Новий параметр конфігурації: тепер ви можете надати порожній рядок
--with-dbmliborder=
, щоб вимкнути всі різні модулі DBM. (Додано Arfrever Frehtes Taifersar Arahesis; bpo-6491.)Сценарій configure тепер перевіряє помилки округлення з плаваючою комою на певних 32-розрядних мікросхемах Intel і визначає визначення препроцесора
X87_DOUBLE_ROUNDING
. Жоден код наразі не використовує це визначення, але воно доступне, якщо хтось захоче його використати. (Додав Марк Дікінсон; bpo-2937.)configure також тепер встановлює змінну
LDCXXSHARED
Makefile для підтримки зв’язування C++. (Надано Arfrever Frehtes Taifersar Arahesis; bpo-1222585.)Тепер у процесі збирання створюються необхідні файли для підтримки pkg-config. (Надав Клінтон Рой; bpo-3585.)
Процес збирання тепер підтримує Subversion 1.7. (Надано Arfrever Frehtes Taifersar Arahesis; bpo-6094.)
Капсули¶
Python 3.1 додає новий тип даних C, PyCapsule
, для надання C API до модуля розширення. Капсула, по суті, є власником покажчика C void *
і доступна як атрибут модуля; наприклад, API модуля socket
представлено як socket.CAPI
, а unicodedata
— ucnhash_CAPI
. Інші розширення можуть імпортувати модуль, отримати доступ до його словника, щоб отримати об’єкт капсули, а потім отримати покажчик void *
, який зазвичай вказує на масив покажчиків на різні функції API модуля.
Для цього вже використовується існуючий тип даних, PyCObject
, але він не забезпечує безпеки типу. Злий код, написаний на чистому Python, може спричинити помилку сегментації, взявши PyCObject
з модуля A та якимось чином замінивши його на PyCObject
у модулі B. Капсули знають своє ім’я та отримання вказівника вимагає надання імені:
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
Ви впевнені, що vtable
вказує на те, що ви очікуєте. Якщо було передано іншу капсулу, PyCapsule_IsValid()
виявить невідповідне ім’я та поверне false. Зверніться до Надання C API для модуля розширення для отримання додаткової інформації про використання цих об’єктів.
Python 2.7 тепер використовує внутрішньо капсули для надання різноманітних API модулів розширення, але PyCObject_AsVoidPtr()
було змінено для обробки капсул, зберігаючи сумісність під час компіляції з інтерфейсом CObject
. Використання PyCObject_AsVoidPtr()
сигналізує про PendingDeprecationWarning
, яке за умовчанням мовчить.
Реалізовано в Python 3.1 і перенесено до 2.7 Ларрі Гастінгсом; обговорено в bpo-5630.
Зміни, що стосуються порту: Windows¶
Модуль
msvcrt
тепер містить деякі константи з файлу заголовківcrtassem.h
:CRT_ASSEMBLY_VERSION
,VC_ASSEMBLY_PUBLICKEYTOKEN
іLIBRARIES_ASSEMBLY_NAME_PREFIX
. (Надав Девід Курнапо; bpo-4365.)The
_winreg
module for accessing the registry now implements theCreateKeyEx()
andDeleteKeyEx()
functions, extended versions of previously-supported functions that take several extra arguments. TheDisableReflectionKey()
,EnableReflectionKey()
, andQueryReflectionKey()
were also tested and documented. (Implemented by Brian Curtin: bpo-7347.)Новий API
_beginthreadex()
використовується для запуску потоків, і тепер використовуються власні функції локального зберігання потоків. (Надав Крістіян Валур Йонссон; bpo-3582.)Функція
os.kill()
тепер працює в Windows. Значенням сигналу можуть бути константиCTRL_C_EVENT
,CTRL_BREAK_EVENT
або будь-яке ціле число. Перші дві константи надсилатимуть події натискання клавіш Control-C і Control-Break до підпроцесів; будь-яке інше значення використовуватиме APITerminateProcess()
. (Надав Мікі Тебека; bpo-1220212.)Функція
os.listdir()
тепер правильно не працює для порожнього шляху. (Виправлено Хірокадзу Ямамото; bpo-5913.)Модуль
mimelib
тепер читатиме базу даних MIME з реєстру Windows під час ініціалізації. (Патч від Gabriel Genellina; bpo-4969.)
Зміни, що стосуються порту: Mac OS X¶
Шлях
/Library/Python/2.7/site-packages
тепер додається доsys.path
, щоб спільно використовувати додані пакети між інсталяцією системи та копією тієї самої версії, встановленою користувачем. (Змінено Рональдом Оуссореном; bpo-4865.)Змінено в версії 2.7.13: Станом на 2.7.13 цю зміну було видалено.
/Library/Python/2.7/site-packages
, каталог site-packages, який використовується системою Python 2.7, що надається Apple, більше не додається доsys.path
для Python, встановлених користувачем, наприклад із інсталятори python.org. Починаючи з macOS 10.12, Apple змінила конфігурацію системного каталогу site-packages, що могло призвести до збою встановлення компонентів pip, як-от setuptools. Пакети, встановлені для системного Python, більше не будуть надані іншим Python, встановленим користувачами. (bpo-28440)
Зміни, що стосуються порту: FreeBSD¶
Інші зміни та виправлення¶
Два сценарії тестування,
iobench
іccbench
, було додано до каталогуTools
.iobench
вимірює швидкість вбудованих файлових об’єктів вводу/виводу, які повертаєopen()
під час виконання різних операцій, аccbench
є тестом паралелізму, який намагається виміряти пропускну здатність обчислень, затримка перемикання потоків і пропускна здатність обробки вводу/виводу під час виконання кількох завдань із використанням різної кількості потоків.Сценарій
Tools/i18n/msgfmt.py
тепер розуміє форми множини у файлах.po
. (Виправлено Мартіном фон Льовісом; bpo-5464.)Під час імпортування модуля з файлу
.pyc
або.pyo
з наявним аналогом.py
атрибутиco_filename
отриманих об’єктів коду перезаписуються, коли оригінальна назва файлу застаріла. Це може статися, якщо файл було перейменовано, переміщено або доступ до нього здійснюється різними шляхами. (Патч від Ziga Seilnacht і Jean-Paul Calderone; bpo-1180193.)Сценарій
regrtest.py
тепер приймає перемикач--randseed=
, який приймає ціле число, яке використовуватиметься як випадкове початкове значення для параметра-r
, який виконує тести у довільному порядку. Параметр-r
також повідомляє про використане насіння (додано Колліном Вінтером).Інший перемикач
regrtest.py
— це-j
, який приймає ціле число, що вказує, скільки тестів виконується паралельно. Це дозволяє зменшити загальний час роботи на багатоядерних машинах. Ця опція сумісна з кількома іншими опціями, включаючи перемикач-R
, який, як відомо, забезпечує тривалий час роботи. (Додано Антуаном Пітру, bpo-6152.) Це також можна використовувати з новим перемикачем-F
, який запускає вибрані тести в циклі, доки вони не завершаться. (Додав Антуан Пітру; bpo-7312.)Коли модуль
py_compile.py
виконується як сценарій, тепер приймає'-'
як аргумент, який читатиме стандартний вхід для списку імен файлів, які потрібно скомпілювати. (Надав Пьотр Ожаровський; bpo-8233.)
Перенесення на Python 2.7¶
У цьому розділі перераховані раніше описані зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді:
Функція
range()
обробляє свої аргументи більш послідовно; тепер він викличе__int__()
для аргументів, що не є плаваючими, не цілими, які йому надаються. (Виправлено Олександром Белопольським; bpo-1533.)Метод string
format()
змінив стандартну точність, що використовується для чисел з плаваючою комою та комплексних чисел, з 6 знаків після коми на 12, що відповідає точності, яку використовуєstr()
. (Змінено Еріком Смітом; bpo-5920.)Через оптимізацію оператора
with
спеціальні методи__enter__()
і__exit__()
мають належати до типу об’єкта та не можуть бути безпосередньо приєднані до екземпляра об’єкта. Це впливає на класи нового стилю (похідні відobject
) і типи розширень C. (bpo-6101.)Через помилку в Python 2.6 параметр exc_value для методів
__exit__()
часто був рядковим представленням винятку, а не екземпляром. Це було виправлено у версії 2.7, тому exc_value буде екземпляром, як і очікувалося. (Виправлено Флорентом Ксіклюною; bpo-7853.)Коли обмежений набір атрибутів було встановлено за допомогою
__slots__
, видалення невстановленого атрибута не викликало бAttributeError
, як ви очікували. Виправлено Бенджаміном Петерсоном; bpo-7604.)
У стандартній бібліотеці:
Операції з екземплярами
datetime
, які призвели до того, що рік вийшов за межі підтримуваного діапазону, не завжди викликалиOverflowError
. Такі помилки тепер перевіряються більш ретельно, і тепер вони створюють винятки. (Повідомив Марк Леандер, виправлення Ананд Б. Піллаї та Олександр Белопольський; bpo-7150.)Під час використання екземплярів
Decimal
із методомformat()
рядка раніше вирівнювання за замовчуванням було лівим. Це було змінено на вирівнювання за правим краєм, що може змінити вивід ваших програм. (Змінено Марком Дікінсоном; bpo-6857.)Порівняння, що включають сигнальне значення NaN (або
sNAN
), тепер сигналізуютьInvalidOperation
замість мовчки повертати значення true або false залежно від оператора порівняння. Тихі значення NaN (абоNaN
) тепер можна хешувати. (Виправлено Марком Дікінсоном; bpo-7279.)The ElementTree library,
xml.etree
, no longer escapes ampersands and angle brackets when outputting an XML processing instruction (which looks like <?xml-stylesheet href=»#style1»?>) or comment (which looks like <!– comment –>). (Patch by Neil Muller; bpo-2746.)Метод
readline()
об’єктівStringIO
тепер нічого не робить, коли запитується від’ємна довжина, як це роблять інші файлоподібні об’єкти. (bpo-7348).Модуль
syslog
тепер використовуватиме значенняsys.argv[0]
як ідентифікатор замість попереднього значення за замовчуванням'python'
. (Змінено Шоном Райфшнайдером; bpo-8451.)Стандартну обробку помилок модуля
tarfile
було змінено, і більше не пригнічуються фатальні помилки. Раніше рівень помилок за замовчуванням був 0, що означало, що помилки призводили лише до запису повідомлення в журнал налагодження, але оскільки журнал налагодження не активовано за замовчуванням, ці помилки залишаються непоміченими. Рівень помилки за замовчуванням тепер становить 1, що викликає виняток у разі виникнення помилки. (Змінено Ларсом Густебелем; bpo-7357.)Модуль
urlparse
urlsplit()
тепер обробляє невідомі схеми URL відповідно до RFC 3986: якщо URL має форму" <something> ://.. ."
, текст перед://
розглядається як схема, навіть якщо це вигадана схема, про яку модуль не знає. Ця зміна може порушити код, який обійшов стару поведінку. Наприклад, Python 2.6.4 або 2.5 поверне наступне:>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7 (і Python 2.6.5) поверне:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7 фактично створює дещо інший вихід, оскільки він повертає іменований кортеж замість стандартного кортежу.)
Для розширень C:
Розширення C, які використовують коди цілочисельного формату з сімейством функцій
PyArg_Parse*
, тепер викликатимуть винятокTypeError
замість того, щоб запускатиDeprecationWarning
(bpo-5080).Використовуйте нову функцію
PyOS_string_to_double()
замість старих функційPyOS_ascii_strtod()
іPyOS_ascii_atof()
, які зараз є застарілими.
Для програм, які вбудовують Python:
Було додано функцію
PySys_SetArgvEx()
, яка дозволяє програмам закрити дірку в безпеці, коли використовується існуюча функціяPySys_SetArgv()
. Перевірте, чи викликаєте виPySys_SetArgv()
, і уважно обміркуйте, чи має програма використовуватиPySys_SetArgvEx()
зі значенням false для updatepath.
Нові функції, додані до випусків обслуговування Python 2.7¶
Нові функції можуть бути додані до технічних версій Python 2.7, коли цього справді вимагає ситуація. Будь-які такі доповнення повинні пройти через процес Python Enhancement Proposal і надати переконливий аргумент, чому їх не можна належним чином вирішити, додавши нову функцію виключно до Python 3, або опублікувавши її в індексі пакетів Python.
На додаток до конкретних пропозицій, перелічених нижче, існує загальний виняток, який дозволяє додавати нові попередження -3
до будь-якої версії обслуговування Python 2.7.
Дві нові змінні середовища для режиму налагодження¶
У режимі налагодження статистика [xxx refs]
не записується за замовчуванням, змінна середовища PYTHONSHOWREFCOUNT
тепер також має бути встановлена. (Надав Віктор Стіннер; bpo-31733.)
Коли Python скомпільовано з визначеним COUNT_ALLOC
, лічильники розподілу більше не скидаються за замовчуванням: змінна середовища PYTHONSHOWALLOCCOUNT
тепер також має бути встановлена. Крім того, підрахунки розподілу тепер скидаються в stderr, а не в stdout. (Надав Віктор Стіннер; bpo-31692.)
Нове в версії 2.7.15.
PEP 434: Виняток із покращення IDLE для всіх гілок¶
PEP 434 описує загальний виняток для змін, внесених у середовище розробки IDLE, яке постачається разом із Python. Цей виняток дає змогу розробникам IDLE забезпечувати більш послідовний досвід роботи з усіма підтримуваними версіями Python 2 і 3.
Щоб дізнатися більше про будь-які зміни IDLE, зверніться до файлу NEWS для конкретного випуску.
PEP 466: Покращення безпеки мережі для Python 2.7¶
PEP 466 описує низку пропозицій щодо покращення безпеки мережі, які було схвалено для включення до випусків обслуговування Python 2.7, причому перші зміни з’явилися у випуску Python 2.7.7.
PEP 466 пов’язані функції, додані в Python 2.7.7:
hmac.compare_digest()
було перенесено з Python 3, щоб зробити операцію порівняння, стійку до атак, доступною для програм Python 2. (Надав Алекс Гейнор; bpo-21306.)OpenSSL 1.0.1g було оновлено в офіційних інсталяторах Windows, опублікованих на python.org. (Надав Zachary Ware; bpo-21462.)
PEP 466 пов’язані функції, додані в Python 2.7.8:
hashlib.pbkdf2_hmac()
було перенесено з Python 3, щоб зробити алгоритм хешування, придатним для безпечного зберігання паролів, загальнодоступним для програм Python 2. (Надав Алекс Гейнор; bpo-21304.)OpenSSL 1.0.1h було оновлено для офіційних інсталяторів Windows, опублікованих на python.org. (надано Zachary Ware у bpo-21671 для CVE-2014-0224)
PEP 466 пов’язані функції, додані в Python 2.7.9:
Більшість модулів
ssl
Python 3.4 було перенесено назад. Це означає, щоssl
тепер підтримує індикацію імені сервера, налаштування TLS1.x, доступ до сховища сертифікатів платформи, класSSLContext
та інші функції. (Надано Алексом Гейнором і Девідом Рейдом; bpo-21308.)Зверніться до приміток «Додана версія: 2.7.9» у документації модуля, щоб дізнатися більше.
os.urandom()
було змінено, щоб кешувати дескриптор файлу на/dev/urandom
замість повторного відкриття/dev/urandom
під час кожного виклику. (Надав Алекс Гейнор; bpo-21305.)hashlib.algorithms_guaranteed
іhashlib.algorithms_available
було перенесено з Python 3, щоб полегшити програмам Python 2 вибір найнадійнішого доступного алгоритму хешування. (Надав Алекс Гейнор у bpo-21307)
PEP 477: Backport securepip (PEP 453) до Python 2.7¶
PEP 477 схвалює включення модуля PEP 453 securepip і покращеної документації, яку він увімкнув, у випуски обслуговування Python 2.7, які вперше з’явилися у випуску Python 2.7.9.
За замовчуванням завантажувальний pip¶
Новий модуль ensurepip
(визначений у PEP 453) надає стандартний міжплатформний механізм для завантаження інсталятора pip у інсталяції Python. Версія pip
, яка входить до Python 2.7.9, є pip
1.5.6, і в майбутніх випусках технічного обслуговування 2.7.x оновлюватиметься пакетна версія до останньої версії pip
, доступної за адресою час створення реліз-кандидата.
За замовчуванням команди pip
, pipX
і pipX.Y
будуть встановлені на всіх платформах (де X.Y означає версію інсталяції Python), а також pip
Пакет Python і його залежності.
Для CPython source збірок на системах POSIX, команди make install
і make altinstall
не завантажують pip
за замовчуванням. Цю поведінку можна контролювати за допомогою параметрів конфігурації та перевизначати за допомогою параметрів Makefile.
У Windows і Mac OS X інсталятори CPython тепер за замовчуванням встановлюють pip
разом із самим CPython (користувачі можуть відмовитися від його встановлення під час процесу встановлення). Користувачам Windows потрібно буде ввімкнути автоматичні зміни PATH, щоб за замовчуванням мати pip доступним із командного рядка, інакше до нього можна отримати доступ через засіб запуску Python для Windows за допомогою py -m pip
.
Як обговорювалося в PEP, пакувальники платформи можуть не встановлювати ці команди за замовчуванням, якщо під час виклику вони надають чіткі та прості вказівки щодо їх встановлення на цій платформі (зазвичай за допомогою системного менеджера пакетів) .
Зміни в документації¶
As part of this change, the Встановлення модулів Python and Розповсюдження модулів Python sections of the documentation have been completely redesigned as short getting started and FAQ documents. Most packaging documentation has now been moved out to the Python Packaging Authority maintained Python Packaging User Guide and the documentation of the individual projects.
Однак, оскільки ця міграція ще не завершена, застарілі версії цих посібників залишаються доступними як Встановлення модулів Python (застаріла версія) і Розповсюдження модулів Python (застаріла версія).
Дивись також
- PEP 453 – Явне початкове завантаження pip у інсталяціях Python
PEP, написаний Дональдом Стаффтом і Ніком Когланом, реалізований Дональдом Стаффтом, Ніком Когланом, Мартіном фон Льовісом і Недом Дейлі.
PEP 476: увімкнення перевірки сертифіката за замовчуванням для http-клієнтів stdlib¶
PEP 476 оновлено httplib
і модулі, які його використовують, такі як urllib2
і xmlrpclib
, тепер перевіряють, що сервер представляє сертифікат, підписаний сертифікатом Повноваження в довіреному сховищі платформи та чиє ім’я хоста відповідає імені хосту, яке запитується за замовчуванням, що значно покращує безпеку для багатьох програм. Цю зміну було внесено у випуск Python 2.7.9.
Для програм, які вимагають старої попередньої поведінки, вони можуть передавати альтернативний контекст:
import urllib2
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493: інструменти міграції перевірки HTTPS для Python 2.7¶
PEP 493 надає додаткові інструменти міграції для підтримки більш поступового процесу оновлення інфраструктури для середовищ, які містять програми та служби, які покладаються на історично дозволену обробку сертифікатів сервера під час встановлення клієнтських з’єднань HTTPS. Ці доповнення були зроблені у випуску Python 2.7.12.
Ці інструменти призначені для використання у випадках, коли програми та служби, які постраждали, не можна змінити, щоб явно передавати більш дозволений контекст SSL під час встановлення з’єднання.
Для програм і служб, які взагалі неможливо змінити, нова змінна середовища PYTHONHTTPSVERIFY
може бути встановлена на 0
, щоб повернути весь процес Python назад до дозволеної поведінки за замовчуванням Python 2.7.8 і попередніх версій. .
У випадках, коли код встановлення з’єднання не можна змінити, але загальну програму можна змінити, нову функцію ssl._https_verify_certificates()
можна використовувати для налаштування поведінки за замовчуванням під час виконання.
Нова ціль збірки make regen-all
¶
Щоб спростити крос-компіляцію та гарантувати, що CPython можна надійно скомпілювати без наявності наявної версії Python, система збирання на основі autotools більше не намагається неявно перекомпілювати згенеровані файли на основі часу модифікації файлу.
Натомість додано нову команду make regen-all
, щоб примусово повторно генерувати ці файли за бажанням (наприклад, після того, як початкова версія Python вже була створена на основі попередньо згенерованих версій).
Також визначено більш вибіркові цілі регенерації - подробиці див. Makefile.pre.in.
(Надав Віктор Стіннер у bpo-23404.)
Нове в версії 2.7.14.
Видалення цілі збірки make touch
¶
Ціль збірки make touch
, яка раніше використовувалася для запиту неявної регенерації згенерованих файлів шляхом оновлення часу їх модифікації, видалено.
Його було замінено новою метою make regen-all
.
(Надав Віктор Стіннер у bpo-23404.)
Змінено в версії 2.7.14.
Подяки¶
Автор хотів би подякувати наступним особам за пропозиції, виправлення та допомогу з різними чернетками цієї статті: Ніку Коглану, Філіпу Дженві, Райану Ловетту, Р. Девіду Мюррею, Х’ю Секер-Вокеру.