python 2.7的新功能

作者

A.M.Kuchling(加利福尼亚州AMK的AMK)

本文解释了Python2.7中的新特性。python 2.7于2010年7月3日发布。

数字处理在很多方面都得到了改进,包括浮点数字和 Decimal 类。对标准库有一些有用的添加,例如 unittest 模块 argparse 用于解析命令行选项的模块,方便 OrderedDict 和 Counter 中的类 collections 模块和许多其他改进。

python 2.7计划是2.x版本中的最后一个,因此我们致力于使它长期成为一个好的版本。为了帮助移植到python 3,2.7中包含了python 3.x系列的几个新特性。

本文并不试图提供新特性的完整规范,而是提供一个方便的概述。有关完整的详细信息,请参阅位于https://docs.python.org的python 2.7文档。如果您想了解设计和实现的基本原理,请参阅PEP以了解特定的新特性,或者在https://bugs.python.org上讨论更改的问题。只要有可能,“Python的新特性”就会链接到每次更改的bug/patch项。

python 2.x的未来

Python2.7是2.x系列中的最后一个主要版本,因为Python维护人员已经将新特性开发工作的重点转移到了Python3.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 2用户来说,有效地使用python包索引(直接使用或通过再分配程序使用)变得更加重要。除了用于各种任务的各种第三方软件包外,可用软件包还包括与python 2兼容的python 3标准库中新模块和功能的后端,以及各种工具和库,它们可以使迁移到python 3更加容易。这个 Python Packaging User Guide _提供有关从python包索引下载和安装软件的指导。

  • 虽然现在增强python 2的首选方法是在python包索引上发布新的包,但这种方法不一定在所有情况下都有效,尤其是与网络安全相关的情况下。在不能通过在pypi上发布新的或更新的包来充分处理的特殊情况下,可以使用python增强建议过程来说明如何直接向python 2标准库添加新功能。任何此类添加以及添加它们的维护版本都将在 添加到Python2.7维护版本中的新功能 下面部分。

对于希望从python 2迁移到python 3的项目,或者对于希望在python 2和python 3上支持用户的库和框架开发人员,可以使用各种工具和指南来帮助确定合适的方法并管理所涉及的一些技术细节。建议的起点是 将python 2代码移植到python 3 如何指导。

对DeprecationWarning处理的更改

对于Python2.7,策略决定默认情况下只对开发人员感兴趣的警告保持沉默。 DeprecationWarning 它的后代现在被忽略,除非另有要求,防止用户看到由应用程序触发的警告。在后来成为Python3.2的分支中也进行了这种更改。(讨论stdlib sig并在 bpo-7319 )

在以前的版本中, DeprecationWarning 消息在默认情况下是启用的,为Python开发人员提供了一个明确的指示,说明他们的代码在将来的主要版本的Python中可能会在哪里中断。

但是,越来越多的基于python的应用程序用户没有直接参与这些应用程序的开发。 DeprecationWarning 消息与此类用户无关,使他们担心实际工作正常的应用程序,并使应用程序开发人员负担对这些问题的响应。

您可以重新启用显示 DeprecationWarning 通过使用 -Wdefault (简称: -Wd )或通过设置 PYTHONWARNINGS 环境变量到 "default" (或) "d" )在运行python之前。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,3}} 是可变集)。

  • 字典和集合理解 ({{i: i*2 for i in range(3)}} )

  • 单个中有多个上下文管理器 with 语句。

  • 新版本的 io 库,用C重写以获得性能。

  • 中描述的有序字典类型 PEP 372:为收藏添加有序字典 .

  • 新的 "," 中描述的格式说明符 PEP 378:千位分隔符的格式说明符 .

  • 这个 memoryview 对象。

  • 一小部分 importlib 模块, described below _.

  • 这个 repr() 漂浮的 x 在许多情况下都更短:它现在基于最短的十进制字符串,保证返回到 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:为收藏添加有序字典

常规的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() 方法具有可选的 last 默认为的参数 True . 如果 last 如果为真,则返回并删除最近添加的密钥;如果为假,则选择最旧的密钥:

>>> 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 默认情况下,模块使用它们,这意味着现在可以读取、修改配置文件,然后按照原始顺序将其写回。

  • 这个 _asdict() 方法 collections.namedtuple() 现在返回一个有序字典,其值的显示顺序与基础元组索引的显示顺序相同。

  • 这个 json 模块的 JSONDecoder 类构造函数扩展为 object_pairs_hook 允许的参数 OrderedDict 由解码器生成的实例。还增加了对第三方工具的支持,如 PyYAML .

参见

PEP 372 -向集合中添加有序字典

由Armin Ronacher和Raymond Hettinger编写的PEP;由Raymond Hettinger实施。

PEP 378:千位分隔符的格式说明符

为了使程序输出更具可读性,可以将分隔符添加到大数字中,将其呈现为18446744073709551616而不是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 -千位分隔符的格式说明符

由Raymond Hettinger编写的PEP;由Eric Smith实施。

PEP 389:用于分析命令行的argparse模块

这个 argparse 用于分析命令行参数的模块被添加为更强大的 optparse 模块。

这意味着python现在支持三个不同的模块来解析命令行参数: getopt , optparse 和 argparse . 这个 getopt 模块与C库非常相似 getopt() 函数,所以如果编写的是一个最终将在C语言中重写的Python原型,那么它仍然很有用。 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个或多个旁路 '+' 或可选参数 '?' . 顶级解析器可以包含子解析器来定义具有不同开关集的子命令,如 svn commit , svn checkout 等。您可以将参数的类型指定为 FileType ,它将自动为您打开文件并了解 '-' 表示标准输入或输出。

参见

argparse 文档

argparse模块的文档页。

升级optparse代码

python文档的一部分,描述如何转换使用 optparse .

PEP 389 -argparse-新的命令行分析模块

PEP由Steven Bethard编写并实施。

PEP 391:基于字典的日志配置

这个 logging 模块非常灵活;应用程序可以定义一个日志子系统树,树中的每个日志记录器可以过滤掉某些消息,以不同的格式对它们进行格式化,并将消息定向到不同数量的处理程序。

所有这些灵活性都需要大量的配置。您可以编写python语句来创建对象并设置它们的属性,但复杂的设置需要冗长但乏味的代码。 logging 也支持 fileConfig() 函数解析一个文件,但文件格式不支持配置过滤器,而且以编程方式生成更麻烦。

python 2.7添加了 dictConfig() 使用字典配置日志记录的函数。有许多方法可以从不同的来源生成字典:用代码构造字典;解析包含JSON的文件;或者如果安装了Yaml解析库,则使用它。有关详细信息,请参阅 配置功能 .

下面的示例配置两个记录器,根记录器和名为“network”的记录器。发送到根记录器的消息将使用系统日志协议发送到系统日志,发送到“网络”记录器的消息将写入 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进行系统日志记录。构造函数有一个 SOCKT型 提供要使用的套接字类型的参数,或者 socket.SOCK_DGRAM 对于UDP或 socket.SOCK_STREAM 对于TCP。默认协议仍为UDP。

  • Logger 实例获得了 getChild() 方法,该方法使用相对路径检索子代记录器。例如,一旦通过执行 log = getLogger('app') 呼唤 log.getChild('network.listen') 等于 getLogger('app.network.listen') .

  • 这个 LoggerAdapter 类获 isEnabledFor() 采用的方法 level 并返回底层记录器是否会处理该级别的重要消息。

参见

PEP 391 -基于字典的日志配置

PEP由Vinay Sajip编写和实施。

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 3106 -正在修改dict.keys()、.values()和.items()。

吉多·范·罗森写的PEP。Alexandre Vassalotti倒转至2.7; bpo-1967 .

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')
>>>

参见

PEP 3137 -不可变字节和可变缓冲区

吉多·范·罗森写的PEP。由Travis Oliphant、Antoine Pitrou等实施。由Antoine Pitrou反端口至2.7; bpo-2396 .

其他语言更改

对核心python语言所做的一些较小的更改是:

  • set literals的语法已从python 3.x中进行了反向移植。使用大括号来包围生成的可变集的内容;set literals不包含冒号和值,因此与字典不同。 {{}} 继续表示空字典;使用 set() 对于空的集合。

    >>> {1, 2, 3, 4, 5}
    set([1, 2, 3, 4, 5])
    >>> set() # empty set
    set([])
    >>> {}    # empty dict
    {}
    

    亚历山大瓦萨洛蒂(Alexandre Vassalotti)的支持; 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'])
    

    亚历山大瓦萨洛蒂(Alexandre Vassalotti)的支持; 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中提出;由Georg Brandl实施。)

  • 在大多数平台上,浮点数和字符串之间的转换现在都被正确舍入。这些转换发生在许多不同的地方: str() 浮点数和复数;浮点数 float 和 complex 构造函数;数字格式;使用 marshal , pickle 和 json 模块;解析python代码中的浮点和虚字;以及 Decimal -浮动转换。

    与此相关的是, repr() 浮点数的 x 现在返回一个基于最短十进制字符串的结果,该字符串保证返回到 x 在正确的四舍五入模式下。之前它给出了一个基于舍入x到17位十进制数字的字符串。

    负责此改进的舍入库使用gcc、icc或suncc编译器在Windows和Unix平台上工作。可能有少数平台无法保证正确操作此代码,因此此代码不用于此类系统。您可以通过检查找出正在使用的代码 sys.float_repr_style ,这将是 short 如果新代码正在使用,并且 legacy 如果不是的话。

    由Eric Smith和Mark Dickinson使用David Gay的 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
    

    ( 由Mark Dickinson实施; bpo-3166 )

    整数除法的舍入行为也更精确。(也由Mark Dickinson实施; bpo-1811 )

  • 已删除对复数的隐式强制;解释器将不再尝试调用 __coerce__() 复杂对象的方法。(由Meador Inge和Mark Dickinson删除; 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
    

    ( 由Fredrik Johansson和Victor Stinner提供; bpo-3439 )

  • 这个 import 如果相对导入(例如 from .os import sep )失败。这修复了一个bug,但可能会破坏某些 import 只是偶然产生作用的声明。(由Meador Inge固定; bpo-7902 )

  • 它现在可以作为内置子类 unicode 键入以重写 __unicode__() 方法。(由Victor Stinner实施; bpo-1583863 )

  • 这个 bytearray 类型 translate() 方法现在接受 None 作为第一个参数。(由乔治布兰德尔修正; bpo-4759 )

  • 使用时 @classmethod 和 @staticmethod 为了将方法封装为类或静态方法,封装对象现在将封装函数作为它们的 __func__ 属性。(由Amaury Forgot d'Arc在乔治·萨基斯的建议下提供; bpo-5982 )

  • 当使用 __slots__ ,删除未设置的属性不会引发 AttributeError 如你所料。由本杰明·彼得森修正; bpo-7604 )

  • 现在支持两种新编码:“cp720”(主要用于阿拉伯语文本)和“cp858”(cp 850的变体,添加了欧元符号)。(CP720由Alexander Belchenko和Amaury Forgot d'Arc于 bpo-1616979 ;CP858由Tim Hatch在 bpo-8016 )

  • 这个 file 对象现在将设置 filename 属性 IOError 尝试在posix平台上打开目录时出现异常(jan kaliszewski指出; bpo-4764 ,现在显式检查并禁止写入只读文件对象,而不是信任C库来捕获并报告错误(由Stefan Krah修复; bpo-5677 )

  • python标记器现在自己转换行尾,因此 compile() 内置函数现在接受使用任何行尾约定的代码。此外,它不再要求代码以换行符结尾。

  • 函数定义中的额外括号在python 3.x中是非法的,这意味着您从 def f((x)): pass . 在python3警告模式下,python 2.7现在将警告这种奇怪的用法。(由詹姆斯·林加德指出; bpo-7362 )

  • 现在可以创建对旧样式类对象的弱引用。新的样式类总是弱可引用的。(由Antoine Pitrou固定; bpo-8268 )

  • 当模块对象被垃圾收集时,模块的字典现在只有在没有其他人持有对字典的引用时才被清除。 (bpo-7140 )

解释程序更改

一个新的环境变量, PYTHONWARNINGS ,允许控制警告。它应该设置为包含警告设置的字符串,相当于 -W 开关,用逗号分隔。(由布赖恩·科廷提供; bpo-7301 )

例如,以下设置将在每次出现警告时打印警告,但将警告从 Cookie 模块出错。(设置环境变量的确切语法因操作系统和shell而异。)

export PYTHONWARNINGS=all,error:::Cookie:0

优化

增加了几个性能增强:

  • 添加了新的操作码以执行 with 语句,查找 __enter__() 和 __exit__() 方法。(本杰明·彼得森供稿)

  • 垃圾收集器现在对一个常见的使用模式执行得更好:当分配了许多对象而没有释放其中的任何对象时。这以前需要二次时间进行垃圾收集,但现在随着堆上对象数的增加,完全垃圾收集的数量会减少。新逻辑仅在中间一代被收集10次以及中间一代的幸存者对象数量超过最老一代对象数量的10%时执行完整的垃圾收集过程。(由Martin von L_wis提出,由Antoine Pitrou实施; bpo-4074 )

  • 垃圾收集器试图避免跟踪不属于循环的简单容器。在Python2.7中,对于包含原子类型(如int、strings等)的元组和dict,现在是这样。可传递的是,包含原子类型元组的dict也不会被跟踪。这有助于通过减少收集器要考虑和遍历的对象的数量来降低每个垃圾收集的成本。(安托万·皮特鲁提供; bpo-4688 )

  • 长整数现在存储在基2中的内部 15或2进制 30,基础在构建时确定。以前,它们总是存储在基2中 15。使用基2 30在64位机器上提供了显著的性能改进,但是32位机器上的基准测试结果是混合的。因此,默认值是使用基2 30 on 64-bit machines and base 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 )

    另一组更改使long对象小了几个字节:32位系统小了2个字节,64位系统小了6个字节。(马克·狄金森撰稿; bpo-5260 )

  • 长整数的除法通过收紧内环、进行移位而不是乘法以及修复不必要的额外迭代而变得更快。各种基准显示,对于长整型除法和模运算,加速率在50%到150%之间。(马克·狄金森撰稿; bpo-5512 位操作也明显更快(由Gregory Smith进行初始修补; bpo-1087418 )

  • 实施 % 检查左边的操作数是否是python字符串以及它的特殊情况;对于经常使用的应用程序,这会导致性能提高1-3%。 % 使用字符串,例如模板化库。(由科林·温特实施; bpo-5176 )

  • 用一个 if 条件被编译成更快的字节码。(安托万·皮特鲁的补丁,杰弗里·亚斯金的背面移植到2.7; bpo-4715 )

  • 使用特殊的大小写基数10,而不是使用支持任意基数的通用转换函数,可以更快地将整数或长整数转换为十进制字符串。(盖文·博尔顿补片; bpo-6713 )

  • 这个 split() , replace() , rindex() , rpartition() 和 rsplit() 类字符串类型的方法(字符串、Unicode字符串和 bytearray 对象)现在使用快速反向搜索算法而不是逐字符扫描。有时速度会快10倍。(由佛罗伦萨·西克拉纳补充; bpo-7462 和 bpo-7622 )

  • 这个 pickle 和 cPickle 模块现在可以自动对用于属性名的字符串进行内部连接,从而减少因取消拾取而导致的对象的内存使用。(由Jake McGuire提供; bpo-5084 )

  • 这个 cPickle 模块现在特殊情况字典,几乎一半的时间需要泡菜他们。(由科林·温特提供; bpo-5670 )

新模块和改进模块

与每个版本一样,Python的标准库也收到了一些增强和错误修复。下面是最显著变化的部分列表,按模块名称的字母顺序排列。查阅 Misc/NEWS 在源代码树中查找更完整的更改列表,或者查看子版本日志以获取所有详细信息。

  • 这个 bdb 模块的基本调试类 Bdb 获得了一个跳过模块的特性。构造函数现在接受一个包含全局样式模式的iterable,例如 django.* ;调试器不会从与这些模式之一匹配的模块单步进入堆栈帧。(由Maru Newby在Senthil Kumaran的建议后提供; bpo-5142 )

  • 这个 binascii 模块现在支持缓冲区API,因此它可以与 memoryview 实例和其他类似的缓冲区对象。(由佛罗伦萨·西克拉纳从3.x反向导出; bpo-7703 )

  • 更新的模块: bsddb 模块已从4.7.2版本9更新到4.8.4版本 the pybsddb package ②新版本具有更好的python 3.x兼容性,各种错误修复,并添加了几个新的BerkeleyDB标志和方法。(由jes_s cea avi_n更新; bpo-8156 . pybsddb changelog可以在http://hg.jcea.es/pybsddb/file/tip/changelog中读取。)

  • 这个 bz2 模块的 BZ2File 现在支持上下文管理协议,因此您可以编写 with bz2.BZ2File(...) as 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
    

    Raymond Hettinger的贡献; bpo-1696199 .

    新类: OrderedDict 如前一节所述 PEP 372:为收藏添加有序字典 .

    新方法: deque 数据类型现在有一个 count() 返回与提供的参数相等的包含元素数的方法 x 和A reverse() 方法,将deque元素就地反转。 deque 同时将其最大长度显示为只读 maxlen 属性。(两个功能均由Raymond Hettinger添加。)

    这个 namedtuple 现在类有一个可选的 重命名 参数。如果 重命名 为true,因为重复或不合法而无效的字段名将重命名为从字段在字段列表中的位置派生的合法名称:

    >>> from collections import namedtuple
    >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True)
    >>> T._fields
    ('field1', '_1', '_2', 'field2')
    

    ( 由Raymond Hettinger添加; bpo-1818 )

    最后, Mapping 抽象基类现在返回 NotImplemented 如果将映射与另一个不是 Mapping . (丹尼尔·斯图茨巴赫修订; bpo-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出资; bpo-7005 )

  • 不推荐使用的函数: contextlib.nested() ,它允许使用单个上下文管理器处理多个上下文管理器 with 语句已被弃用,因为 with 语句现在支持多个上下文管理器。

  • 这个 cookielib 模块现在忽略具有无效版本字段(不包含整数值)的cookie。(由John J.Lee修订; bpo-3924 )

  • 这个 copy 模块的 deepcopy() 函数现在将正确复制绑定的实例方法。(由罗伯特·柯林斯执行; bpo-1515 )

  • 这个 ctypes 模块现在总是转换 None to a C NULL pointer for arguments declared as pointers. (Changed by Thomas Heller; bpo-4606.) The underlying libffi library 已更新到3.0.9版,包含针对不同平台的各种修复。(由Matthias Klose更新; bpo-8142 )

  • 新方法: datetime 模块的 timedelta 获得一班 total_seconds() 方法,返回持续时间中的秒数。(由布莱恩·昆兰提供; bpo-5788 )

  • 新方法: Decimal 获得一班 from_float() 类方法,该方法将浮点数精确转换为 Decimal . 这种精确的转换力求最接近浮点表示值的十进制近似值;因此,生成的十进制值仍将包括不精确性(如果有)。例如, Decimal.from_float(0.1) 返回 Decimal('0.1000000000000000055511151231257827021181583404541015625') . (由Raymond Hettinger实施; bpo-4796 )

    正在比较的实例 Decimal 对于浮点数,现在可以根据操作数的数值生成合理的结果。以前,这样的比较可以追溯到Python用于比较对象的默认规则,该规则根据对象的类型生成任意结果。请注意,您仍然无法组合 Decimal 以及其他操作(如加法)中的浮点,因为您应该明确选择如何在浮点和 Decimal . (由Mark Dickinson确定; bpo-2531 )

    的构造函数 Decimal 现在接受浮点数(由Raymond Hettinger添加; bpo-8257 )以及非欧洲Unicode字符,如阿拉伯-印度数字(由Mark Dickinson提供); bpo-6595 )

    大多数的方法 Context 类现在也接受整数 Decimal 实例;唯一例外是 canonical() 和 is_canonical() 方法。(Juan Jos_Conti的补丁; bpo-7633 )

    使用时 Decimal 具有字符串的实例 format() 方法,默认对齐方式以前是左对齐。这已更改为右对齐,这对数字类型更为敏感。(由马克·狄金森更改; bpo-6857 )

    涉及信号NaN值的比较(或 sNAN 现在信号 InvalidOperation 而不是根据比较运算符静默返回真或假值。安静的NaN值(或 NaN )现在可以hash了。(由Mark Dickinson确定; bpo-7279 )

  • 这个 difflib module now produces output that is more compatible with modern diff/patch 工具通过一个小的更改,使用制表符而不是空格作为标题中的分隔符,给出文件名。(由Anatoly Techtonik修复; bpo-7585 )

  • ditudil sdist 命令现在总是重新生成 MANIFEST 文件,因为即使 MANIFEST.in 或 setup.py 文件尚未修改,用户可能创建了一些应包含的新文件。(由Tarek Ziad_固定; bpo-8688 )

  • 这个 doctest 模块的 IGNORE_EXCEPTION_DETAIL 标志现在将忽略包含正在测试的异常的模块的名称。(Lennart Regebro补片; bpo-7490 )

  • 这个 email 模块的 Message 类现在将接受一个Unicode值的有效负载,自动将有效负载转换为 output_charset . (由R.David Murray添加; bpo-1368247 )

  • 这个 Fraction 类现在接受单个浮点或 Decimal 实例或两个有理数,作为其构造函数的参数。(由Mark Dickinson实施;在 bpo-5812 ,浮点/十进制 bpo-8294 )

    排序比较 (< , <= , > , >= )分数和复数之间现在提高 TypeError .这解决了一个疏忽,使 Fraction 匹配其他数字类型。

  • 新类: FTP_TLS 在 ftplib 模块使用认证的TLS封装以及随后的控制和数据传输提供安全的FTP连接。(由Giampaolo Rodola出资; bpo-2054 )

    这个 storbinary() 由于添加了 rest 参数(pablo mouzo补丁; bpo-6845 )

  • 新类修饰器: total_ordering() 在 functools 模块接受定义 __eq__() 方法和 __lt__() , __le__() , __gt__() 或 __ge__() ,并生成缺少的比较方法。自从 __cmp__() 方法在python 3.x中已被弃用,该修饰符使定义有序类变得更容易。(由Raymond Hettinger添加; bpo-5479 )

    新功能: cmp_to_key() 将采用旧样式的比较函数,该函数需要两个参数,并返回可作为 key 函数的参数,例如 sorted() , min() 和 max() 等。主要用途是帮助使代码与python 3.x兼容(由raymond hettinger添加)。

  • 新功能: gc 模块的 is_tracked() 如果垃圾收集器跟踪给定实例,则返回true,否则返回false。(安托万·皮特鲁提供; bpo-4688 )

  • 这个 gzip 模块的 GzipFile 现在支持上下文管理协议,因此您可以编写 with gzip.GzipFile(...) as f: (由Hagen F_rstenau出资; bpo-3860 ,现在它实现了 io.BufferedIOBase ABC,所以你可以用 io.BufferedReader 加快处理速度(由NIR助手提供; bpo-7471 )现在还可以通过向构造函数提供可选的时间戳来覆盖gzip文件中记录的修改时间。(Jacques Frechet提供; bpo-4272 )

    gzip格式的文件可以用尾随的零字节填充; gzip 模块现在将使用这些尾随字节。(由Tadek Pietraszek和Brian Curtin修复; bpo-2846 )

  • 新属性: hashlib 模块现在有一个 algorithms 包含用于命名所支持算法的元组的属性。在Python 2.7中, hashlib.algorithms 包含 ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') . (卡尔·切内特提供; bpo-7418 )

  • 默认值 HTTPResponse 类 httplib 模块现在支持缓冲,从而更快地读取HTTP响应。(由Kristj_n Valur J_nsson提供; bpo-4879 )

    这个 HTTPConnection 和 HTTPSConnection 类现在支持 source_address 参数,A (host, port) 2元组,给出将用于连接的源地址。(Eldon Ziegler提供; bpo-3972 )

  • 这个 ihooks 模块现在支持相对导入。注意 ihooks 是用于自定义导入的旧模块,由 imputil 在python 2.0中添加了模块。(Neil Schemenauer添加了相对导入支持。)

  • 这个 imaplib 模块现在支持IPv6地址。(由Derek Morr提供; 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,I/O库是完全用C重写的,速度是执行任务的2到20倍。原来的python版本被重命名为 _pyio 模块。

    一个微小的变化: io.TextIOBase 类现在有一个 errors 提供用于编码和解码错误的错误设置的属性(其中一个 'strict' , 'replace' , 'ignore' )

    这个 io.FileIO 现在,类引发一个 OSError 传递的文件描述符无效。(由本杰明·彼得森执行; bpo-4991 )的 truncate() 方法现在保留文件位置;以前它会将文件位置更改为新文件的结尾。(由Pascal Chambon固定; bpo-6939 )

  • 新功能: itertools.compress(data, selectors) 取两个迭代器。要素 data 如果中的对应值 selectors 是真的:

    itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
      A, C, E, F
    

    新功能: itertools.combinations_with_replacement(iter, r) 返回所有可能的 r -ITerable元素的长度组合 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() 现在还允许使用关键字参数,并使用非整数值,如float或 Decimal 实例。(由Raymond Hettinger实施; bpo-5032 )

    itertools.combinations() 和 itertools.product() 以前提出的 ValueError 对于价值 r 大于可输入。这被认为是一个规范错误,所以现在它们返回一个空的迭代器。(由Raymond Hettinger固定; bpo-4816 )

  • 更新的模块: json 模块升级到simplejson包的2.0.9版本,其中包含一个C扩展,使编码和解码更快。(由Bob Ipolito出资; bpo-4136 )

    支持新的 collections.OrderedDict 类型, json.load() 现在有一个可选的 object_pairs_hook 将使用解码为对列表的任何对象文本调用的参数。(由Raymond Hettinger提供; bpo-5381 )

  • 这个 mailbox 模块的 Maildir 类现在将时间戳记录在它所读取的目录上,并且仅当修改时间随后发生更改时才重新读取它们。这通过避免不必要的目录扫描提高了性能。(由A.M.Kuchling和Antoine Pitrou修复; bpo-1607951 , bpo-6896 )

  • 新功能: math 模块获得 erf() 和 erfc() 对于误差函数和互补误差函数, expm1() 它计算 e**x - 1 比使用更精确 exp() 减去1, gamma() 对于gamma函数,以及 lgamma() 伽马函数的自然对数。(由马克·狄金森和尼丽娜·拉斯利亚里森撰稿; bpo-3366 )

  • 这个 multiprocessing 模块的 Manager* 现在可以向类传递一个可调用的,每当启动子进程时都将调用该可调用的类,以及一组将传递给可调用的参数。(由勒克马出资; bpo-5585 )

    这个 Pool 类,它控制一个工作进程池,现在有一个可选的 子级最大任务数 参数。工作进程将执行指定数量的任务,然后退出,导致 Pool 开始一个新工人。如果任务可能泄漏内存或其他资源,或者某些任务将导致工作人员变得非常大,则此功能非常有用。(由查尔斯·卡扎本提供; bpo-6963 )

  • 这个 nntplib 模块现在支持IPv6地址。(由Derek Morr提供; bpo-1664 )

  • 新功能: os 模块封装以下POSIX系统调用: getresgid() 和 getresuid() 返回真实、有效、保存了gids和uids; setresgid() 和 setresuid() 设置真实、有效并将gid和uid保存为新值; initgroups() 初始化当前进程的组访问列表。(travis h提供的gid/uid功能; bpo-6508 . 支持Jean-Paul Calderone添加的initgroups; bpo-7333 )

    这个 os.fork() 函数现在重新初始化子进程中的导入锁;这可以在以下情况下修复Solaris上的问题: fork() 从线程调用。(由zsolt cserna固定; bpo-7242 )

  • 在 os.path 模块 normpath() 和 abspath() 函数现在保留unicode;如果它们的输入路径是unicode字符串,则返回值也是unicode字符串。 (normpath() 由Matt Giuca在 bpo-5827 ; abspath() 由Ezio Melotti在 bpo-3426 )

  • 这个 pydoc 模块现在对Python使用的各种符号提供了帮助。你现在可以做 help('<<') 或 help('@') 例如。(大卫·拉班供稿) bpo-4739 )

  • 这个 re 模块的 split() , sub() 和 subn() 现在接受一个可选的 flags 参数,以便与模块中的其他函数保持一致。(由Gregory P.Smith添加)

  • 新功能: run_path() 在 runpy 模块将在提供的 path 参数。 path 可以是python源文件的路径 (example.py )编译的字节码文件 (example.pyc )目录 (./package/ )或压缩文件 (example.zip )如果提供了目录或zip路径,则会将其添加到 sys.path 模块 __main__ 将被导入。目录或zip应该包含 __main__.py 如果没有,其他的 __main__.py 可能稍后从某个位置导入 sys.path . 这使得更多的机器 runpy 对于希望模仿Python命令行处理显式路径名方式的脚本可用。(由Nick Coghlan添加; bpo-6816 )

  • 新功能:在 shutil 模块, make_archive() 获取文件名、存档类型(zip或tar格式)和目录路径,并创建包含目录内容的存档。(由Tarek Ziad_添加。)

    shutil 的 copyfile() 和 copytree() 功能现在引发 SpecialFileError 当要求复制命名管道时出现异常。以前,代码通过打开命名管道进行读取,将其视为常规文件,这将无限期地阻塞。(由Antoine Pitrou固定; bpo-3002 )

  • 这个 signal 模块不再重新安装信号处理程序,除非这是真正必要的,这修复了一个错误,可能使它无法可靠地捕获EINTR信号。(由查尔斯·弗朗索瓦·纳塔利修订; bpo-8354 )

  • 新功能:在 site 模块,三个新函数返回不同的站点和用户特定的路径。 getsitepackages() 返回包含所有全局站点包目录的列表, getusersitepackages() 返回用户的站点包目录的路径,以及 getuserbase() 返回的值 USER_BASE 环境变量,为可用于存储数据的目录提供路径。(由Tarek Ziad_出资; bpo-6693 )

    这个 site 模块现在报告在 sitecustomize 模块已导入,将不再捕获和吞咽 KeyboardInterrupt 例外。(由维克多·斯廷纳确定; bpo-3137 )

  • 这个 create_connection() 函数获得了 source_address 参数,A (host, port) 2元组,给出将用于连接的源地址。(Eldon Ziegler提供; bpo-3972 )

    这个 recv_into() 和 recvfrom_into() 方法现在将写入支持缓冲区API的对象中,最有用的是 bytearray 和 memoryview 物体。(由Antoine Pitrou实施; bpo-8104 )

  • 这个 SocketServer 模块的 TCPServer 类现在支持套接字超时和禁用Nagle算法。这个 disable_nagle_algorithm 类属性默认为 False ;如果重写为true,则新的请求连接将设置tcp_nodelay选项,以防止将许多小的发送缓冲到单个tcp包中。这个 timeout class属性可以保持应用于请求套接字的超时(以秒为单位);如果在该时间内没有收到请求, handle_timeout() 将被调用和 handle_request() 将返回。(由Kristj_n Valur J_nsson提供; bpo-6192 和 bpo-6267 )

  • 更新的模块: sqlite3 模块已更新为 pysqlite package ②版本2.6.0包含了许多错误修复,并添加了从共享库加载sqlite扩展的能力。调用给 enable_load_extension(True) 方法来启用扩展,然后调用 load_extension() 加载特定的共享库。(由Gerhard H_ring更新)

  • 这个 ssl 模块的 SSLSocket 对象现在支持缓冲区API,它修复了一个测试套件失败(由AntoinePitrou修复; bpo-7133 )并自动设置openssl SSL_MODE_AUTO_RETRY ,这将阻止从返回错误代码 recv() 触发SSL重新协商的操作(由Antoine Pitrou修复; bpo-8222 )

    这个 ssl.wrap_socket() 构造函数函数现在接受 密码 参数,它是一个字符串,列出了允许的加密算法;描述了字符串的格式 in the OpenSSL documentation ②(由Antoine Pitrou添加; bpo-8322 )

    另一个更改使扩展加载OpenSSL的所有密码和摘要算法,以便它们都可用。无法验证某些SSL证书,报告“未知算法”错误。(由Beda Kosata报告,由Antoine Pitrou修复; bpo-8484 )

    正在使用的OpenSSL版本现在可用作模块属性 ssl.OPENSSL_VERSION (字符串) ssl.OPENSSL_VERSION_INFO (5元组),以及 ssl.OPENSSL_VERSION_NUMBER (整数)(由Antoine Pitrou添加; 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' . (由Sean Reifschneider更改; 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() ,您可以提供一个可选的 滤波器 这是一个可调用的参数。这个 滤波器 Callable将通过 TarInfo 对于要添加的每个文件,可以修改并返回它。如果可调用项返回 None ,文件将从生成的存档中排除。这比现有的更强大 排除 参数,因此已被弃用。(由拉尔斯·古斯特·贝尔添加; bpo-6856 ) TarFile 类现在还支持上下文管理协议。(由拉尔斯·古斯特·贝尔添加; bpo-7232 )

  • 这个 wait() 方法 threading.Event 类现在返回退出时的内部标志。这意味着该方法通常返回true,因为 wait() 应该阻塞,直到内部标志变为真。只有在提供超时且操作超时时,返回值才会为假。(蒂姆·莱舍提供; bpo-1674032 )

  • 由提供的Unicode数据库 unicodedata 模块现在在内部用于确定哪些字符是数字、空格或表示换行符。数据库还包括来自 Unihan.txt 数据文件(Anders Chrigstr_m和Amaury Forgot d'Arc的补丁; bpo-1571184 )并更新至5.2.0版(由佛罗伦萨·西克拉纳更新; 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 模块是一个集合,只保存对其元素的弱引用;一旦没有指向它们的引用,元素将被删除。(最初由RaymondHettinger在python 3.x中实现,后由MichaelFoord移植到2.7。)

  • 元素树库, xml.etree ,在输出XML处理指令(看起来像 <?xml-stylesheet href="#style1"?> )或评论(看起来 <!-- comment --> )(Neil Muller的补丁; bpo-2746 )

  • XML-RPC客户端和服务器,由 xmlrpclib 和 SimpleXMLRPCServer 模块通过支持HTTP/1.1保持活动和可选地使用gzip编码压缩正在交换的XML来提高性能。gzip压缩由 encode_threshold 属性 SimpleXMLRPCRequestHandler ,其中包含以字节为单位的大小;大于此值的响应将被压缩。(由Kristj_n Valur J_nsson提供; bpo-6267 )

  • 这个 zipfile 模块的 ZipFile 现在支持上下文管理协议,因此您可以编写 with zipfile.ZipFile(...) as f: .(由布赖恩·科廷提供; bpo-5511 )

    zipfile 现在还支持归档空目录并正确地提取它们。(由Kuba Wieczorek固定; bpo-4710 .)从存档中读取文件速度更快,而且交错 read() 和 readline() 现在工作正常。(由NIR助手提供; bpo-7610 )

    这个 is_zipfile() 函数现在除了接受早期版本中接受的路径名之外,还接受一个文件对象。(由加布里埃尔·吉内利纳提供; bpo-4756 )

    这个 writestr() 方法现在有一个可选的 compress_type 参数,用于重写在 ZipFile 构造函数。(由罗纳德·奥索伦提供; bpo-6003 )

新模块: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中引入。

新模块: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 现在由Tarek Ziad_维护,他还启动了distuils2包(源库位于https://hg.python.org/distuils2/)来开发下一代distuils。

TTK:tk的主题小工具

Tcl/Tk8.5包括一组主题化的小部件,这些小部件重新实现基本的Tk小部件,但具有更可自定义的外观,因此可以更接近于本机平台的小部件。这个小部件集最初被称为Tile,但在添加到TCL/TCK 8.5版时被重命名为TTK(用于“主题tk”)。

要了解更多信息,请阅读 ttk 模块文档。您也可以阅读描述ttk主题引擎的tcl/tk手册页,网址为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 模块由Guilherme Polo编写并添加到 bpo-2983 . 称为 Tile.py 由Martin Franklin撰写,Kevin Walzer维护,建议加入 bpo-2618 但作者认为,盖尔马波罗的作品更为全面。

更新模块:UnitTest

这个 unittest 模块得到了极大的增强,增加了许多新功能。除非另有说明,这些特性中的大多数都是由Michael Foord实现的。模块的增强版本可单独下载,以与Python版本2.4到2.6一起使用,打包为 unittest2 包,来自https://pypi.org/project/unittest2。

当从命令行使用时,模块可以自动发现测试。它不像 py.test 或 nose _但提供了一种简单的方法来运行保存在一组包目录中的测试。例如,以下命令将搜索 test/ 名为的任何可导入测试文件的子目录 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']

( 由Antoine Pitrou实施; bpo-4444 )

现在支持模块级和类级设置和拆卸设备。模块可以包含 setUpModule() 和 tearDownModule() 功能。类可以有 setUpClass() 和 tearDownClass() 必须定义为类方法的方法(使用 @classmethod 或同等产品)。当测试运行程序切换到不同模块或类中的测试用例时,调用这些函数和方法。

方法 addCleanup() 和 doCleanups() 加入。 addCleanup() 允许添加将无条件调用的清理函数(在 setUp() 如果 setUp() 失败,否则在 tearDown() )这允许在测试期间更简单地分配和释放资源。 (bpo-5679 )

增加了一些新的方法来提供更专业的测试。其中许多方法都是由谷歌工程师编写的,用于测试套件中;Gregory P.Smith、Michael Foord和GVR致力于将它们合并到Python版本的 unittest .

  • assertIsNone() 和 assertIsNotNone() 使用一个表达式并验证结果是否为 None .

  • assertIs() 和 assertIsNot() 取两个值,检查两个值的计算结果是否相同。(由迈克尔·福德补充; bpo-2578 )

  • assertIsInstance() 和 assertNotIsInstance() 检查结果对象是特定类的实例,还是类的元组的实例。(由Georg Brandl添加; bpo-7031 )

  • assertGreater() , assertGreaterEqual() , assertLess() 和 assertLessEqual() 比较两个量。

  • assertMultiLineEqual() 比较两个字符串,如果它们不相等,则显示一个有用的比较,突出显示两个字符串之间的差异。当将Unicode字符串与 assertEqual() .

  • assertRegexpMatches() 和 assertNotRegexpMatches() 检查第一个参数是否是与作为第二个参数提供的正则表达式匹配的字符串 (bpo-8038 )

  • assertRaisesRegexp() 检查是否引发特定异常,然后检查异常的字符串表示形式是否与提供的正则表达式匹配。

  • assertIn() 和 assertNotIn() 测试是否 第一 是还是不在 第二 .

  • assertItemsEqual() 测试提供的两个序列是否包含相同的元素。

  • assertSetEqual() 比较两个集合是否相等,只有在出现错误时才报告集合之间的差异。

  • 同样地, assertListEqual() 和 assertTupleEqual() 比较指定的类型并解释任何差异,而不必打印它们的完整值;当比较列表和元组时,默认情况下使用这些方法 assertEqual() . 更一般地说, assertSequenceEqual() 比较两个序列,可以选择检查两个序列是否属于特定类型。

  • assertDictEqual() 比较两个词典并报告差异;当您使用 assertEqual() . assertDictContainsSubset() 检查中的所有键/值对 第一 发现于 第二 .

  • assertAlmostEqual() 和 assertNotAlmostEqual() 测试是否 第一 和 第二 近似相等。此方法可以将其差异四舍五入到可选的指定数目 地方 (默认值为7)并将其与零进行比较,或者要求差异小于提供的 三角洲 价值。

  • loadTestsFromName() 适当地尊重 suiteClass 的属性 TestLoader . (由Mark Roddy固定; bpo-6866 )

  • 一个新的钩子可以让你把 assertEqual() 方法来处理新的数据类型。这个 addTypeEqualityFunc() 方法接受类型对象和函数。当要比较的两个对象都是指定类型时,将使用该函数。该函数应该比较两个对象,如果它们不匹配,则会引发异常;与新的序列比较方法一样,该函数最好提供有关两个对象不匹配的原因的其他信息。

unittest.main() 现在选择一个选项 exit 参数。如果错误, main() 不叫 sys.exit() 允许 main() 从交互式解释器中使用。(由J.Pablo Fern_ndez提供; bpo-3379 )

TestResult 有新的 startTestRun() 和 stopTestRun() 在测试运行之前和之后立即调用的方法。(由罗伯特·柯林斯提供; bpo-5728 )

所有这些变化, unittest.py 由于模块变得非常大,所以模块被转换成一个包,代码被分割成几个文件(由本杰明·彼得森编写)。这不会影响模块的导入或使用方式。

参见

http://www.voidspace.org.uk/python/articles/unittest2.shtml

描述新特性、如何使用它们以及各种设计决策的基本原理。(迈克尔·福德)

更新模块:elementtree 1.3

python中包含的elementtree库的版本更新为1.3版。一些新功能包括:

  • 现在,各种分析函数 语法分析器 关键字参数给出 XMLParser 将使用的实例。这使得可以重写文件的内部编码:

    p = ET.XMLParser(encoding='utf-8')
    t = ET.XML("""<root/>""", parser=p)
    

    分析XML时出错,现在引发 ParseError 异常,其实例具有 position 包含一个( line , 柱 )给出问题位置的元组。

  • 用于将树转换为字符串的elementtree代码已被显著修改,在许多情况下速度大约是原来的两倍。这个 ElementTree.write() 和 Element.write() 方法现在有一个 方法 可以是“xml”(默认)、“html”或“text”的参数。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() 生成元素的子元素作为生成器。也可以写 for child in 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;如果没有子元素,则返回false。这种行为令人困惑-- None 是错误的,但是没有子项的元素也是错误的?--所以它现在会触发一个 FutureWarning . 在您的代码中,您应该是明确的:编写 len(elem) != 0 如果你对子项的数量感兴趣,或者 elem is not None .

Fredrik Lundh开发了elementtree并制作了1.3版本;您可以在http://effbot.org/zone/elementtree-13-intro.htm上阅读他描述1.3的文章。在讨论了python dev和 bpo-6472 )

构建和C API更改

对python构建过程和C API的更改包括:

  • GNU调试器的最新版本gdb 7可以 scripted using 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提供的文件,2.7版本中的“pyo”宏现在可以在被调试的线程不持有gil时正常工作;宏现在在打印前获取它。(由维克多·斯廷纳出资; bpo-3632 )

  • Py_AddPendingCall() 现在是线程安全的,允许任何工作线程向主python线程提交通知。这对于异步IO操作特别有用。(由Kristj_n Valur J_nsson提供; bpo-4293 )

  • 新功能: PyCode_NewEmpty() 创建一个空的代码对象;只需要文件名、函数名和第一个行号。这对于试图构造更有用的回溯堆栈的扩展模块很有用。以前,这种扩展需要调用 PyCode_New() 有更多的参数。(由Jeffrey Yasskin添加。)

  • 新功能: PyErr_NewExceptionWithDoc() 创建一个新的异常类,就像现有的 PyErr_NewException() 是的,但需要额外的 char * 包含新异常类的DocString的参数。(由python bug tracker上的“lekma”添加; bpo-7033 )

  • 新功能: PyFrame_GetLineNumber() 获取帧对象并返回帧当前执行的行号。以前的代码需要获取当前执行的字节码指令的索引,然后查找与该地址对应的行号。(由Jeffrey Yasskin添加。)

  • 新功能: PyLong_AsLongAndOverflow() 和 PyLong_AsLongLongAndOverflow() 将python长整数近似为C long 或 long long .如果数字太大,无法放入输出类型,则 溢流 标志已设置并返回给调用方。(由案例范霍森提供; bpo-7528 和 bpo-7767 )

  • 新函数:源于将字符串重写为浮点转换,这是一个新的 PyOS_string_to_double() 已添加函数。老年人 PyOS_ascii_strtod() 和 PyOS_ascii_atof() 现在不推荐使用函数。

  • 新功能: PySys_SetArgvEx() 设置的值 sys.argv 并且可以选择更新 sys.path 包含包含脚本的目录 sys.argv[0] 取决于 更新数据表 参数。

    添加此函数是为了关闭嵌入Python的应用程序的安全漏洞。旧功能, PySys_SetArgv() ,将始终更新 sys.path ,有时会添加当前目录。这意味着,如果您在其他人控制的目录中运行嵌入python的应用程序,攻击者可以将特洛伊木马模块放入该目录(例如,名为 os.py )然后应用程序将导入并运行。

    如果您维护嵌入Python的C/C++应用程序,请检查您是否正在调用 PySys_SetArgv() 并仔细考虑应用程序是否应该使用 PySys_SetArgvEx() 具有 更新数据表 设置为假。

    安全问题报告为 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 )

  • 新格式代码: PyFormat_FromString() , PyFormat_FromStringV() 和 PyErr_Format() 功能现在接受 %lld 和 %llu 显示C的格式代码 long long 类型。(马克·狄金森撰稿; bpo-7228 )

  • 线程和进程复刻之间复杂的交互作用已经改变。以前,子进程由 os.fork() 可能会失败,因为创建子线程时只运行一个线程,而执行 os.fork() . 如果其他线程在执行fork时持有一个锁,例如python的import锁,那么在新进程中该锁仍将标记为“hold”。但是在子进程中,没有任何东西可以释放锁,因为其他线程没有被复制,子进程将无法再执行导入。

    python 2.7在执行 os.fork() ,还将清除使用 threading 模块。具有内部锁或调用 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 预处理器定义。目前没有代码使用这个定义,但是如果有人想使用它,它是可用的。(由Mark Dickinson添加; bpo-2937 )

    configure 现在还设置一个 LDCXXSHARED 用于支持C++链接的MaFaFILE变量。(Arfrever frehtes taifersar arahesis提供; bpo-1222585 )

  • 构建过程现在为pkg配置支持创建必要的文件。(由克林顿·罗伊提供; bpo-3585 )

  • 构建过程现在支持Subversion 1.7。(Arfrever frehtes taifersar arahesis提供; bpo-6094 )

Capsules

python 3.1添加了一个新的C数据类型, PyCapsule ,用于向扩展模块提供C API。Capsules本质上是C的载体。 void * 指针,并作为模块属性提供;例如, socket 模块的API公开为 socket.CAPI 和 unicodedata 暴露 ucnhash_CAPI . 其他扩展可以导入模块,访问其字典以获取Capsules对象,然后获取 void * 指针,通常指向指向模块的各种API函数的指针数组。

已有一个数据类型已用于此, PyCObject 但它不提供类型安全性。用纯python编写的邪恶代码可能通过 PyCObject 从模块A中,以某种方式将其替换为 PyCObject 在模块B中,Capsules知道自己的名称,获取指针需要提供名称:

void *vtable;

if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
        PyErr_SetString(PyExc_ValueError, "argument type invalid");
        return NULL;
}

vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");

你确信 vtable 指向你所期望的。如果另一个Capsules被送进, PyCapsule_IsValid() 将检测不匹配的名称并返回false。参照 为扩展模块提供C API 有关使用这些对象的详细信息。

python 2.7现在在内部使用Capsules来提供各种扩展模块API,但是 PyCObject_AsVoidPtr() 修改为处理Capsules,保留编译时与 CObject 接口。使用 PyCObject_AsVoidPtr() 将信号A PendingDeprecationWarning ,默认为静默。

在python 3.1中实现,并由Larry Hastings返回到2.7;在中讨论 bpo-5630 .

端口特定更改:Windows

  • 这个 msvcrt 模块现在包含来自 crtassem.h 头文件: CRT_ASSEMBLY_VERSION , VC_ASSEMBLY_PUBLICKEYTOKEN 和 LIBRARIES_ASSEMBLY_NAME_PREFIX . (大卫·库纳波供稿; bpo-4365 )

  • 这个 _winreg 用于访问注册表的模块现在实现 CreateKeyEx() 和 DeleteKeyEx() 函数,以前支持的接受多个额外参数的函数的扩展版本。这个 DisableReflectionKey() , EnableReflectionKey() 和 QueryReflectionKey() 也进行了测试和记录。(由Brian Curtin实施: bpo-7347 )

  • 新的 _beginthreadex() API用于启动线程,现在使用本机线程本地存储函数。(由Kristj_n Valur J_nsson提供; bpo-3582 )

  • 这个 os.kill() 函数现在在Windows上工作。信号值可以是常量 CTRL_C_EVENT , CTRL_BREAK_EVENT 或任何整数。前两个常量将发送 Control-C 和 Control-Break 子进程的击键事件;任何其他值都将使用 TerminateProcess() 应用程序编程接口。(由Miki Tebeka出资; bpo-1220212 )

  • 这个 os.listdir() 对于空路径,函数现在正确失败。(由山本广子固定; bpo-5913 )

  • 这个 mimelib 模块现在将在初始化时从Windows注册表读取mime数据库。(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 ,Apple提供的系统python 2.7使用的站点包目录不再附加到 sys.path 对于用户安装的python,如python.org安装程序。从MacOS 10.12开始,Apple更改了系统站点包目录的配置方式,这可能导致PIP组件(如安装工具)的安装失败。为系统python安装的包将不再与用户安装的pythons共享。 (bpo-28440 )

特定于端口的更改:freebsd

  • Freebsd 7.1的 SO_SETFIB constant, used with getsockopt()/setsockopt() 要选择备用路由表,现在可以在 socket 模块。(由Kyle Vanderbeek添加; bpo-8235 )

其他更改和修复

  • 两个基准脚本, iobench 和 ccbench ,已添加到 Tools 目录。 iobench 测量由返回的内置文件I/O对象的速度 open() 执行各种操作时,以及 ccbench 是一个并发基准,尝试在使用不同数量的线程执行多个任务时测量计算吞吐量、线程切换延迟和IO处理带宽。

  • 这个 Tools/i18n/msgfmt.py 脚本现在可以理解复数形式 .po 文件夹。(由Martin von L_wis固定; bpo-5464 )

  • 从中导入模块时 .pyc 或 .pyo 现有文件 .py 对应物 co_filename 当原始文件名过时时,结果代码对象的属性将被覆盖。如果文件已被重命名、移动或通过不同路径访问,则可能发生这种情况。(由Ziga Seilnacht和Jean-Paul Calderone补片; bpo-1180193 )

  • 这个 regrtest.py 脚本现在需要 --randseed= 将使用整数作为 -r 以随机顺序执行测试的选项。这个 -r 选项还报告使用的种子(由Collin Winter添加)。

  • 另一 regrtest.py 开关是 -j ,它接受一个整数,指定并行运行的测试数。这允许减少多核机器上的总运行时间。此选项与其他几个选项兼容,包括 -R 已知会产生长运行时间的开关。(由Antoine Pitrou添加, bpo-6152 .)这也可用于新的 -F 在循环中运行选定测试直至失败的开关。(由Antoine Pitrou添加; bpo-7312 )

  • 当作为脚本执行时, py_compile.py 模块现在接受 '-' 作为参数,它将读取要编译的文件名列表的标准输入。(由Piotr O_Arowski提供; bpo-8233 )

移植到python 2.7

本节列出了前面描述的可能需要更改代码的更改和其他错误修复:

  • 这个 range() 函数处理参数时更加一致;现在它将调用 __int__() 在提供给它的非浮点、非整数参数上。(由亚历山大·伯罗波尔斯基修订; bpo-1533 )

  • 弦 format() 方法将浮点数和复数的默认精度从小数点后6位更改为12位,这与 str() .(由埃里克·史密斯更改; bpo-5920 )

  • 因为优化了 with 声明,特殊方法 __enter__() 和 __exit__() 必须属于对象的类型,并且不能直接附加到对象的实例。这会影响新样式类(派生自 object )和C扩展类型。 (bpo-6101 )

  • 由于python 2.6中的一个bug, exc_value 参数到 __exit__() 方法通常是异常的字符串表示,而不是实例。这是在2.7中修正的,所以 exc_value 将是预期的实例。(由佛罗伦萨·西克拉纳修订; bpo-7853 )

  • 当使用 __slots__ ,删除未设置的属性不会引发 AttributeError 如你所料。由本杰明·彼得森修正; bpo-7604 )

在标准库中:

  • 操作与 datetime 导致一年超出支持范围的实例并不总是增加 OverflowError . 这些错误现在被更仔细地检查,现在将引发异常。(由Mark Leander报道,Anand B.Pillai和Alexander Belopolsky报道; bpo-7150 )

  • 使用时 Decimal 具有字符串的实例 format() 方法,默认对齐方式以前是左对齐。这已更改为正确的对齐方式,这可能会更改程序的输出。(由马克·狄金森更改; bpo-6857 )

    涉及信号NaN值的比较(或 sNAN 现在信号 InvalidOperation 而不是根据比较运算符静默返回真或假值。安静的NaN值(或 NaN )现在可以hash了。(由Mark Dickinson确定; bpo-7279 )

  • 元素树库, xml.etree ,在输出XML处理指令(看起来像 <?xml-stylesheet href="#style1"?> )或评论(看起来 <!-- comment --> )(Neil Muller的补丁; bpo-2746 )

  • 这个 readline() 方法 StringIO 当请求负长度时,对象现在不执行任何操作,就像其他文件(如对象)一样。 (bpo-7348 )

  • 这个 syslog 模块现在将使用 sys.argv[0] 作为标识符而不是以前的默认值 'python' . (由Sean Reifschneider更改; 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扩展:

对于嵌入python的应用程序:

添加到Python2.7维护版本中的新功能

当情况真正需要时,可以在python 2.7维护版本中添加新功能。任何这样的添加都必须经过python增强建议过程,并通过将新功能单独添加到python 3,或者通过在python包索引上发布来说明为什么不能充分解决这些问题。

除了下面列出的具体建议外,还有一个普遍的豁免,允许新的 -3 在任何Python2.7维护版本中都要添加警告。

调试模式的两个新环境变量

在调试模式下, [xxx refs] 默认情况下不写入统计信息, PYTHONSHOWREFCOUNT 现在还必须设置环境变量。(由维克多·斯廷纳出资; bpo-31733 )

当用编译python时 COUNT_ALLOC 已定义,分配计数不再默认转储: PYTHONSHOWALLOCCOUNT 现在还必须设置环境变量。此外,分配计数现在被转储到stderr,而不是stdout。(由维克多·斯廷纳出资; bpo-31692 )

2.7.15 新版功能.

PEP 434:所有分支的空闲增强异常

PEP 434 描述对随python一起提供的空闲开发环境所做的更改的一般免除。这种免除使空闲开发人员能够在所有支持的Python2和3版本中提供更一致的用户体验。

有关任何空闲更改的详细信息,请参阅特定版本的新闻文件。

PEP 466:python 2.7的网络安全增强

PEP 466 描述了许多已被批准包含在Python2.7维护版本中的网络安全增强建议,其中第一个更改出现在Python2.7.7版本中。

PEP 466 python 2.7.7中添加的相关功能:

  • hmac.compare_digest() 从python 3中进行了反向移植,以使python 2应用程序可以使用一个抗时间攻击的比较操作。(由Alex Gaynor出资; bpo-21306 )

  • openssl 1.0.1g在python.org上发布的官方Windows安装程序中进行了升级。(由Zachary Ware出资; bpo-21462 )

PEP 466 python 2.7.8中添加的相关功能:

  • hashlib.pbkdf2_hmac() 从python 3中进行了反向移植,以使hash算法适用于安全密码存储,广泛应用于python 2应用程序。(由Alex Gaynor出资; bpo-21304 )

  • openssl 1.0.1h是为在python.org上发布的官方Windows安装程序升级的。(由Zachary Ware在 bpo-21671 用于CVE-2014-0224)

PEP 466 python 2.7.9中添加的相关功能:

  • 大部分python 3.4 ssl 模块被反端口。这意味着 ssl 现在支持服务器名称指示、tls1.x设置、对平台证书存储的访问、以及 SSLContext 类和其他功能。(由Alex Gaynor和David Reid提供; bpo-21308 )

    有关详细信息,请参阅模块文档中的“版本添加:2.7.9”注释。

  • os.urandom() 已更改为将文件描述符缓存到 /dev/urandom 而不是重新打开 /dev/urandom 每次通话。(由Alex Gaynor出资; bpo-21305 )

  • hashlib.algorithms_guaranteed 和 hashlib.algorithms_available 从python 3返回,以便python 2应用程序更容易选择最强大的可用hash算法。(由Alex Gaynor在 bpo-21307 )

PEP 477:backport ensurepip(PEP 453)到python 2.7

PEP 477 批准包含 PEP 453 Ensurepip模块和它在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包及其依赖项。

为Cpthon source builds on POSIX systems , the make install 和 make altinstall 命令不引导 pip 默认情况下。可以通过配置选项控制此行为,并通过makefile选项覆盖此行为。

在Windows和Mac OS X上,cpython安装程序现在默认为安装 pip 以及cpython本身(用户可以在安装过程中选择不安装它)。窗口用户需要选择自动 PATH 修改 pip 默认情况下从命令行中可用,否则仍可以通过用于Windows的python启动程序访问 py -m pip .

AS discussed in the PEP , 在默认情况下,平台打包程序可以选择不安装这些命令,只要当调用时,它们提供关于如何在该平台上安装这些命令的清晰和简单的指导(通常使用系统包管理器)。

文件变更

作为这一变化的一部分, 安装python模块 和 分发python模块 文档的各个部分已完全重新设计为简短的入门和常见问题文档。大多数打包文档现在已经被转移到维护的python打包机构 Python Packaging User Guide 以及各个项目的文档。

但是,由于此迁移目前仍不完整,因此这些指南的旧版本仍然可用 安装python模块(旧版) 和 分发python模块(旧版本) .

参见

PEP 453 --python安装中PIP的显式引导

由Donald Stufft和Nick Coghlan撰写的PEP,由Donald Stufft、Nick Coghlan、Martin von L_wis和Ned Deily实施。

PEP 476:默认情况下为stdlib http客户端启用证书验证

PEP 476 更新 httplib 以及使用它的模块,例如 urllib2 和 xmlrpclib ,现在验证服务器是否提供了一个证书,该证书由平台信任存储中的证书颁发机构签名,并且其主机名与默认情况下请求的主机名匹配,从而显著提高了许多应用程序的安全性。这个更改是在Python2.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:Python2.7的HTTPS验证迁移工具

PEP 493 提供额外的迁移工具,以支持包含应用程序和服务的环境的增量基础结构升级过程,这些环境在建立客户端HTTPS连接时依赖于历史上允许的服务器证书处理。这些添加是在Python2.7.12版本中完成的。

这些工具旨在在受影响的应用程序和服务无法修改为在建立连接时显式传递更宽松的SSL上下文的情况下使用。

对于根本无法修改的应用程序和服务, PYTHONHTTPSVERIFY 环境变量可以设置为 0 将整个python进程恢复为python 2.7.8及更早版本的默认许可行为。

对于无法修改连接建立代码但整个应用程序可以修改的情况,新的 ssl._https_verify_certificates() 函数可用于在运行时调整默认行为。

新的 make regen-all 建立目标

为了简化交叉编译,并确保在不需要现有的python版本可用的情况下可靠地编译cpython,基于autotools的构建系统不再尝试根据文件修改时间隐式地重新编译生成的文件。

相反,一个新的 make regen-all 已添加命令以在需要时强制重新生成这些文件(例如,在基于预生成版本构建了Python的初始版本之后)。

还定义了更多选择性再生目标-参见 Makefile.pre.in 有关详细信息。

( 由Victor Stinner在 bpo-23404 )

2.7.14 新版功能.

移除 make touch 建立目标

这个 make touch 以前用于通过更新所生成文件的修改时间请求隐式重新生成的生成目标已被删除。

它已被新的 make regen-all 目标。

( 由Victor Stinner在 bpo-23404 )

在 2.7.14 版更改.

确认

作者要感谢以下人员对本文的各种草稿提供建议、更正和帮助:Nick Coghlan、Philip Jenvey、Ryan Lovett、R.David Murray、Hugh Secker Walker。