What’s New in Python 2.7¶
作者: | 上午。 Kuchling(amk at amk.ca) |
---|
本文解释了Python 2.7中的新功能。Python 2.7于2010年7月3日发布。
对于浮点数和Decimal
类,数值处理在许多方面都得到了改进。There are some useful additions to the standard library, such as a greatly enhanced unittest
module, the argparse
module for parsing command-line options, convenient OrderedDict
and Counter
classes in the collections
module, and many other improvements.
Python 2.7计划是2.x版本中的最后一个版本,因此我们致力于使其成为长期的良好版本。为了帮助移植到Python 3,2.7中包括了Python 3.x系列的几个新功能。
本文不试图提供新功能的完整规范,而是提供了一个方便的概述。For full details, you should refer to the documentation for Python 2.7 at https://docs.python.org. 如果您想了解设计和实现的基本原理,请参阅PEP了解一个特定的新功能或在https://bugs.python.org中讨论的更改的问题。只要有可能,“Python的新增功能”链接到每个更改的错误/修补程序项。
The Future for 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.x版本相比,2.7版本具有更长的维护周期。目前预期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增强提议过程来将新特性直接添加到Python 2标准库。任何此类添加以及添加它们的维护版本都将在下面的New Features Added to Python 2.7 Maintenance Releases部分中说明。
对于希望从Python 2迁移到Python 3的项目,或者对于希望在Python 2和Python 3上支持用户的库和框架开发人员,有多种工具和指南可用于帮助决定合适的方法,并管理一些涉及的技术细节。推荐的起点是Porting Python 2 Code to Python 3 HOWTO指南。
Changes to the Handling of Deprecation Warnings¶
对于Python 2.7,默认情况下,政策决定默认开发人员只关心警告。DeprecationWarning
及其后代现在被忽略,除非另有要求,从而阻止用户看到应用程序触发的警告。这个改变也发生在成为Python 3.2的分支中。(讨论stdlib-sig并在issue 7319中执行。)
在之前的版本中,默认情况下启用了DeprecationWarning
消息,为Python开发人员提供了明确的代码在未来主要版本的Python中可能出现的位置。
然而,越来越多的基于Python的应用程序的用户不直接参与这些应用程序的开发。DeprecationWarning
消息与这些用户无关,使他们担心实际工作正常的应用程序,并使应用程序开发人员对这些问题做出响应。
您可以通过使用-Wdefault
(缩写:-Wd
)开关运行Python来重新启用DeprecationWarning
在运行Python之前,将 PYTHONWARNINGS
环境变量设置为"default"
(或"d"
)。Python代码还可以通过调用warnings.simplefilter('default')
重新启用它们。
unittest
模块还会在运行测试时自动重新启用弃用警告。
Python 3.1 Features¶
就像Python 2.6引入了Python 3.0的特性一样,2.7版本包含了Python 3.1中的一些新特性。2.x系列继续提供用于迁移到3.x系列的工具。
3.1特性的部分列表,反向运行到2.7:
- set字面值(
{1,2,3}
的语法是一个可变集合)。 - 字典和集合推导式(
{i: i * 2 for i / t5> range(3)}
)。 - 在单个
with
语句中的多个上下文管理器。 - 新版本的
io
库,在C中重写为性能。 - 在PEP 372: Adding an Ordered Dictionary to collections中描述的有序字典类型。
- PEP 378: Format Specifier for Thousands Separator中描述的新
","
格式说明符。 memoryview
对象。importlib
模块的一个小子集,如下所述。- 在许多情况下,浮点
x
的repr()
更短:它现在基于保证回到x
的最短十进制字符串, 。和以前版本的Python一样,保证float(repr(x))
恢复x
。 - 浮点到字符串和字符串到浮点的转换是正确地舍入。
round()
函数现在也正确地舍入。 PyCapsule
类型,用于为扩展模块提供C API。PyLong_AsLongAndOverflow()
C API函数。
其他新的Python3模式警告包括:
operator.isCallable()
和operator.sequenceIncludes()
在3.x中不支持,现在触发警告。-3
开关现在自动启用-Qwarn
开关,该开关会导致关于使用整数和长整数的经典除法的警告。
PEP 372: Adding an Ordered Dictionary to collections¶
正则Python字典按任意顺序对键/值对进行迭代。多年来,许多作者已经编写了另外的实现,记住键最初插入的顺序。基于这些实现的经验,2.7在collections
模块中引入了新的OrderedDict
类。
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
与常规字典进行比较会忽略插入顺序,并仅比较键和值。
OrderedDict
如何工作?它维护一个双重链接的键列表,在列表插入时添加新的键。辅助字典将键映射到其相应的列表节点,因此删除不必遍历整个链表,因此保留O(1)。
标准库现在支持在几个模块中使用有序字典。
ConfigParser
模块在默认情况下使用它们,这意味着现在可以读取,修改配置文件,然后按原始顺序写回配置文件。collections.namedtuple()
的_asdict()
方法现在返回一个有序字典,其值按照与基础元组索引相同的顺序出现。- 使用object_pairs_hook参数扩展
json
模块的JSONDecoder
类构造函数,以允许解码器构建OrderedDict
实例。还为PyYAML等第三方工具添加了支持。
也可以看看
- PEP 372 - 将有序字典添加到容器
- 由Armin Ronacher和Raymond Hetting撰写的PEP;由Raymond Hettinger实施。
PEP 378: Format Specifier for Thousands Separator¶
为了使程序输出更易读,将分隔符添加到大数字,将它们转换为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由Raymond Hetting撰写;由Eric Smith执行。
PEP 389: The argparse Module for Parsing Command Lines¶
用于解析命令行参数的argparse
模块被添加为optparse
模块的更强大的替代。
这意味着Python现在支持三种不同的模块来解析命令行参数:getopt
,optparse
和argparse
。getopt
模块非常类似于C库的getopt()
函数,因此如果您编写的Python原型最终将在C中重写,它仍然有用。optparse
变得多余,但没有计划删除它,因为有很多脚本仍在使用它,并且没有自动化的方式来更新这些脚本。(使argparse
API与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
有更多的验证验证;您可以通过传递'*'
,1个或多个传递'+'
来指定参数的精确数目为整数,0个或多个参数, '?'
。A top-level parser can contain sub-parsers to define subcommands that have different sets of switches, as in svn commit
, svn checkout
, etc. 您可以将参数类型指定为FileType
,这将自动为您打开文件,并理解'-'
表示标准输入或输出。
也可以看看
argparse
文档- argparse模块的文档页面。
- Upgrading optparse code
- Python文档的一部分,介绍如何转换使用
optparse
的代码。 - PEP 389 - argparse - 新命令行解析模块
- PEP由Steven Bethard编写和实施。
PEP 391: Dictionary-Based Configuration For Logging¶
logging
模块非常灵活;应用程序可以定义记录子系统的树,并且此树中的每个记录器可以过滤掉某些消息,以不同的方式格式化消息,并将消息定向到不同数量的处理程序。
所有这些灵活性都需要大量的配置。你可以编写Python语句来创建对象和设置它们的属性,但是复杂的设置需要冗长但是无聊的代码。logging
还支持解析文件的fileConfig()
函数,但是文件格式不支持配置过滤器,并且以编程方式生成。
Python 2.7添加了一个使用字典配置日志记录的dictConfig()
函数。有许多方法从不同的来源产生一个字典:用代码构造一个;解析包含JSON的文件;或者使用YAML解析库(如果安装了)。有关详细信息,请参阅Configuration functions。
以下示例配置两个日志记录器,根记录器和名为“network”的记录器。发送到根记录器的消息将使用syslog协议发送到系统日志,到“网络”记录器的消息将写入network.log
文件,一旦日志达到1MB。
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
模块的三个较小的增强功能,全部由Vinay Sajip实现,它们是:
SysLogHandler
类现在支持通过TCP的syslogging。构造函数具有给出要使用的套接字类型的socktype参数,对于UDP为socket.SOCK_DGRAM
,对于TCP为socket.SOCK_STREAM
。默认协议保持UDP。Logger
实例获得了一个使用相对路径检索后代记录器的getChild()
方法。例如,通过执行日志 = getlogger('app')
检索记录器,调用log.getChild('network.listen')
等效于getLogger('app.network.listen')
。LoggerAdapter
类获得了一个采用级的isEnabledFor()
方法,并返回底层记录器是否处理重要性级别的消息。
也可以看看
- PEP 391 - 日志记录的基于字典的配置
- PEP由Vinay Sajip编写和实施。
PEP 3106: Dictionary Views¶
字典方法keys()
,values()
和items()
在Python 3.x中是不同的。它们返回一个名为视图的对象,而不是完全实现的列表。
在Python 2.7中不能更改keys()
,values()
和items()
的返回值,打破。而是以新名称viewkeys()
,viewvalues()
和viewitems()
添加3.x版本。
>>> 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 3106 - 修改dict.keys(),.values()和.items()
- PEP由Guido van Rossum写。由Alexandre Vassalotti回溯到2.7; issue 1967。
PEP 3137: The memoryview Object¶
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')
>>>
Other Language Changes¶
核心Python语言的一些较小的更改是:
set字面值的语法已从Python 3.x反向导出。花括号用于包围生成的可变集的内容; set字面值通过不包含冒号和值与字典区分开来。
{}
继续表示一个空字典;对于空集,使用set()
。>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
由Alexandre Vassalotti负责; 发行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'])
由Alexandre Vassalotti负责; issue 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;由Georg Brandl实施)。
浮点数和字符串之间的转换现在在大多数平台上正确地舍入。这些转换发生在许多不同的地方:浮点和复数上的
str()
float
和complex
构造函数;数字格式;使用marshal
,pickle
和json
模块对浮动和复数进行序列化和反序列化;在Python代码中解析float和虚字面值;和Decimal
到浮点型转换。与此相关,浮点数x的
repr()
现在返回基于最短十进制字符串的结果,该十进制字符串保证回绕到x 在正确的舍入下(具有从半到偶的舍入模式)。以前,它给出了基于将x四舍五入到十进制数字的字符串。负责此改进的舍入库在Windows和使用gcc,icc或suncc编译器的Unix平台上工作。可能存在少量平台,其中不能保证对该代码的正确操作,因此在这样的系统上不使用代码。您可以通过检查
sys.float_repr_style
来确定要使用的代码,如果新代码正在使用,则short
,legacy
if它不是。由Eric Smith和Mark Dickinson执行,使用David Gay的
dtoa.c
库; 问题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
(由Mark Dickinson执行; 问题3166。)
整数除法在其舍入行为中也更准确。(由Mark Dickinson执行; 问题1811。)
复数的隐式强制已被删除;解释器将不再尝试在复杂对象上调用
__coerce__()
方法。(由Meador Inge和Mark Dickinson删除; 问题5211。)str.format()
方法现在支持替换字段的自动编号。这使得使用str.format()
更类似于使用%s
格式化:>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
自动编号从左到右采用字段,因此第一个
{...}
说明符将使用第一个参数str.format()
,下一个说明符将使用下一个参数,等等。您不能混合使用自动编号和显式编号 - 对所有说明符字段进行编号,或者不编号,但您可以混合自动编号和命名字段,如上面的第二个示例所示。(由Eric Smith提供; 第5237期。)复数现在可以正确支持使用
format()
,并且默认为右对齐。指定精度或逗号分隔适用于数字的实部和虚部,但指定的字段宽度和对齐应用于整个输出的1.5+3j
。(由Eric Smith提供; 发行1588和发行7988。)'F'格式代码现在总是使用大写字符格式化其输出,因此它现在将产生'INF'和'NAN'。(由Eric Smith提供; 第3382期。)
低级更改:
object.__format__()
方法现在触发PendingDeprecationWarning
,如果它传递了格式字符串,因为__format__()
方法object
将对象转换为字符串表示形式并对其进行格式化。以前,该方法以静默方式将格式字符串应用于字符串表示,但这可能会隐藏Python代码中的错误。如果您要提供格式化信息(如对齐方式或精确度),则可能您希望格式化以特定对象的方式应用。(由Eric Smith修正; 问题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
(由Fredrik Johansson和Victor Stinner撰写; 问题3439。)
import
语句将不再尝试绝对导入,如果相对导入(例如,从 .os 导入 sep
)失败。这修复了一个错误,但可能会破坏某些只有意外工作的import
语句。(由Meador Inge修正; 问题7902。)现在,内建
unicode
类型的子类可以覆盖__unicode__()
方法。(由Victor Stinner执行; 发行1583863。)bytearray
类型的translate()
方法现在接受None
作为其第一个参数。(由Georg Brandl修订; 问题4759。)当使用
@classmethod
和@staticmethod
将方法包装为类或静态方法时,包装器对象现在将包装函数公开为其__func__
属性。(由Amaury Forgeot d'Arc提供,经过George Sakkis的建议; 第5982期。)当使用
__slots__
设置一组有限的属性时,删除unset属性不会像你所期望的那样引发AttributeError
。由本杰明·彼得森修正; issue 7604。)现在支持两种新的编码:“cp720”,主要用于阿拉伯语文本;和“cp858”,CP 850的变体,添加欧元符号。(CP720由Alexander Belchenko和Amaury Forgeot d'Arc在问题1616979 t>中提供; CP 858由Tim Hatch在问题8016中提供)
The
file
object will now set thefilename
attribute on theIOError
exception when trying to open a directory on POSIX platforms (noted by Jan Kaliszewski; issue 4764), and now explicitly checks for and forbids writing to read-only file objects instead of trusting the C library to catch and report the error (fixed by Stefan Krah; issue 5677).Python标记器现在翻译行结束本身,因此
compile()
内建函数现在接受使用任何行结束约定的代码。此外,它不再要求代码在换行符结束。函数定义中的额外括号在Python 3.x中是非法的,这意味着您会从
def f((x))获取语法错误: pass
。在Python3警告模式下,Python 2.7现在会警告这种奇怪的用法。(James Lingard注意到; 问题7362。)现在可以创建对旧式类对象的弱引用。新式类总是弱引用。(由Antoine Pitrou修正; 问题8268。)
当模块对象被垃圾回收时,模块的字典现在只有在没有其他人持有字典引用(issue 7140)时才被清除。
Interpreter Changes¶
新的环境变量 PYTHONWARNINGS
允许控制警告。应将其设置为包含警告设置的字符串,与使用-W
开关时相同,用逗号分隔。(由Brian Curtin提供; 问题7301。)
例如,以下设置将在每次发生时打印警告,但将Cookie
模块中的警告转为错误。(设置环境变量的确切语法因操作系统和shell而异。)
export PYTHONWARNINGS=all,error:::Cookie:0
Optimizations¶
增加了几个性能增强:
A new opcode was added to perform the initial setup for
with
statements, looking up the__enter__()
and__exit__()
methods. (供稿人:Benjamin Peterson。)垃圾收集器现在对于一种常见的使用模式执行得更好:当分配许多对象而不解除它们中的任何一个时。这以前为垃圾容器采取二次时间,但现在随着堆上的对象数量的增长,完全垃圾容器的数量减少。当中间代被收集10次并且当来自中间代的幸存者对象的数量超过最旧一代中的对象数量的10%时,新逻辑仅执行完全垃圾容器通过。(由Martin vonLöwis提出并由Antoine Pitrou执行; 问题4074。)
垃圾收集器试图避免跟踪不能作为循环的一部分的简单容器。在Python 2.7中,现在对于包含原子类型(例如int,字符串等)的元组和dicts是真的。传递地,包含原子类型的元组的dict将不被跟踪。这有助于通过减少收集器要考虑和遍历的对象的数量来降低每个垃圾容器的成本。(由Antoine Pitrou提供; 问题4688。)
长整数现在内部存储在基本2 ** 15或基本2 ** 30中,基本在构建时确定。以前,他们总是存储在基地2 ** 15。使用base 2 ** 30在64位机器上提供了显着的性能改进,但是在32位机器上的基准测试结果是混合的。因此,默认是在64位机器上使用base 2 ** 30,在32位机器上使用2 ** 15;在Unix上,有一个新的配置选项
--enable-big-digits
可用于覆盖此默认值。除了性能改进之外,这种改变对于最终用户是不可见的,有一个例外:为了测试和调试的目的,有一个新的structseq
sys.long_info
提供有关内部格式的信息,每个数字和用于存储每个数字的C类型的字节大小:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(由Mark Dickinson提供; 问题4258。)
另一组更改使长对象减少了几个字节:在32位系统上小2个字节,在64位系统上小6个字节。(由Mark Dickinson提供; 第5260期。)
通过收紧内部循环,执行移位而不是乘法,并固定不必要的额外迭代,使得长整型的除法算法更快。对于长整数除法和模运算,各种基准显示50%和150%之间的加速。(由Mark Dickinson提供; 问题5512。)按位操作也明显更快(由Gregory Smith初始补丁; 问题1087418)。
%
的实现检查左侧操作数是Python字符串,并检查特殊情况;对于经常对字符串使用%
的应用程序(如模板库),这会导致性能提高1-3%。(由Collin Winter执行; 问题5176。)将具有
if
条件的列表推导式编译为更快的字节码。(Patch by Antoine Pitrou,back-ported to 2.7 by Jeffrey Yasskin; issue 4715。)通过特殊外壳基数10而不是使用支持任意基数的通用转换函数,可以更快地将整数或长整数转换为十进制字符串。(Patch by Gawain Bolton; issue 6713。)
The
split()
,replace()
,rindex()
,rpartition()
, andrsplit()
methods of string-like types (strings, Unicode strings, andbytearray
objects) now use a fast reverse-search algorithm instead of a character-by-character scan. 这有时快10倍。(由Florent Xicluna添加; 问题7462和问题7622)。pickle
和cPickle
模块现在会自动将用于属性名称的字符串内部化,从而减少由unpickling导致的对象的内存使用。(由Jake McGuire提供; 第5084期。)cPickle
模块现在特殊情况下的字典,几乎将所需的时间减半。(由Collin Winter提供; 问题5670。)
New and Improved Modules¶
与每个版本一样,Python的标准库接受了一些增强和错误修复。这里是最显着的变化的部分列表,按模块名称按字母顺序排序。请参阅源树中的Misc/NEWS
文件,以获取更完整的更改列表,或查看Subversion日志以了解所有详细信息。
bdb
模块的基本调试类Bdb
获得了跳过模块的功能。构造函数现在采用包含glob样式模式的迭代,如django.*
;调试器不会从符合这些模式之一的模块进入堆栈帧。(由Sullil Kumaran的建议,由Maru Newby提供; 问题5142。)binascii
模块现在支持缓冲区API,因此可以与memoryview
实例和其他类似的缓冲区对象一起使用。(Backported from 3.x by Florent Xicluna; issue 7703。)更新模块:
bsddb
模块已从4.7.2devel9更新到pybsddb软件包的版本4.8.4。新版本具有更好的Python 3.x兼容性,各种错误修复,并添加了几个新的BerkeleyDB标志和方法。(由JesúsCeaAvión更新; 问题8156。可以在http://hg.jcea.es/pybsddb/file/tip/ChangeLog读取pybsddb更改日志。)bz2
模块的BZ2File
现在支持上下文管理协议,因此您可以用与 bz2.BZ2File ) as f:
。(由HagenFürstenau提供; 问题3860。)新类:
collections
模块中的Counter
类对于计算数据非常有用。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()
接受一个迭代,并为每个元素减去一个,而不是添加;如果参数是字典或另一个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
供稿人:Raymond Hettinger; issue 1696199。
新类:
OrderedDict
在上一节PEP 372: Adding an Ordered Dictionary to collections中进行了描述。新方法:
deque
数据类型现在具有count()
方法,该方法返回等于提供的参数x的包含元素的数量, areverse()
方法反转deque的元素。deque
也将其最大长度公开为只读maxlen
属性。(这两个功能由Raymond Hettinger增加。)namedtuple
类现在具有可选的重命名参数。如果rename为真,则由于重复或不是合法的Python标识符而无效的字段名称将重命名为从字段列表中的字段位置派生的合法名称:>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(由Raymond Hettinger添加; 问题1818。)
最后,如果将映射与不是
Mapping
的另一个类型进行比较,则Mapping
抽象基类现在返回NotImplemented
。(由Daniel Stutzbach修正; 问题8729。)ConfigParser
模块中的解析类的构造函数现在采用allow_no_value参数,默认为false;如果为true,将允许没有值的选项。例如:>>> 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'
(供稿人:Mats Kindahl; 问题7005。)
不再支持的函数:
contextlib.nested()
,允许使用单个with
语句处理多个上下文管理器,已被弃用,因为with
cookielib
模块现在会忽略具有无效版本字段(不包含整数值)的Cookie。(由John J. Lee修订; 问题3924。)copy
模块的deepcopy()
函数现在将正确复制绑定的实例方法。(由Robert Collins实施; 问题1515。)ctypes
模块现在总是将None
转换为声明为指针的参数的C NULL指针。(由Thomas Heller改变; 问题4606。)底层的libffi库已更新到版本3.0.9,包含不同平台的各种修复程序。(由Matthias Klose更新; 问题8142。)新方法:
datetime
模块的timedelta
类获得了一个total_seconds()
方法,该方法返回持续时间内的秒数。(由Brian Quinlan提供; 问题5788。)新方法:
Decimal
类获得了一个执行将浮点数精确转换为Decimal
的from_float()
类方法。这个精确的转换努力达到浮点表示的值的最接近的十进制近似;则所得到的十进制值将仍然包括不准确性(如果有的话)。例如,Decimal.from_float(0.1)
返回Decimal('0.1000000000000000055511151231257827021181583404541015625')
。(由Raymond Hettinger实施; 问题4796。)将
Decimal
的实例与浮点数进行比较现在可以根据操作数的数值生成合理的结果。以前,这种比较可以回溯到Python的用于比较对象的默认规则,根据它们的类型产生任意结果。请注意,您仍然无法在其他操作(如加法)中组合Decimal
和浮点数,因为您应该明确选择如何在float和Decimal
之间进行转换。(由Mark Dickinson修正; 问题2531。)Decimal
的构造函数现在接受浮点数(由Raymond Hettinger添加; 问题8257)和非欧洲Unicode字符,例如Arabic-Indic数字(由Mark Dickinson ; issue 6595)。Context
类的大多数方法现在接受整数以及Decimal
实例;唯一的例外是canonical()
和is_canonical()
方法。(Pocket by JuanJoséConti; issue 7633。)当使用具有字符串
format()
方法的Decimal
实例时,默认对齐方式为左对齐。这已经更改为右对齐,这对于数字类型更为明智。(更改者:Mark Dickinson; 问题6857。)涉及信令NaN值(或
sNAN
)的比较现在发信号InvalidOperation
,而不是根据比较操作符号静默地返回真或假值。静态NaN值(或NaN
)现在是可哈希的。(由Mark Dickinson修正; 问题7279。)difflib
模块现在生成的输出与现代的diff / 补丁工具更加兼容,通过一个小小的改动,使用制表符而不是空格在标题中的分隔符给出文件名。(由Anatoly Techtonik修订; 问题7585。)Distutils
sdist
命令现在总是重新生成MANIFEST
文件,因为即使MANIFEST.in
或setup.py
文件没有被修改,用户可能已经创建了一些应该包括的新文件。(由TarekZiadé修正; issue 8688。)doctest
模块的IGNORE_EXCEPTION_DETAIL
标志现在将忽略包含正在测试的异常的模块的名称。(Patch by Lennart Regebro; issue 7490。)email
模块的Message
类现在将接受Unicode值有效负载,自动将有效负载转换为由output_charset
指定的编码。(由R. David Murray添加; 问题1368247。)Fraction
类现在接受单个浮动或Decimal
实例或两个有理数作为其构造函数的参数。(由Mark Dickinson执行; 问题5812中添加了逻辑,在问题8294中为float / decimal)。Ordering comparisons (
<
,<=
,>
,>=
) between fractions and complex numbers now raise aTypeError
. 这修复了疏漏,使Fraction
与其他数字类型匹配。新类:
ftplib
模块中的FTP_TLS
提供使用TLS封装的身份验证以及后续控制和数据传输的安全FTP连接。(由Giampaolo Rodola提供; 第2054期。)用于二进制上传的
storbinary()
方法现在可以通过添加休息参数(由Pablo Mouzo修补; 问题6845)重新开始上传。新类装饰器:
functools
模块中的total_ordering()
使用一个定义__eq__()
方法的类以及__lt__()
,__le__()
,__gt__()
或__ge__()
,并生成缺少的比较方法。因为__cmp__()
方法在Python 3.x中已被弃用,所以这个装饰器件更容易定义有序类。(由Raymond Hettinger添加; 问题5479。)New function:
cmp_to_key()
will take an old-style comparison function that expects two arguments and return a new callable that can be used as the key parameter to functions such assorted()
,min()
andmax()
, etc. 主要的用途是帮助使代码与Python 3.x兼容。(由Raymond Hettinger添加。)新函数:如果给定实例由垃圾收集器跟踪,则
gc
模块的is_tracked()
返回true,否则返回false。(由Antoine Pitrou提供; 问题4688。)The
gzip
module’sGzipFile
now supports the context management protocol, so you can writewith gzip.GzipFile(...) as f:
(contributed by Hagen Fürstenau; issue 3860), and it now implements theio.BufferedIOBase
ABC, so you can wrap it withio.BufferedReader
for faster processing (contributed by Nir Aides; issue 7471). 现在也可以通过向构造函数提供可选的时间戳来覆盖gzip压缩文件中记录的修改时间。(供稿人:Jacques Frechet; 第4272期。)gzip格式的文件可以用尾随零字节填充;
gzip
模块现在将消耗这些拖尾字节。(由Tadek Pietraszek和Brian Curtin修订; 问题2846。)新属性:
hashlib
模块现在具有包含命名支持的算法的元组的algorithms
属性。在Python 2.7中,hashlib.algorithms
包含('md5', 'sha1', 'sha224' t5> 'sha256', 'sha384', 'sha512')
。(由Carl Chenet提供; 第7418期。)httplib
模块使用的默认HTTPResponse
类现在支持缓冲,从而更快地读取HTTP响应。(由KristjánValurJónsson提供; 问题4879。)HTTPConnection
和HTTPSConnection
类现在支持source_address参数,(主机, 端口)
2-tuple给出将用于连接的源地址。(供稿人:Eldon Ziegler; issue 3972。)ihooks
模块现在支持相对导入。请注意,ihooks
是用于自定义导入的旧模块,由在Python 2.0中添加的imputil
模块取代。(Neil Schemenauer添加的相对导入支持。)新函数:
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)
供稿人:George Sakkis; issue 3135。
更新模块:
io
库已升级到Python 3.1附带的版本。对于3.1,I / O库完全在C中重写,并且根据执行的任务快2到20倍。原始的Python版本已重命名为_pyio
模块。One minor resulting change: the
io.TextIOBase
class now has anerrors
attribute giving the error setting used for encoding and decoding errors (one of'strict'
,'replace'
,'ignore'
).io.FileIO
类现在引发OSError
时传递的无效文件描述器。(由Benjamin Peterson执行; 问题4991。)truncate()
方法现在保留文件位置;以前它会将文件位置更改为新文件的结尾。(由Pascal Chambon修正; 问题6939。)新功能:
itertools.compress(data, 选择器)
需要两个迭代器。如果选择器中的对应值为真,则返回数据的元素: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()
现在有一个步长参数,允许以除1之外的值递增。count()
,并使用非整数值(如浮点数或Decimal
实例)。(由Raymond Hettinger实施; 发行5032。)itertools.combinations()
anditertools.product()
previously raisedValueError
for values of r larger than the input iterable. 这被认为是一个规范错误,所以他们现在返回一个空的迭代器。(由Raymond Hettinger修正; 问题4816。)更新模块:
json
模块已升级到simplejson包的2.0.9版本,其中包含一个C扩展,可以更快地进行编码和解码。(由Bob Ippolito提供; 问题4136。)为了支持新的
collections.OrderedDict
类型,json.load()
现在有一个可选的object_pairs_hook参数,其解码成对的列表。(由Raymond Hettinger提供; 第5381期。)mailbox
模块的Maildir
类现在将时间戳记录在其读取的目录上,并且只有在修改时间已更改后才重新读取。这通过避免不必要的目录扫描来提高性能。(由A.M.Kuchling和Antoine Pitrou修订; 问题1607951,问题6896。)New functions: the
math
module gainederf()
anderfc()
for the error function and the complementary error function,expm1()
which computese**x - 1
with more precision than usingexp()
and subtracting 1,gamma()
for the Gamma function, andlgamma()
for the natural log of the Gamma function. (由Mark Dickinson和nirinA raseliarison提供; 第3366期。)multiprocessing
模块的Manager*
类现在可以传递一个可调用,每当一个子过程被启动时被调用,以及一组将被传递给可调用的参数。(由lekma提供; 问题5585。)控制工作进程池的
Pool
类现在具有可选的maxtasksperchild参数。工作进程将执行指定数量的任务,然后退出,使Pool
启动一个新工作。如果任务可能泄漏内存或其他资源,或者如果某些任务将导致worker变得非常大,这是非常有用的。(由Charles Cazabon提供; 问题6963。)新功能:
os
模块包装以下POSIX系统调用:getresgid()
和getresuid()
保存的GID和UID;setresgid()
和setresuid()
,将真实,有效和保存的GID和UID设置为新值;initgroups()
,初始化当前进程的组访问列表。(由Travis H; 问题6508贡献的GID / UID功能。支持由Jean-Paul Calderone添加的initgroup; issue 7333。)os.fork()
函数现在在子进程中重新初始化导入锁;这修复了当从线程调用fork()
时Solaris上的问题。(由Zsolt Cserna修正; 问题7242。)在
os.path
模块中,normpath()
和abspath()
(normpath()
fixed by Matt Giuca in issue 5827;abspath()
fixed by Ezio Melotti in issue 3426.)pydoc
模块现在可以帮助Python使用的各种符号。You can now dohelp('<<')
orhelp('@')
, for example. (由David Laban提供; 问题4739。)The
re
module’ssplit()
,sub()
, andsubn()
now accept an optional flags argument, for consistency with the other functions in the module. (由Gregory P.史密斯。)新函数:
runpy
模块中的run_path()
将在提供的路径参数下执行代码。路径可以是Python源文件(example.py
),编译的字节码文件(example.pyc
),./package/
)或zip存档(example.zip
)。如果提供了目录或zip路径,它将被添加到sys.path
的前面,并且将导入模块__main__
。预计目录或zip包含__main__.py
;如果没有,可以从sys.path
中稍后导入一些其他__main__.py
。这使得runpy
的更多机制可用于希望模仿Python的命令行处理显式路径名的方式的脚本。(由Nick Coghlan添加; 问题6816。)新功能:在
shutil
模块中,make_archive()
获取文件名,归档类型(zip或tar格式)和目录路径,目录的内容。(由TarekZiadé添加。)shutil
的copyfile()
和copytree()
函数现在引发一个SpecialFileError
异常管。以前,代码将通过打开它们来进行读取来处理命名管道,就像普通文件一样,这将无限期地阻塞。(由Antoine Pitrou修订; 问题3002。)signal
模块不再重新安装信号处理程序,除非这是真正必要的,这修复了一个可能导致无法捕获EINTR信号的Bug。(由Charles-Francois Natali修订; 问题8354。)新功能:在
site
模块中,三个新函数返回各种站点和用户特定的路径。getsitepackages()
returns a list containing all global site-packages directories,getusersitepackages()
returns the path of the user’s site-packages directory, andgetuserbase()
returns the value of theUSER_BASE
environment variable, giving the path to a directory that can be used to store data. (由TarekZiadé提供; 问题6693。)site
模块现在会报告导入sitecustomize
模块时发生的异常,并且将不再捕获并触发KeyboardInterrupt
异常。(由Victor Stinner修订; 第3137期。)create_connection()
函数获得了source_address参数,(主机, 端口) t4 > 2-tuple给出将用于连接的源地址。
(供稿人:Eldon Ziegler; issue 3972。)recv_into()
和recvfrom_into()
方法现在将写入支持缓冲区API的对象,最有用的是bytearray
和memoryview
对象。(由Antoine Pitrou执行; 发行8104。)SocketServer
模块的TCPServer
类现在支持套接字超时并禁用Nagle算法。disable_nagle_algorithm
类属性默认为False;如果重写为True,新的请求连接将设置TCP_NODELAY选项,以防止缓冲许多小发送到单个TCP数据包。timeout
class属性可以保存将应用于请求套接字的超时(以秒为单位);如果在该时间内没有收到请求,则handle_timeout()
将被调用,handle_request()
将返回。(由KristjánValurJónsson提供; 问题6192和问题6267。)更新模块:
sqlite3
模块已更新到版本2.6.0的pysqlite软件包。版本2.6.0包括许多错误修复,并添加了从共享库加载SQLite扩展的能力。调用enable_load_extension(True)
方法启用扩展,然后调用load_extension()
加载特定的共享库。(由GerhardHäring更新。)ssl
模块的SSLSocket
对象现在支持缓冲区API,它修复了测试套件故障(由Antoine Pitrou修复; 问题7133)并自动设置OpenSSL的SSL_MODE_AUTO_RETRY
,这将阻止从触发SSL重新协商的操作(recv()
返回的错误代码(由Antoine Pitrou修复; 问题8222 )。ssl.wrap_socket()
构造函数现在采用密码参数,该参数是列出要允许的加密算法的字符串;该字符串的格式在OpenSSL文档中描述为。(由Antoine Pitrou添加; 发行8322。)另一个更改使扩展加载所有OpenSSL的密码和摘要算法,以便它们都可用。某些SSL证书无法验证,报告“未知算法”错误。(由Beda Kosata报告,由Antoine Pitrou修订; 第8484期。)
正在使用的OpenSSL版本现在可用作模块属性
ssl.OPENSSL_VERSION
(字符串),ssl.OPENSSL_VERSION_INFO
(5元组)和ssl.OPENSSL_VERSION_NUMBER
(整数)。(由Antoine Pitrou添加; 发行8321。)当某个值对于特定的整数格式代码(
bBhHiIlLqQ
之一)太大时,struct
模块将不再默认忽略溢出错误;它现在总是引发一个struct.error
异常。(更改者:Mark Dickinson; issue 1523。)pack()
函数还将尝试使用__index__()
转换和封装非整数,然后再尝试__int__()
(更改者:Mark Dickinson; 发行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
(供稿:Gregory P.史密斯。)
subprocess
模块现在将在接收到EINTR
信号时重试其内部系统调用。(由几个人报告;最后补丁由Gregory P.史密斯在问题1068268。)新函数:
symtable
模块中的is_declared_global()
对显式声明为全局的变量返回true,对于隐式全局变量返回false。(由Jeremy Hylton提供。)syslog
模块现在将使用sys.argv[0]
的值作为标识符,而不是先前的默认值'python'
。(Changed by Sean Reifschneider; issue 8451。)sys.version_info
值现在是一个命名的元组,其属性名为major
,minor
,micro
,releaselevel
和serial
。(由Ross Light提供; 第4285期。)sys.getwindowsversion()
also returns a named tuple, with attributes namedmajor
,minor
,build
,platform
,service_pack
,service_pack_major
,service_pack_minor
,suite_mask
, andproduct_type
. (由Brian Curtin提供; 问题7766。)tarfile
模块的默认错误处理已更改,不再抑制致命错误。默认错误级别以前为0,这意味着错误只会导致消息写入调试日志,但是因为默认情况下调试日志未激活,这些错误不会被注意到。默认错误级别现在是1,如果有错误引发异常。(更改者:LarsGustäbel; 问题7357。)tarfile
现在支持过滤添加到tar文件的TarInfo
对象。当您调用add()
时,您可以提供一个可选的过滤器参数,该参数是可调用的。过滤器 callable将为每个要添加的文件传递TarInfo
,并且可以修改并返回。如果可调用返回None
,则文件将从生成的归档中排除。这比现有的exclude参数更强大,因此已被弃用。(由LarsGustäbel添加; 问题6856。)TarFile
类现在也支持上下文管理协议。(由LarsGustäbel添加; 问题7232。)threading.Event
类的wait()
方法现在返回退出时的内部标志。这意味着该方法通常返回真,因为wait()
应该阻塞,直到内部标志变为true。如果提供超时并且操作超时,则返回值将仅为false。(由Tim Lesher提供; 问题1674032。)由
unicodedata
模块提供的Unicode数据库现在在内部用于确定哪些字符是数字,空格或表示换行符。数据库还包括来自Unihan.txt
数据文件(由AndersChrigström和Amaury Forgeot d'Arc修补; 问题1571184)的信息,并已更新到版本5.2.0 (由Florent Xicluna更新; 问题8024)。urlparse
模块的urlsplit()
现在以符合 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
模块还支持 RFC 2732定义的IPv6字面值地址(由Senthil Kumaran提供; issue 2987 )。>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
新类:
weakref
模块中的WeakSet
类是一个只保存对其元素的弱引用的集合;一旦没有指向它们的引用,元素将被删除。(最初由Raymond Hettinger在Python 3.x中实现,并由Michael Foord转换为2.7)。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; issue 2746。)由
xmlrpclib
和SimpleXMLRPCServer
模块提供的XML-RPC客户端和服务器通过支持HTTP / 1.1保持活动以及可选地使用gzip编码来压缩正在交换XML。gzip压缩由SimpleXMLRPCRequestHandler
的encode_threshold
属性控制,它包含以字节为单位的大小;大于此的响应将被压缩。(由KristjánValurJónsson提供; 问题6267。)The
zipfile
module’sZipFile
now supports the context management protocol, so you can writewith zipfile.ZipFile(...) as f:
. (由Brian Curtin提供; 问题5511。)zipfile
现在还支持归档空目录并正确提取它们。(由Kuba Wieczorek修订; 问题4710。)从档案中读取文件更快,交错read()
和readline()
现在可以正常工作。(由Nir Aides提供; 问题7610。)除了早期版本中接受的路径名,
is_zipfile()
函数现在接受一个文件对象。(Contributed by Gabriel Genellina; issue 4756。)writestr()
方法现在有一个可选的compress_type参数,可以覆盖ZipFile
构造函数中指定的默认压缩方法。(由Ronald Oussoren提供; 问题6003。)
New module: importlib¶
Python 3.1包括importlib
包,重新实现了Python的import
语句。importlib
对于Python解释器的实现者和希望编写可以参与导入过程的新导入程序的用户非常有用。Python 2.7不包含完整的importlib
包,而是包含一个包含单个函数import_module()
的小型子集。
import_module(name, package = None)
导入模块。name是一个包含模块或包名称的字符串。可以通过提供以.
字符,例如..utils.errors
。对于相对导入,必须提供包参数,它是将用作相对导入的锚点的包名称。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
由Brett Cannon实现并在Python 3.1中引入。
New module: sysconfig¶
sysconfig
模块已从Distutils包中拉出,成为一个新的顶级模块。sysconfig
提供了获取有关Python构建过程的信息的函数:编译器开关,安装路径,平台名称,以及Python是否从其源目录运行。
模块中的一些功能是:
get_config_var()
从Python的Makefile和pyconfig.h
文件返回变量。get_config_vars()
返回包含所有配置变量的字典。get_path()
返回特定类型模块的配置路径:标准库,站点特定模块,特定于平台的模块等。is_python_build()
如果您从Python源代码树运行二进制文件,则返回true,否则返回false。
有关更多详细信息和完整的函数列表,请参阅sysconfig
文档。
Distutils程序包和sysconfig
现在由TarekZiadé维护,TarekZiadé还启动了一个Distutils2程序包(源代码库位于https://hg.python.org/distutils2/)用于开发下一代版本的Distutils。
ttk: Themed Widgets for Tk¶
Tcl / Tk 8.5包括一组主题的小部件,它们重新实现基本的Tk小部件,但具有更加可定制的外观,因此可以更类似于本机平台的小部件。这个小部件集最初称为Tile,但在被添加到Tcl / Tck release 8.5时被重命名为Ttk(用于“主题Tk”)。
要了解详情,请阅读ttk
模块文档。您还可以阅读描述Ttk主题引擎的Tcl / Tk手册页,可从https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm获取。正在使用的Python / Ttk代码的屏幕截图位于http://code.google.com/p/python-ttk/wiki/Screenshots。
ttk
模块由Guilherme Polo编写,并在问题2983中添加。由Martin Franklin撰写并由Kevin Walzer维护的名为Tile.py
的替代版本被提议包含在问题2618中,但作者认为Guilherme Polo的工作更多全面。
Updated module: unittest¶
unittest
模块大大增强;添加了许多新功能。除非另有说明,大多数这些功能由Michael Foord实现。该模块的增强版本可以单独下载,以供使用Python版本2.4至2.6,打包为unittest2
包,从https://pypi.python.org/pypi/unittest2 。
当从命令行使用时,模块可以自动发现测试。它不像py.test或nose那样奇怪,但提供了一种简单的方法来运行一组包目录中保存的测试。例如,以下命令将在test/
子目录中搜索名为test*.py
的任何可导入测试文件:
python -m unittest discover -s test
有关详细信息,请参阅unittest
模块文档。(开发于问题6001。)
main()
函数支持一些其他新选项:
-b
或--buffer
将在每次测试期间缓冲标准输出和标准错误流。如果测试通过,任何结果输出将被丢弃;一旦发生故障,将显示缓冲输出。-c
或--catch
会使控制C中断被更加优雅地处理。不是立即中断测试过程,而是完成当前运行的测试,然后将报告直到中断的部分结果。如果你不耐烦,第二次按下控制C会立即中断。这个控制C处理程序尝试避免在被测试的代码或正在运行的测试已经定义了自己的信号处理程序时通过注意到信号处理程序已经被设置并调用它而导致问题。如果这不适合你,有一个
removeHandler()
装饰器,可用于标记应该禁用control-C处理的测试。-f
或--failfast
使测试在测试失败时立即停止,而不是继续执行进一步的测试。(Cliff Dyer建议并由Michael Foord执行; issue 8074。)
进度消息现在显示“x”表示预期故障,“u”表示在详细模式下运行时意外的成功。(供稿人:Benjamin Peterson。)
测试用例可以引发SkipTest
异常以跳过测试(问题1034053)。
assertEqual()
,assertTrue()
和assertFalse()
的错误消息现在提供了更多信息。如果将TestCase
类的longMessage
属性设置为True,则会打印标准错误消息和您提供的任何其他消息以查找失败。(由Michael Foord添加; 问题5663。)
assertRaises()
方法现在在调用时返回上下文处理程序,而不提供要运行的可调用对象。例如,你可以这样写:
with self.assertRaises(KeyError):
{}['foo']
(由Antoine Pitrou执行; 问题4444。)
现在支持模块和类级别的设置和拆卸灯具。模块可以包含setUpModule()
和tearDownModule()
函数。类可以有setUpClass()
和tearDownClass()
方法,必须定义为类方法(使用@classmethod
当测试运行器切换到不同模块或类中的测试用例时,调用这些函数和方法。
添加了方法addCleanup()
和doCleanups()
。addCleanup()
lets you add cleanup functions that will be called unconditionally (after setUp()
if setUp()
fails, otherwise after tearDown()
). 这允许在测试期间更简单的资源分配和解除分配(问题5679)。
添加了许多新方法,提供更专业的测试。许多这些方法都是由Google工程师编写的,用于他们的测试套件; Gregory P. Smith,Michael Foord和GvR合作将它们合并成Python的unittest
版本。
assertIsNone()
和assertIsNotNone()
使用一个表达式,并验证结果是否为None
。assertIs()
和assertIsNot()
取两个值,并检查两个值是否计算到同一个对象。(由Michael Foord添加; 问题2578。)assertIsInstance()
和assertNotIsInstance()
检查生成的对象是否是特定类的实例或类的元组之一。(由Georg Brandl添加; 问题7031。)assertGreater()
,assertGreaterEqual()
,assertLess()
和assertLessEqual()
assertMultiLineEqual()
比较两个字符串,如果它们不相等,则显示有用的比较,突出显示两个字符串之间的差异。当Unicode字符串与assertEqual()
进行比较时,默认情况下会使用此比较。assertRegexpMatches()
和assertNotRegexpMatches()
检查第一个参数是否匹配作为第二个参数提供的正则表达式(issue 8038 t4 >)。assertRaisesRegexp()
检查是否引发了特定异常,然后还检查异常的字符串表示是否与提供的正则表达式匹配。assertIn()
和assertNotIn()
测试第一是或不在秒。assertItemsEqual()
测试两个提供的序列是否包含相同的元素。assertSetEqual()
比较两个集合是否相等,并仅报告错误情况下集合之间的差异。- 类似地,
assertListEqual()
和assertTupleEqual()
比较指定的类型并解释任何差异而不必打印它们的完整值;这些方法现在在使用assertEqual()
比较列表和元组时默认使用。更一般地,assertSequenceEqual()
比较两个序列,并且可以可选地检查这两个序列是否是特定类型。 assertDictEqual()
比较两个字典并报告差异;它现在默认使用,当你使用assertEqual()
比较两个字典。assertDictContainsSubset()
检查第一中的所有键/值对是否在秒中找到。assertAlmostEqual()
和assertNotAlmostEqual()
测试第一和秒此方法可以将其差值舍入到可选指定数量的个位置(默认值为7),并将其与零比较,或要求差值小于提供的delta 值。loadTestsFromName()
正确地尊重TestLoader
的suiteClass
属性。(由Mark Roddy修正; 问题6866。)- 新的钩子允许您扩展
assertEqual()
方法来处理新的数据类型。addTypeEqualityFunc()
方法接受一个类型对象和一个函数。当被比较的两个对象都是指定类型时,将使用该函数。这个函数应该比较两个对象,如果它们不匹配,引发异常;对于函数来说,提供关于为什么两个对象不匹配的更多信息是一个好主意,就像新的序列比较方法一样。
unittest.main()
现在接受可选的exit
参数。如果为False,main()
不调用sys.exit()
,允许从交互式解释器使用main()
(由J.PabloFernández提供; 第3379期。)
TestResult
具有在测试运行之前和之后立即调用的新startTestRun()
和stopTestRun()
方法。(由Robert Collins提供; 第5728期。)
由于所有这些更改,unittest.py
变得非常大,因此模块被转换为一个包,代码分成几个文件(Benjamin Peterson)。这不会影响模块的导入或使用方式。
也可以看看
- http://www.voidspace.org.uk/python/articles/unittest2.shtml
- 描述新功能,如何使用它们,以及各种设计决策的理由。(Michael Foord。)
Updated module: ElementTree 1.3¶
Python中包含的ElementTree库的版本已更新到版本1.3。一些新功能是:
各种解析函数现在采用一个解析器关键字参数,提供将使用的
XMLParser
实例。这使得覆盖文件的内部编码成为可能:p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
现在解析XML中的错误引发了一个
ParseError
异常,其实例的position
属性包含(行,列 )tuple给出问题的位置。ElementTree的用于将树转换为字符串的代码已经被大大修改,使得它在大多数情况下大约是快两倍。
ElementTree.write()
和Element.write()
方法现在具有可以是“xml”(默认值)的方法 “html”或“文本”。HTML模式将输出空元素为<empty></empty>
而不是<empty/>
,文本模式将跳过元素,文本块。如果将元素的tag
属性设置为None
,但将其子元素保留在原位,则在树被写出时,元素将被省略,因此您不需要进行更广泛的重排以去除单个元件。命名空间处理也得到了改进。所有
xmlns:<whatever>
声明现在在根元素上输出,而不是散布在生成的XML中。您可以通过设置default_namespace
属性来为树设置默认命名空间,并且可以使用register_namespace()
注册新的前缀。在XML模式下,可以使用true / false xml_declaration参数来禁止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()
产生元素的子元素作为生成器。还可以在 t>> elem:中为 子 写儿童。
现在的方法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,没有孩子。这种行为很混乱 -None
是假的,但是没有子元素吗? - 因此它现在将触发FutureWarning
。在您的代码中,您应该是显式的:如果您感兴趣,请写入len(elem) != 0 或
elem 是 而不是 无
。
Fredrik Lundh开发ElementTree并生成1.3版本;您可以在http://effbot.org/zone/elementtree-13-intro.htm上阅读他的文章描述1.3。Florent Xicluna在python-dev和问题6472讨论后更新了Python的版本。)
Build and C API Changes¶
对Python的构建过程和C API的更改包括:
最新版本的GNU Debugger(GDB 7)可以使用Python脚本化。当您开始调试可执行程序P时,GDB将查找名为
P-gdb.py
的文件并自动读取该文件。Dave Malcolm贡献了一个python-gdb.py
,它在调试Python本身时增加了许多有用的命令。例如,py-up
和py-down
上下移动一个Python堆栈帧,通常对应于几个C堆栈帧。py-print
打印Python变量的值,py-bt
打印Python堆栈跟踪。(作为问题8032的结果添加。)如果使用Python提供的
.gdbinit
文件,2.7版本中的“pyo”宏现在可以正常工作,当被调试的线程不持有GIL;宏将在打印之前获取它。(由Victor Stinner撰写; 第3632期。)Py_AddPendingCall()
现在是线程安全的,让任何工作线程提交通知到主Python线程。这对异步IO操作特别有用。(由KristjánValurJónsson提供; issue 4293。)新函数:
PyCode_NewEmpty()
创建一个空的代码对象;只需要文件名,函数名和第一行号。这对于尝试构造更有用的跟踪堆栈的扩展模块很有用。以前这样的扩展需要调用PyCode_New()
,它有更多的参数。(由Jeffrey Yasskin补充。)新功能:
PyErr_NewExceptionWithDoc()
创建一个新的异常类,与现有的PyErr_NewException()
一样,但需要额外的char *
参数,包含新异常类的docstring。(由'lekma'添加在Python错误跟踪器上; 问题7033。)新函数:
PyFrame_GetLineNumber()
获取一个帧对象并返回帧当前正在执行的行号。以前的代码需要获取当前执行的字节码指令的索引,然后查找对应于该地址的行号。(由Jeffrey Yasskin补充。)新函数:
PyLong_AsLongAndOverflow()
和PyLong_AsLongLongAndOverflow()
将Python长整数近似为Clong
或t9> long
。如果数字太大,无法适应输出类型,则会设置溢出标志并返回给调用者。(由Case Van Horsen提供; 问题7528和问题7767。)新函数:源自字符串到float转换的重写,添加了一个新的
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
的文件)中放置一个特洛伊木马模块,您的应用程序然后导入并运行。If you maintain a C/C++ application that embeds Python, check whether you’re calling
PySys_SetArgv()
and carefully consider whether the application should be usingPySys_SetArgvEx()
with updatepath set to false.安全问题报告为CVE-2008-5983;在问题5753中讨论,并由Antoine Pitrou修复。
New macros: the Python header files now define the following macros:
Py_ISALNUM
,Py_ISALPHA
,Py_ISDIGIT
,Py_ISLOWER
,Py_ISSPACE
,Py_ISUPPER
,Py_ISXDIGIT
,Py_TOLOWER
, andPy_TOUPPER
. 所有这些函数都类似于C标准宏,用于分类字符,但忽略当前语言环境设置,因为在几个地方,Python需要以一种与语言环境无关的方式分析字符。(由Eric Smith添加; 问题5793。)删除的函数:
PyEval_CallObject
现在只能作为宏使用。一个函数版本被保留以保持ABI链接兼容性,但是在1997年;它现在肯定可以删除。(由Antoine Pitrou删除; 问题8276。)新格式代码:
PyFormat_FromString()
,PyFormat_FromStringV()
和PyErr_Format()
现在接受%lld
和%llu
格式代码,用于显示C的long long
类型。(由Mark Dickinson提供; 问题7228。)线程和进程分叉之间复杂的交互已经改变。以前,由
os.fork()
创建的子进程可能会失败,因为子进程只有一个线程运行,线程执行os.fork()
。如果其他线程持有锁,例如Python的导入锁,当执行fork时,锁在新进程中仍将被标记为“已保持”。但是在子进程中,没有什么会释放锁,因为其他线程没有被复制,子进程将不再能够执行导入。Python 2.7在执行
os.fork()
之前获取导入锁定,并且还将清除使用threading
模块创建的任何锁定。C扩展模块(具有内部锁定或调用fork()
)不会从此清除中受益。(由Thomas Wouters修正; 发行1590864。)
Py_Finalize()
函数现在调用内部threading._shutdown()
函数;这防止在解释器关闭时引发一些异常。(Patch by Adam Olsen; issue 1722344。)当使用
PyMemberDef
结构定义类型的属性时,Python不再允许您尝试删除或设置T_STRING_INPLACE
属性。新配置选项:
--with-system-expat
开关允许构建pyexpat
模块以使用系统Expat库。(由Arfrever Frehtes Taifersar Arahesis提供; 问题7609。)新配置选项:
--with-valgrind
选项现在将禁用pymalloc分配器,这对Valgrind内存错误检测器很难正确分析。因此Valgrind将更好地检测内存泄漏和超量。(供稿人:James Henstridge; issue 2422。)新配置选项:现在可以为
--with-dbmliborder=
提供空字符串,以禁用所有各种DBM模块。(由Arfrever Frehtes Taifersar Arahesis增补; 问题6491。)configure脚本现在检查某些32位Intel芯片上的浮点舍入错误,并定义
X87_DOUBLE_ROUNDING
预处理器定义。没有代码当前使用此定义,但如果任何人希望使用它,它是可用的。(由Mark Dickinson添加; 第2937期。)configure现在还设置了用于支持C ++链接的
LDCXXSHARED
Makefile变量。(供稿人:Arfrever Frehtes Taifersar Arahesis; issue 1222585。)构建过程现在为pkg-config支持创建必要的文件。(由Clinton Roy提供; issue 3585。)
构建过程现在支持Subversion 1.7。(供稿人:Arfrever Frehtes Taifersar Arahesis; issue 6094。)
Capsules¶
Python 3.1添加了一个新的C数据类型,PyCapsule
,用于向扩展模块提供C API。胶囊基本上是C void *
指针的持有者,并且作为模块属性可用;例如,socket
模块的API公开为socket.CAPI
和unicodedata
公开ucnhash_CAPI
。其他扩展可以导入模块,访问其字典以获取capsule对象,然后获取void *
指针,一个指向模块的各种API函数的指针数组。
有一个已经使用的现有数据类型,PyCObject
,但它不提供类型安全。以纯Python编写的邪恶代码可能通过从模块A获取PyCObject
并以某种方式将其替换为模块B中的PyCObject
而导致分段错误。胶囊知道自己的名字,并获得指针需要提供名称:
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。有关使用这些对象的详细信息,请参阅Providing a C API for an Extension Module。
Python 2.7现在在内部使用了胶囊来提供各种扩展模块API,但是PyCObject_AsVoidPtr()
被修改为处理胶囊,保留与CObject
接口的编译时兼容性。使用PyCObject_AsVoidPtr()
会发出一个PendingDeprecationWarning
信号,默认情况下是静默的。
在Python 3.1中实现,并由Larry Hastings反向运行到2.7;在问题5630中讨论。
Port-Specific Changes: Windows¶
msvcrt
模块现在包含来自crtassem.h
头文件中的一些常量:CRT_ASSEMBLY_VERSION
,VC_ASSEMBLY_PUBLICKEYTOKEN
和LIBRARIES_ASSEMBLY_NAME_PREFIX
。(由David Cournapeau提供; 问题4365。)- 用于访问注册表的
_winreg
模块现在实现了CreateKeyEx()
和DeleteKeyEx()
还测试了DisableReflectionKey()
,EnableReflectionKey()
和QueryReflectionKey()
(由Brian Curtin实施:问题7347。) - 新的
_beginthreadex()
API用于启动线程,本地线程本地存储功能现在使用。(供稿人:KristjánValurJónsson; issue 3582。) os.kill()
函数现在可以在Windows上运行。信号值可以是常量CTRL_C_EVENT
,CTRL_BREAK_EVENT
或任何整数。前两个常数将向子处理发送Control-C
和Control-Break
键击事件;任何其他值将使用TerminateProcess()
API。(由Miki Tebeka提供; issue 1220212。)- 对于空路径,
os.listdir()
函数现在正确失败。(由Hirokazu Yamamoto修订; 问题5913。) mimelib
模块将在初始化时从Windows注册表读取MIME数据库。(Patch by Gabriel Genellina; issue 4969。)
Other Changes and Fixes¶
- 将两个基准脚本
iobench
和ccbench
添加到Tools
目录中。iobench
测量在执行各种操作时由open()
返回的内建文件I / O对象的速度,ccbench
是并发基准当使用不同数量的线程执行几个任务时,它尝试测量计算吞吐量,线程切换延迟和IO处理带宽。 Tools/i18n/msgfmt.py
脚本现在可以理解.po
文件中的复数形式。(由Martin vonLöwis修订; 问题5464。)- 当从具有现有
.py
副本的.pyc
或.pyo
文件导入模块时,co_filename
属性的结果代码对象在原始文件名过时时被覆盖。如果文件已被重命名,移动或通过不同的路径访问,就会发生这种情况。(由Ziga Seilnacht和Jean-Paul Calderone修补; 问题1180193。) regrtest.py
脚本现在采用一个--randseed=
开关,它接受一个整数,该整数将用作-r
选项以随机顺序执行测试。-r
选项还会报告使用的种子(由Collin Winter添加)。- 另一个
regrtest.py
开关是-j
,它接受一个整数,指定并行运行多少个测试。这允许减少多核机器上的总运行时间。此选项与其他几个选项兼容,包括已知会产生长运行时间的-R
开关。(由Antoine Pitrou添加,问题6152。)这也可以与新的-F
开关一起使用,该开关在循环中运行选定的测试,直到它们失败。(由Antoine Pitrou添加; 问题7312。) - 当作为脚本执行时,
py_compile.py
模块现在接受'-'
作为参数,它将读取要编译的文件名列表的标准输入。(由PiotrOżarowski提供; 问题8233。)
Porting to Python 2.7¶
本节列出了之前描述的更改和其他可能需要更改代码的错误:
range()
函数更一致地处理其参数;它现在将调用__int__()
非浮动,非整数参数提供给它。(由Alexander Belopolsky修正; 问题1533。)- 字符串
format()
将浮点和复数的默认精度从6个小数位改为12,与str()
使用的精度相匹配。(由Eric Smith改变; 问题5920。) - 由于
with
语句的优化,特殊方法__enter__()
和__exit__()
必须属于对象的类型,直接附加到对象的实例。这会影响新式类(从object
派生)和C扩展类型。(问题6101。) - 由于Python 2.6中的错误,exc_value参数到
__exit__()
方法通常是异常的字符串表示,而不是实例。这是固定在2.7,因此exc_value将是一个实例如预期。(由Florent Xicluna修正; 问题7853。) - 当使用
__slots__
设置一组有限的属性时,删除unset属性不会像你所期望的那样引发AttributeError
。由本杰明·彼得森修正; issue 7604。)
在标准库中:
使用
datetime
实例的操作导致一年超出了支持范围,但并不总是引发OverflowError
。这样的错误现在更仔细地检查,现在将引发异常。(Mark Leander报告,Anand B. Pillai和Alexander Belopolsky补丁; 问题7150。)当使用具有字符串
format()
方法的Decimal
实例时,默认对齐方式为左对齐。这已更改为右对齐,这可能会更改程序的输出。(更改者:Mark Dickinson; 问题6857。)涉及信令NaN值(或
sNAN
)的比较现在发信号InvalidOperation
,而不是根据比较操作符号静默地返回真或假值。静态NaN值(或NaN
)现在是可哈希的。(由Mark Dickinson修正; 问题7279。)ElementTree库
xml.etree
在输出XML处理指令时不再转义&符号和尖括号(看起来像&lt;?xml-stylesheet href =“#style1”?& )或评论(看起来像&lt;! - comment - &gt;)。(Patch by Neil Muller; issue 2746。)StringIO
对象的readline()
方法现在在请求负长度时不执行任何操作,像其他类文件对象那样。(issue 7348)。syslog
模块现在将使用sys.argv[0]
的值作为标识符,而不是先前的默认值'python'
。(Changed by Sean Reifschneider; issue 8451。)tarfile
模块的默认错误处理已更改,不再抑制致命错误。默认错误级别以前为0,这意味着错误只会导致消息写入调试日志,但是因为默认情况下调试日志未激活,这些错误不会被注意到。默认错误级别现在是1,如果有错误引发异常。(更改者:LarsGustäbel; 问题7357。)urlparse
模块的urlsplit()
现在以符合 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 extensions that use integer format codes with the
PyArg_Parse*
family of functions will now raise aTypeError
exception instead of triggering aDeprecationWarning
(issue 5080). - 使用新的
PyOS_string_to_double()
函数,而不是旧的PyOS_ascii_strtod()
和PyOS_ascii_atof()
函数,
对于嵌入Python的应用程序:
- 添加了
PySys_SetArgvEx()
函数,使应用程序在使用现有的PySys_SetArgv()
函数时关闭安全漏洞。检查您是否正在调用PySys_SetArgv()
,并仔细考虑应用程序是否应使用PySys_SetArgvEx()
并将updatepath设置为false。
New Features Added to Python 2.7 Maintenance Releases¶
新的功能可能会添加到Python 2.7维护版本,当情况真的要求它。任何这样的添加必须通过Python增强提议过程,并为一个引人注目的情况,为什么他们不能被充分地处理通过添加新功能只是为Python 3,或者通过发布它在Python包索引。
除了下面列出的具体建议外,还有一个一般豁免,允许在任何Python 2.7维护版本中添加新的-3
警告。
PEP 434: IDLE Enhancement Exception for All Branches¶
PEP 434描述了对与Python一起提供的IDLE开发环境所做的更改的一般豁免。此豁免使IDLE开发人员可以在所有受支持的Python 2和3版本中提供更一致的用户体验。
有关任何IDLE更改的详细信息,请参阅特定版本的NEWS文件。
PEP 466: Network Security Enhancements for Python 2.7¶
PEP 466描述了许多网络安全增强提议,它们已被批准纳入Python 2.7维护版本,其中第一个出现在Python 2.7.7版本中。
在Python 2.7.7中添加的 PEP 466相关功能:
hmac.compare_digest()
从Python 3反向运行,以便对Python 2应用程序进行定时攻击比较操作。(由Alex Gaynor提供; 问题21306。)- OpenSSL 1.0.1g已在python.org上发布的官方Windows安装程序中升级。(由Zachary Ware提供; 问题21462。)
在Python 2.7.8中添加的 PEP 466相关功能:
hashlib.pbkdf2_hmac()
是从Python 3反向移植的,使得适用于Python 2应用程序可用的安全密码存储的散列算法。(由Alex Gaynor提供; 问题21304。)- OpenSSL 1.0.1h升级为在python.org上发布的官方Windows安装程序。(由Zachary Ware在问题21671中为CVE-2014-0224提供)
在Python 2.7.9中添加的 PEP 466相关功能:
- 大多数Python 3.4的
ssl
模块已反向运行。这意味着ssl
现在支持服务器名称指示,TLS1.x设置,访问平台证书存储,SSLContext
类和其他功能。(由Alex Gaynor和David Reid提供; 问题21308。) os.urandom()
已更改为将文件描述器缓存到/dev/urandom
,而不是在每次调用时重新打开/dev/urandom
。(由Alex Gaynor提供; 问题21305。)
Acknowledgements¶
作者感谢以下人员为本文的各种草案提供建议,更正和协助:Nick Coghlan,Philip Jenvey,Ryan Lovett,R. David Murray,Hugh Secker-Walker。