Python 3.1 有什么新�化¶
- 作者:
Raymond Hettinger(译者:wh2099 at outlook dot com)
本文介�了 Python 3.1 相比 3.0 的新特性。 Python 3.1 �布于 2009 年 6 月 27 日。
PEP 372: 有åº�å—典¶
常规的 Python å—典会以任æ„�顺åº�è¿ä»£é”®/值对。 多年以æ�¥ï¼Œæœ‰å¥½å‡ ä½�作者编写了å�¯ä»¥è®°ä½�键的åˆ�å§‹æ�’入顺åº�的替代实现。 基于这些实现的ç»�验,现在引入了新的 collections.OrderedDict 类。
OrderedDict API 与常规å—典基本相å�Œï¼Œä½†å°†æ ¹æ�®æ¯�个键首次æ�’入的时间以有ä¿�è¯�的顺åº�æ�¥è¿ä»£é”®å’Œå€¼ã€‚ 如果一个新æ�¡ç›®è¦†ç›–了现有的æ�¡ç›®ï¼Œåˆ™åŽŸå§‹æ�’å…¥ä½�置会ä¿�æŒ�ä¸�å�˜ã€‚ åˆ é™¤æ�¡ç›®å¹¶é‡�æ–°æ�’入则会将其移至末尾。
æ ‡å‡†åº“çŽ°åœ¨æ”¯æŒ�在æŸ�些模å�—ä¸ä½¿ç”¨æœ‰åº�å—典。 configparser 模å�—会默认使用它们。 这使得é…�置文件将以其原始顺åº�被读å�–ã€�修改和é‡�新写入。 collections.namedtuple() çš„ _asdict() 方法现在会返回一个值的出现顺åº�与下层的元组索引å�·ç›¸å�Œçš„æœ‰åº�å—典。 json 模å�—已使用 object_pairs_hook æ�¥æž„建以å…�许由解ç �器生æˆ�有åº�å—典。 è¿˜æ·»åŠ äº†å¯¹ç¬¬ä¸‰æ–¹å·¥å…·çš„æ”¯æŒ�如 PyYAML。
��
- PEP 372 - 有åº�å—å…¸
PEP 由 Armin Ronacher 和 Raymond Hettinger 撰写,由 Raymond Hettinger 实现。
å› ä¸ºä¸€ä¸ªæœ‰åº�å—典记ä½�它的顺åº�,他å�¯ä»¥ç”¨äºŽè¿žæŽ¥æŽ’åº�å—å…¸
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
当æ�¡ç›®åˆ 除时,新的排åº�å—典会维护它的顺åº�。但如果有新的æ�¡ç›®æ·»åŠ è¿›æ�¥ï¼Œé”®å°±è¢«åŠ å…¥åˆ°æœ«ç«¯ï¼Œé¡ºåº�å°±ä¸�å†�维护。
PEP 378: å�ƒä½�åˆ†éš”ç¬¦çš„æ ¼å¼�说明符¶
内置的 format() 函数和 str.format() æ–¹æ³•ä½¿ç”¨çš„è¿·ä½ è¯è¨€çŽ°åœ¨åŒ…æ‹¬ä¸€ç§�以å�ƒä½�åˆ†éš”ç¬¦æ ¼å¼�化数å—的简å�•ã€�ä¸�å�¯æ„ŸçŸ¥è¯è¨€åŒºåŸŸçš„æ–¹å¼�。 è¿™æ��供了更为人性化的程åº�输出,æ��å�‡äº†å¤–观专业程度与å�¯è¯»æ€§:
>>> format(1234567, ',d')
'1,234,567'
>>> format(1234567.89, ',.2f')
'1,234,567.89'
>>> format(12345.6 + 8901234.12j, ',f')
'12,345.600000+8,901,234.120000j'
>>> format(Decimal('1234567.89'), ',f')
'1,234,567.89'
支�的类型有 int, float, complex 和 decimal.Decimal。
ç›®å‰�还在讨论è¦�如何指定替代分隔符如点å�·ã€�ç©ºæ ¼ã€�æ’‡å�·æˆ–下划线ç‰ã€‚ å�¯æ„ŸçŸ¥è¯è¨€åŒºåŸŸçš„应用程åº�应当使用现有的支æŒ�å�ƒä½�分隔符的 n æ ¼å¼�说明符。
��
- PEP 378 - å�ƒä½�åˆ†éš”ç¬¦çš„æ ¼å¼�说明符
PEP 由 Raymond Hettinger 撰写,并由 Eric Smith 和 Mark Dickinson 实现
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
对Python è¯è¨€æ ¸å¿ƒè¿›è¡Œçš„å°�改动:
包括
__main__.py文件的目录和 zip 归档文件现在å�¯é€šè¿‡å°†å…¶å��ç§°ä¼ ç»™è§£é‡Šå™¨æ�¥ç›´æŽ¥æ‰§è¡Œã€‚ è¿™æ ·çš„ç›®å½•/zip 文件会自动作为 sys.path 的第一个æ�¡ç›®æ�’入。 (由 Andy Chu æ��议并编写åˆ�å§‹è¡¥ä¸�;由 Phillip J. Eby å’Œ Nick Coghlan 改进补ä¸�ï¼›bpo-1739468。)int()ç±»åž‹å¢žåŠ äº†ä¸€ä¸ªbit_length方法用æ�¥è¿”回以二进制代表其å�‚数值所需的比特ä½�æ•°é‡�:>>> n = 37 >>> bin(37) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(由 Fredrik Johansson, Victor Stinner, Raymond Hettinger å’Œ Mark Dickinson 在 bpo-3439 ä¸è´¡çŒ®ã€‚)
format()å—符串ä¸çš„å—æ®µçŽ°åœ¨å�¯è¢«è‡ªåŠ¨ç¼–å�·:>>> 'Sir {} of {}'.format('Gallahad', 'Camelot') 'Sir Gallahad of Camelot'
之å‰�,å—符串应当具有所需的编å�·å—段例如:
'Sir {0} of {1}'。(由 Eric Smith在 bpo-5237 ä¸è´¡çŒ®ï¼‰
string.maketrans()函数已被弃用并由新的é�™æ€�方法bytes.maketrans()å’Œbytearray.maketrans()所å�–代。 这项更改解决了对于string模å�—所支æŒ�的类型的困惑。 现在,str,byteså’Œbytearray分别拥有它们自己的具有适当类型的ä¸é—´è½¬è¯‘表的 maketrans å’Œ translate 方法。(由Georg Brandl在 bpo-5675 ä¸è´¡çŒ®ï¼‰
The syntax of the
withè¯å�¥çš„è¯æ³•现在å…�许å�•个è¯å�¥ä¸å˜åœ¨å¤šä¸ªä¸Šä¸‹æ–‡ç®¡ç�†å™¨:>>> with open('mylog.txt') as infile, open('a.out', 'w') as outfile: ... for line in infile: ... if '<critical>' in line: ... outfile.write(line)
æœ‰äº†è¿™ä¸ªæ–°è¯æ³•,
contextlib.nested()函数已ä¸�å†�å¿…è¦�å› è€ŒçŽ°åœ¨å·²è¢«å¼ƒç”¨ã€‚ï¼ˆç”± Georg Brandl å’Œ Mattias Brändström 贡献; appspot issue 53094。)
现在
round(x, n)当 x 为整数时将返回整数。 之�是返回浮点数:>>> round(1123, -2) 1100
(由 Mark Dickinson在 bpo-4707 贡献)
Python 现在使用 David Gay 的算法æ�¥æŸ¥æ‰¾ä¸�会改å�˜å®žé™…å€¼çš„æœ€çŸæµ®ç‚¹è¡¨ç¤ºå½¢å¼�。 这应当有助于缓解æŸ�些对于二进制浮点数的困惑。
这项改进的优点对于
1.1è¿™æ ·æ— æ³•ç”¨äºŒè¿›åˆ¶æµ®ç‚¹ç²¾ç¡®è¡¨ç¤ºçš„æ•°æ�¥è¯´æ˜¯å¾ˆæ˜Žæ˜¾çš„。 由于没有完全ç‰ä»·çš„表示,float('1.1')è¿™æ ·çš„è¡¨è¾¾å¼�会被求解为最接近的å�¯è¡¨ç¤ºå€¼å�³å��å…进制的0x1.199999999999ap+0或å��进制的1.100000000000000088817841970012523233890533447265625。 这个最接近的值过去和现在ä»�然会在å�Žç»çš„æµ®ç‚¹è¿�ç®—ä¸è¢«ä½¿ç”¨ã€‚新的改å�˜é’ˆå¯¹çš„æ˜¯å¦‚何显示数å—。 在之å‰�,Python 使用了一ç§�简å�•的方å¼�。
repr(1.1)的值会被计算为format(1.1, '.17g')并将被求解为'1.1000000000000001'。 使用 17 个数ä½�的优点是它将å‡å€Ÿ IEEE-754 æ ‡å‡†æ�¥ç¡®ä¿�eval(repr(1.1))å°†æ�°å¥½è¢«èˆ�入到其原始值。 ç¼ºç‚¹åˆ™æ˜¯ä¼šè®©è®¸å¤šäººæ„Ÿè§‰è¿™æ ·çš„è¾“å‡ºä»¤äººå›°æƒ‘ï¼ˆå°†äºŒè¿›åˆ¶æµ®ç‚¹è¡¨ç¤ºå½¢å¼�的内在局é™�性误认为是 Python 本身的问题)。用于
repr(1.1)的新算法更为智能并将返回'1.1'。 在实际上,它会æ�œç´¢æ‰€æœ‰ç‰ä»·çš„å—符串表示形å¼�(使用相å�Œçš„下层浮点值进行排åº�ï¼‰å¹¶è¿”å›žå…¶ä¸æœ€çŸçš„表示形å¼�。新算法倾å�‘于尽å�¯èƒ½æ”¾å‡ºæ›´ä¸ºæ¸…晰的表示形å¼�,但它并ä¸�改å�˜ä¸‹å±‚的值。 å› æ¤ä»�然会是
1.1 + 2.2 != 3.3虽然从表示形å¼�上看情况ä¸�æ˜¯è¿™æ ·ã€‚è¿™ä¸ªæ–°ç®—æ³•ä¾�赖于下层浮点实现的æŸ�些特性。 如果未找到所需的特性,则将继ç»ä½¿ç”¨æ—§ç®—法。 æ¤å¤–,文本 pickle å��议也会通过使用旧算法æ�¥ä¿�è¯�跨平å�°çš„å�¯ç§»æ¤�性。
(由 Eric Smith 和 Mark Dickinson 在 bpo-1580 贡献)
新增,改进和弃用的模�¶
å¢žåŠ äº†ä¸€ä¸ª
collections.Counter类以支æŒ�方便地统计一个åº�列或å�¯è¿ä»£å¯¹è±¡ä¸çš„唯一æ�¡ç›®æ•°é‡�。:>>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) Counter({'blue': 3, 'red': 2, 'green': 1})
(由 Raymond Hettinger 在 bpo-1696199 ä¸è´¡çŒ®ã€‚)
�圆了一个新模�
tkinter.ttk用于访问带主题的 Tk 部件集。 ttk 的基本设计æ€�路,就是尽å�¯èƒ½åœ°æŠŠå®žçŽ°éƒ¨ä»¶è¡Œä¸ºçš„ä»£ç �与实现其外观的代ç �分离开æ�¥ã€‚(由 Guilherme Polo 在 bpo-2983 ä¸è´¡çŒ®ã€‚)
gzip.GzipFile和bz2.BZ2File类现在已支�上下文管��议:>>> # Automatically close file after writing >>> with gzip.GzipFile(filename, "wb") as f: ... f.write(b"xxx")
(由 Antoine Pitrou 贡献。)
decimal模�现在支�基于一个二进制float�创建 decimal 对象。 转�是准确的但有时也会令人�惊:>>> Decimal.from_float(1.1) Decimal('1.100000000000000088817841970012523233890533447265625')
这个长长的 decimal 结果值显示了 1.1 所ä¿�å˜çš„实际二进制分数。 这个分数有许多ä½�å› ä¸º 1.1 æ— æ³•ç”¨äºŒè¿›åˆ¶æ�¥ç²¾ç¡®è¡¨ç¤ºã€‚
(由Raymond Hettinger 和 Mark Dickinson贡献。)
itertools模å�—å¢žåŠ äº†ä¸¤ä¸ªæ–°å‡½æ•°ã€‚itertools.combinations_with_replacement()函数是生æˆ�组å�ˆæ•°å¦ç»“果包括排列与笛å�¡å°”积的四个函数之一。itertools.compress()函数模仿了 APL ä¸çš„å�Œå��函数。 æ¤å¤–,现有的itertools.count()函数现在有一个å�¯é€‰çš„ step å�‚æ•°å¹¶å�¯æŽ¥å�—ä»»æ„�类型的计数åº�列包括fractions.Fractionå’Œdecimal.Decimal:>>> [p+q for p,q in combinations_with_replacement('LOVE', 2)] ['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE'] >>> list(compress(data=range(10), selectors=[0,0,1,1,0,1,0,1,0,0])) [2, 3, 5, 7] >>> c = count(start=Fraction(1,2), step=Fraction(1,6)) >>> [next(c), next(c), next(c), next(c)] [Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)]
(由 Raymond Hettinger 贡献。)
collections.namedtuple()现在支æŒ�关键å—å�‚æ•° rename,它å…�è®¸å°†æ— æ•ˆçš„å—æ®µå��自动转æ�¢ä¸º _0, _1 ç‰å½¢å¼�çš„ä½�ç½®å��称。 è¿™åœ¨å—æ®µå��是由外部æº�如 CSV æ ‡å¤´ã€�SQL å—æ®µåˆ—表或用户输入创建的时候会很有用处:>>> query = input() SELECT region, dept, count(*) FROM main GROUPBY region, dept >>> cursor.execute(query) >>> query_fields = [desc[0] for desc in cursor.description] >>> UserQuery = namedtuple('UserQuery', query_fields, rename=True) >>> pprint.pprint([UserQuery(*row) for row in cursor]) [UserQuery(region='South', dept='Shipping', _2=185), UserQuery(region='North', dept='Accounting', _2=37), UserQuery(region='West', dept='Sales', _2=419)]
(由 Raymond Hettinger 在 bpo-1818 ä¸è´¡çŒ®ã€‚)
re.sub(),re.subn()和re.split()函数现在�接�一个 flags 形�。(由 Gregory Smith 贡献)
logging模å�—现在为ä¸�使用 logging 但是调用了使用它的库代ç �的应用程åº�实现了一个简å�•çš„logging.NullHandler类。 设置一个空处ç�†å�¥æŸ„将会å±�蔽诸如 "找ä¸�到日志记录器 foo 的处ç�†å�¥æŸ„" è¿™æ ·çš„è™šå�‡è¦å‘Š:>>> h = logging.NullHandler() >>> logging.getLogger("foo").addHandler(h)
(由 Vinay Sajip 在 bpo-4384 ä¸è´¡çŒ®ã€‚)
支�
-m命令行开关的runpy模å�—现在也支æŒ�当æ��供包å��称时通过查找并执行__main__å�模å�—æ�¥æ‰§è¡ŒåŒ…。(由 Andi Vajda 在 bpo-4195 ä¸è´¡çŒ®ã€‚)
pdb模å�—现在å�¯ä»¥è®¿é—®å¹¶æ˜¾ç¤ºé€šè¿‡zipimport(或其他符å�ˆè§„范的 PEP 302 åŠ è½½å™¨) åŠ è½½çš„æº�代ç �。(由 Alexander Belopolsky 在 bpo-4201 ä¸è´¡çŒ®ã€‚)
functools.partial对象现在å�¯ä»¥è¢«å°�å˜ã€‚
(由 Antoine Pitrou 和 Jesse Noller �议,由 Jack Diederich 实现; bpo-5228。)
为符å�·å¢žåŠ
pydoc帮助主题以使得在交互环境下help('@')能符å�ˆé¢„期的效果。(由 David Laban 在 bpo-4739 ä¸è´¡çŒ®ã€‚)
unittest模å�—现在支æŒ�跳过å�•个测试或测试类。 并且它还支æŒ�å°†ä¸€ä¸ªæµ‹è¯•æ ‡è®°ä¸ºå·²é¢„æœŸä¼šå¤±è´¥ï¼Œå�³å·²ç»�知é�“ä¸�å�¯ç”¨ï¼Œä½†ä¸�应在 TestResult 上被计为一次失败:class TestGizmo(unittest.TestCase): @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows") def test_gizmo_on_windows(self): ... @unittest.expectedFailure def test_gimzo_without_required_library(self): ...
æ¤å¤–,还创建了一些针对异常的测试以便与使用
withè¯å�¥çš„上下文管ç�†å™¨ä¸€èµ·å·¥ä½œ:def test_division_by_zero(self): with self.assertRaises(ZeroDivisionError): x / 0
æ¤å¤–,还新增了一些æ–言方法包括
assertSetEqual(),assertDictEqual(),assertDictContainsSubset(),assertListEqual(),assertTupleEqual(),assertSequenceEqual(),assertRaisesRegexp(),assertIsNone()和assertIsNotNone()。(由Benjamin Peterson 和 Antoine Pitrou 贡献。)
io模�新增了三个常�用于seek()方法:SEEK_SET,SEEK_CUR和SEEK_END。sys.version_info元组现在是一个具�元组:>>> sys.version_info sys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2)
(由 Ross Light 在 bpo-4285 ä¸è´¡çŒ®ã€‚)
当使用�议 2 或更低的版本时,
pickle模å�—已被调适以获得与 Python 2.x 更好的互æ“�作性。 æ ‡å‡†åº“çš„é‡�组改å�˜äº†å¯¹äºŽè®¸å¤šå¯¹è±¡çš„æ£å¼�引用。 例如,Python 2 ä¸çš„__builtin__.set在 Python 3 ä¸ç§°ä¸ºbuiltins.set。 这一改å�˜ä½¿å¾—在ä¸�å�Œç‰ˆæœ¬çš„ Python 之间共享数æ�®çš„努力陷入混乱。 但是现在当选择å��è®® 2 或更低的版本时,å°�å˜å™¨å°†è‡ªåŠ¨ä½¿ç”¨æ—§çš„ Python 2 å��ç§°è¿›è¡ŒåŠ è½½å’Œè½¬å‚¨ã€‚ è¿™æ ·çš„é‡�æ˜ å°„å°†é»˜è®¤å�¯ç”¨ä½†å�¯ä»¥é€šè¿‡ fix_imports 选项æ�¥ç¦�用:>>> s = {1, 2, 3} >>> pickle.dumps(s, protocol=0) b'c__builtin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.' >>> pickle.dumps(s, protocol=0, fix_imports=False) b'cbuiltins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
这项改å�˜çš„一个ä¸�å¹¸ä½†æ— å�¯é�¿å…�的副作用是由 Python 3.1 所产生的å��è®® 2 版本的 pickle 对象对于 Python 3.0 å°†ä¸�å�¯è¯»ã€‚ 当在 Python 3.x 实现之间è¿�移数æ�®æ—¶ï¼Œåº”当使用最新的å��è®® 3 版本的 pickle å��è®®ï¼Œå› ä¸ºå®ƒä¸�会试图与 Python 2.x ä¿�æŒ�兼容。
(由 Alexandre Vassalotti å’Œ Antoine Pitrou 在 bpo-6137 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº†ä¸€ä¸ªæ–°æ¨¡å�—
importlib。 它æ��供了针对importè¯å�¥å�Šå…¶å¯¹åº”物__import__()函数的完整ã€�å�¯ç§»æ¤�的纯 Python 引用实现。 它代表了在记录和定义导入期间所å�‘生的行动ä¸å®žè´¨æ€§çš„一æ¥ã€‚(由 Brett Cannon 贡献。)
性能优化¶
å·²å¢žåŠ çš„ä¸»è¦�性能改善:
æ–°çš„ I/O 库(如 PEP 3116 所定义的)主è¦�是用 Python 编写并很快被è¯�明是 Python 3.0 ä¸çš„一个问题瓶颈。 在 Python 3.1 ä¸ï¼ŒI/O 库已完全用 C é‡�å†™å¹¶æ ¹æ�®å…·ä½“任务的ä¸�å�Œæœ‰ 2 到 20 å€�的速度æ��å�‡ã€‚ 纯 Python 版本ä»�ç„¶å�¯é€šè¿‡
_pyio模�访问以用于实验性目的。(由 Amaury Forgeot d'Arc 和 Antoine Pitrou 贡献。)
æ·»åŠ äº†ä¸€ä¸ªå�¯å�‘å¼�的工具以使仅包å�«ä¸�å�¯è¿½è¸ªå¯¹è±¡çš„元组和å—å…¸ä¸�会被垃圾回收器所追踪。 è¿™å�¯ä»¥å‡�少收集数æ�®çš„大å°�从而å‡�å°‘é•¿æ—¶é—´è¿�行的程åº�的垃圾收集开销,具体å�–决于它们对类型类型的使用方å¼�。
(由 Antoine Pitrou 在 bpo-4688 ä¸è´¡çŒ®ã€‚)
通过在�支�的编译器(主�有: gcc, SunPro, icc)上�用�为
--with-computed-gotosçš„é…�置选项,å—节ç �æ±‚å€¼å¾ªçŽ¯ä¼šä½¿ç”¨æ–°çš„åˆ†æ´¾æœºåˆ¶è¿›è¡Œç¼–è¯‘ï¼Œæ ¹æ�®ç³»ç»Ÿã€�编译器和基准测试工具的ä¸�å�Œï¼Œè¯¥æœºåˆ¶å�¯èŽ·å¾—è‡³å¤š 20% 的速度æ��å�‡ã€‚(由 Antoine Pitrou 以å�Šå…¶ä»–一些å�‚与者在 bpo-4753 ä¸è´¡çŒ®ã€‚)
UTF-8, UTF-16 å’Œ LATIN-1 的解ç �速度现已æ��å�‡äº†äºŒè‡³å››å€�。
(由 Antoine Pitrou å’Œ Amaury Forgeot d'Arc 在 bpo-4868 ä¸è´¡çŒ®ã€‚)
json模å�—现在有了一个å�¯æ˜¾è‘—æ��å�‡å…¶æ€§èƒ½çš„ C 扩展。 æ¤å¤–,还对 API 进行了修改以使 json å�ªé€‚用于str,而ä¸�å†�适用于bytes。 这一修改使得该模å�—能与基于 Unicode çš„ JSON 规范 紧密匹é…�。(由 Bob Ippolito 在 bpo-4136 ä¸è´¡çŒ®ã€‚å¹¶ç”± Antoine Pitrou å’Œ Benjamin Peterson 转æ�¢ä¸ºPy3.1)
è§£å°�æ“�作现在将固定已å°�å˜å¯¹è±¡çš„属性å��称。 è¿™å�¯ä»¥èŠ‚çœ�内å˜å¹¶è®©å°�å˜å¯¹è±¡å�˜å¾—æ›´å°�。
(由 Jake McGuire å’Œ Antoine Pitrou 在 bpo-5084 ä¸è´¡çŒ®ã€‚)
IDLE¶
IDLE çš„æ ¼å¼�è�œå�•现在æ��供了一个从æº�文件ä¸åŽ»é™¤å°¾éƒ¨ç©ºæ ¼çš„é€‰é¡¹ã€‚
(由 Roger D. Serwy 在 bpo-5150 ä¸è´¡çŒ®ã€‚)
构建和 C API 的改�¶
针对 Python 构建过程和 C API 的改�包括:
现在整数在内部是以
2**15为基数或以2**30为基数æ�¥å˜å‚¨çš„,这个基数会在构建时被确定。 在之å‰�版本ä¸ï¼Œå®ƒä»¬æ€»æ˜¯ä»¥2**15为基数æ�¥å˜å‚¨ã€‚ 在 64 ä½�机器上使用2**30为基数å�¯æ˜¾è‘—æ��å�‡æ€§èƒ½ï¼Œä½†åœ¨ 32 ä½�机器上的基准测试结果则好å��å�‚å�Šã€‚ å› æ¤ï¼Œé»˜è®¤ä¼šåœ¨ 64 ä½�机器上使用2**30为基数而在 32 ä½�机器上使用2**15为基数;在 Unix 上,有一个新的é…�置选项--enable-big-digitså�¯è¢«ç”¨äºŽè¦†ç›–æ¤é»˜è®¤å€¼ã€‚除了性能æ��å�‡ä¹‹å¤–这项改å�˜å¯¹äºŽæœ€ç»ˆç”¨æˆ·æ�¥è¯´åº”当是ä¸�å�¯è§�的,å�ªæœ‰ä¸€ä¸ªä¾‹å¤–:出于测试和调试目的有一个新的æ��ä¾›ç›¸å…³å†…éƒ¨æ ¼å¼�ä¿¡æ�¯çš„
sys.int_info,它给出了æ¯�个数ä½�对应的比特ä½�数和用户å˜å‚¨æ¯�个数ä½�的以å—节数表示的 C 类型大å°�:>>> import sys >>> sys.int_info sys.int_info(bits_per_digit=30, sizeof_digit=4)
(由 Mark Dickinson在 bpo-4258 贡献)
PyLong_AsUnsignedLongLong()函数现在将通过引å�‘OverflowError而ä¸�是TypeErroræ�¥å¤„ç�†è´Ÿçš„ pylong。(由 Mark Dickinson å’Œ Lisandro Dalcrin 在 bpo-5175 ä¸è´¡çŒ®ã€‚)
已弃用
PyNumber_Int()。 请改用PyNumber_Long()。(由 Mark Dickinson在 bpo-4910 贡献)
新增了
PyOS_string_to_double()函数以�代已弃用的函数PyOS_ascii_strtod()和PyOS_ascii_atof()。(由 Mark Dickinson 在 bpo-5914 贡献)
å¢žåŠ äº†
PyCapsule作为PyCObjectAPI 的替代。 主è¦�区别在于新类型拥有一个定义良好的接å�£ç”¨æ�¥ä¼ 递类型安全信æ�¯ä»¥å�Šä¸€ä¸ªè¾ƒä½Žå¤�æ�‚度的ç¾å��用æ�¥è°ƒç”¨æž�构器。 旧类型的 API å˜åœ¨é—®é¢˜ä¸”现已被弃用。(由 Larry Hastings 在 bpo-5630 ä¸è´¡çŒ®ã€‚)
移�到 Python 3.1¶
本节列出了先å‰�æ��述的改å�˜ä»¥å�Šå�¯èƒ½éœ€è¦�ä¿®æ”¹ä½ çš„ä»£ç �的其他问题修æ£:
新的浮点å—符串表示形å¼�å�¯èƒ½ä¼šç ´å��现有的 doctest。 例如:
def e(): '''Compute the base of natural logarithms. >>> e() 2.7182818284590451 ''' return sum(1/math.factorial(x) for x in reversed(range(30))) doctest.testmod() ********************************************************************** Failed example: e() Expected: 2.7182818284590451 Got: 2.718281828459045 **********************************************************************
在 pickle 模å�—ä¸ç”¨äºŽå��è®® 2 或更低版本的自动å��ç§°é‡�æ˜ å°„ä¼šä½¿å¾— Python 3.1 çš„ pickle 在 Python 3.0 䏿— 法读å�–。 一ç§�解决方案是使用å��è®® 3。 å�¦ä¸€ç§�解决方案是将 fix_imports 选项设为
False。 请�阅上�的讨论�了解更多细节。