Python 3.7 有什么新�化¶
- 编者:
Elvis Pranskevichus <elvis@magic.io>
本文解释了 Python 3.7 相比 3.6 的新增特性。Python 3.7 于 2018 年 6 月 27 日�布。完整的详情��阅 更新日志。
摘� - �布�点¶
æ–°çš„è¯æ³•特性:
PEP 563ï¼Œç±»åž‹æ ‡æ³¨å»¶è¿Ÿæ±‚å€¼ã€‚
å�‘å�Žä¸�å…¼å®¹çš„è¯æ³•更改:
新的库模�:
新的内置特性:
PEP 553, æ–°çš„
breakpoint()函数。
对 Python 数�模型的改进:
PEP 562, 自定义�访问的模�属性。
PEP 560, typing模å�—å’Œæ³›åž‹ç±»åž‹çš„æ ¸å¿ƒæ”¯æŒ�。
dict 对象会ä¿�æŒ�æ�’入时的顺åº�这个特性 æ£å¼�宣布 æˆ�为 Python è¯è¨€å®˜æ–¹è§„范的一部分。
æ ‡å‡†åº“ä¸çš„é‡�大改进:
asyncio模å�—æ·»åŠ äº†æ–°çš„åŠŸèƒ½ï¼Œé‡�大改进请å�‚阅 å�¯ç”¨æ€§ä¸Žæ€§èƒ½æ��å�‡ã€‚time模å�—现在æ��ä¾› 纳秒级精度函数 的支æŒ�。
CPython 实现的改进:
é�¿å…�使用 ASCII 作为默认的文本编ç �:
PEP 552,确定性的 .pyc 文件
PEP 565,改进的
DeprecationWarning处�
C API 的改进:
PEP 539,用于线程本地å˜å‚¨çš„æ–° C API
文档的改进:
æ¤ç‰ˆæœ¬åœ¨è¯¸å¤šæ–¹é�¢æœ‰æ˜¾è‘—的性能改进。性能优化 ç« èŠ‚è¯¦ç»†åˆ—å‡ºäº†å®ƒä»¬ã€‚
和之å‰�çš„ Python 版本å˜åœ¨å…¼å®¹æ€§çš„æ›´æ”¹åˆ—表,请å�‚阅 ç§»æ¤�到 Python 3.7 ç« èŠ‚ã€‚
新的特性¶
PEP 563ï¼šå»¶è¿Ÿçš„æ ‡æ³¨æ±‚å€¼Â¶
éš�ç�€ PEP 3107 åŠ å…¥æ ‡æ³¨åŠŸèƒ½å¹¶åœ¨ PEP 526 进一æ¥ç»†åŒ–,Python ä¸ç±»åž‹æ��示的出现æ�示了两个明显的å�¯ç”¨æ€§é—®é¢˜ï¼š
æ ‡æ³¨å�ªèƒ½ä½¿ç”¨åœ¨å½“å‰�作用域ä¸å·²ç»�å˜åœ¨çš„å��称,也就是说,它们ä¸�支æŒ�任何形å¼�çš„å‰�å�‘引用;而且——
æ ‡æ³¨æº�ç �对 Python 程åº�çš„å�¯åŠ¨æ—¶é—´æœ‰ä¸�利的影å“�。
这两个问题都å�¯ä»¥é€šè¿‡å»¶è¿Ÿæ ‡æ³¨æ±‚值æ�¥è§£å†³ã€‚åœ¨å®šä¹‰æ ‡æ³¨çš„æ—¶å€™ï¼Œç¼–è¯‘å™¨å¹¶ä¸�会编译执行相应表达å¼�的代ç �,而是ä¿�å˜ä¸Žç›¸åº”表达å¼�çš„ AST ç‰ä»·çš„å—符串形å¼�。如果有需è¦�ï¼Œæ ‡æ³¨å�¯ä»¥åœ¨è¿�行时使用 typing.get_type_hints() 进行解æž�。在ä¸�需è¦�è¿™ç§�è§£æž�çš„é€šå¸¸æƒ…å†µä¸‹ï¼Œæ ‡æ³¨çš„å˜å‚¨æˆ�æœ¬æ›´ä½Žï¼ˆå› ä¸ºè§£æž�器å�ªéœ€å¤„ç�†è¾ƒçŸçš„å—符串)且å�¯åŠ¨æ—¶é—´æ›´çŸã€‚
在å�¯ç”¨æ€§æ–¹é�¢ï¼Œæ ‡æ³¨çŽ°åœ¨æ”¯æŒ�å�‘å‰�引用,以使以下å�¥æ³•有效:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
由于æ¤ä¿®æ”¹ä¼šç ´å��兼容性,在 Python 3.7 䏿¤ç§�新的行为需è¦�在æ¯�个模å�—层级上使用 __future__ 导入æ�¥å�¯ç”¨:
from __future__ import annotations
它将在 Python 3.10 䏿ˆ�为默认行为。
��
- PEP 563 -- å»¶è¿Ÿçš„æ ‡æ³¨æ±‚å€¼
PEP 由 �ukasz Langa 撰写并实现。
PEP 538: ä¼ ç»Ÿ C 区域强制转æ�¢Â¶
Python 3 系列有一个æŒ�ç»çš„æŒ‘战就是为处ç�† 7 比特ä½� ASCII 文本的å�‡å®šç¼–ç �确定å�ˆç�†çš„默认ç–略,目å‰�的设定是在é�ž Windows å¹³å�°ä¸Šä½¿ç”¨é»˜è®¤çš„ C 或 POSIX 区域设置。
PEP 538 更新了默认的解释器命令行接å�£ï¼Œä»¥è‡ªåŠ¨å°†ä¸Šè¿°åŒºåŸŸå¼ºåˆ¶è½¬æ�¢ä¸ºå�¯ç”¨çš„基于 UTF-8 的区域,具体æ��è¿°å�¯å�‚è§�有关新增环境å�˜é‡� PYTHONCOERCECLOCALE 的文档。 以这ç§�æ–¹å¼�自动设置 LC_CTYPE æ„�味ç�€æ ¸å¿ƒè§£é‡Šå™¨å’Œèƒ½æ„ŸçŸ¥åŒºåŸŸçš„ C 扩展 (例如 readline) 都将会å�‡å®š UTF-8 已被用作默认的文本编ç �,而ä¸�å†�是 ASCII。
PEP 11 ä¸çš„å¹³å�°æ”¯æŒ�定义也已被更新以é™�制完整文本处ç�†æ”¯æŒ�适当é…�置的基于é�ž ASCII çš„è¯è¨€åŒºåŸŸã€‚
ä½œä¸ºæ¤æ›´æ”¹çš„一部分,当使用任何已定义的强制转æ�¢ç›®æ ‡åŒºåŸŸæ—¶ (ç›®å‰�为 C.UTF-8, C.utf8 å’Œ UTF-8) stdin å’Œ stdout 默认的处ç�†å™¨çŽ°åœ¨å°†ä¸º surrogateescape (而ä¸�是 strict)。 è€Œæ— è®ºæ˜¯ä»€ä¹ˆåŒºåŸŸï¼Œstderr 默认的处ç�†å™¨ä»�为 backslashreplace。
默认情况下区域强制转æ�¢ä¼šé�™é»˜è¿›è¡Œï¼Œä½†ä¸ºäº†è¾…助调试潜在的区域相关集æˆ�问题,å�¯ä»¥é€šè¿‡è®¾ç½® PYTHONCOERCECLOCALE=warn æ�¥è¯·æ±‚显å¼�地å�¯ç”¨è¦å‘Šä¿¡æ�¯ï¼ˆç›´æŽ¥åœ¨ stderr 上å�‘出)。 æ¤è®¾ç½®è¿˜ä¼šä½¿å¾— Python è¿�è¡Œæ—¶åœ¨æ ¸å¿ƒè§£é‡Šå™¨åˆ�å§‹åŒ–æ—¶å¦‚æžœä¼ ç»Ÿ C 区域ä»�然处于激活状æ€�æ—¶å�‘出è¦å‘Šã€‚
虽然 PEP 538 的区域强制转æ�¢çš„好处在于它还会å�Œæ—¶å½±å“�扩展模å�— (例如 GNU readline) 以å�Šå�进程 (包括è¿�行é�ž Python 应用和旧版本 Python çš„å�进程),但它也å˜åœ¨éœ€è¦�所è¿�行系统必须å˜åœ¨é€‚å�ˆçš„ç›®æ ‡åŒºåŸŸçš„ç¼ºç‚¹ã€‚ 为了更好地处ç�†æ²¡æœ‰å�¯ç”¨é€‚å�ˆçš„ç›®æ ‡åŒºåŸŸçš„æƒ…å†µ (例如在 RHEL/CentOS 7 ä¸Šå°±ä¼šå‡ºçŽ°æ¤æƒ…况),Python 3.7 还实现了 PEP 540: 强制 UTF-8 è¿�行时模å¼�。
��
- PEP 538 -- 强制转æ�¢ä¼ 统 C 区域到基于 UTF-8 的区域
PEP 由 Nick Coghlan 撰写并实现。
PEP 540: 强制 UTF-8 �行时模�¶
新的 -X utf8 命令行选项和 PYTHONUTF8 环境���被用��用 Python UTF-8 模�。
当处于 UTF-8 模å¼�时,CPython 会忽略区域设置,并默认使用 UTF-8 ç¼–ç �。 用于 sys.stdin å’Œ sys.stdout æµ�的错误处ç�†å™¨å°†è®¾ç½®ä¸º surrogateescape。
强制 UTF-8 模å¼�å�¯è¢«ç”¨æ�¥åœ¨åµŒå…¥çš„ Python è§£é‡Šå™¨ä¸æ”¹å�˜æ–‡æœ¬å¤„ç�†è¡Œä¸ºï¼Œè€Œä¸�会改å�˜åµŒå…¥æ–¹åº”用的区域设置。
PEP 540 çš„ UTF-8 模å¼�的好处是ä¸�必关心è¿�è¡Œæ‰€åœ¨ç³»ç»Ÿä¸æœ‰å“ªäº›å�¯ç”¨åŒºåŸŸå�³å�¯å·¥ä½œï¼Œä½†å®ƒä¹Ÿå˜åœ¨å¯¹æ‰©å±•模å�— (例如 GNU readline)ã€�è¿�行é�ž Python 应用的å�进程以å�Šè¿�行旧版本 Python çš„å�进程ä¸�起作用的缺点。 为了å‡�å°�ä¸Žè¿™äº›ç»„ä»¶é€šä¿¡æ—¶ç ´å��文本数æ�®çš„风险,Python 3.7 还实现了 PEP 540: 强制 UTF-8 è¿�行时模å¼�)。
UTF-8 模å¼�在è¯è¨€åŒºåŸŸä¸º C 或 POSIX 并且 PEP 538 区域强制转æ�¢ç‰¹æ€§æ— 法将其修改为æŸ�ç§�基于 UTF-8 的替代项时会被默认å�¯ç”¨ï¼ˆæ— 论修改失败是由于设置了 PYTHONCOERCECLOCALE=0, LC_ALL 还是由于缺少适å�ˆçš„ç›®æ ‡åŒºåŸŸï¼‰ã€‚
��
- PEP 540 -- å¢žåŠ äº†æ–°çš„ UTF-8 模å¼�
PEP 由 Victor Stinner 撰写并实现
PEP 553: 内置的 breakpoint()¶
Python 3.7 包�了新的内置 breakpoint() 函数,作为一�简�方便地进入 Python 调试器的方�。
内置 breakpoint() 会调用 sys.breakpointhook()。 在默认情况下å�Žè€…会导入 pdb ç„¶å�Žå†�调用 pdb.set_trace(),但是通过将 sys.breakpointhook() ç»‘å®šåˆ°ä½ é€‰å®šçš„å‡½æ•°ï¼Œbreakpoint() å�¯ä»¥è¿›å…¥ä»»ä½•调试器。 æ¤å¤–,环境å�˜é‡� PYTHONBREAKPOINT å�¯è¢«è®¾ç½®ä¸ºä½ 选定的调试器的å�¯è°ƒç”¨å¯¹è±¡ã€‚ 设置 PYTHONBREAKPOINT=0 会完全ç¦�用内置 breakpoint()。
��
- PEP 553 -- 内置的 breakpoint()
PEP 由 Barry Warsaw 撰写并实现
PEP 539: 用于线程局部å˜å‚¨çš„æ–° C API¶
虽然 Python æ��供了用于线程å˜å‚¨æ”¯æŒ�çš„ C API;但原有的 线程局部å˜å‚¨ (TLS) API 已使用 int æ�¥è¡¨ç¤ºæ‰€æœ‰å¹³å�°ä¸Šçš„ TLS 密钥。 对于官方支æŒ�的平å�°è€Œè¨€è¿™é€šå¸¸ä¸�是问题,但这å�³ä¸�符å�ˆ POSIX æ ‡å‡†ï¼Œä¹Ÿä¸�具备任何实际æ„�义上的å�¯ç§»æ¤�性。
PEP 539 通过å�‘ CPython æ��供一个å�–代 CPython 解释器内部的现有 TLS API 的使用的新的 线程专属å˜å‚¨ (TSS) API æ�¥æ”¹å�˜è¿™ä¸€ç‚¹ï¼Œå�Œæ—¶å¼ƒç”¨äº†çŽ°æœ‰çš„ API。 TSS API 使用一ç§�新类型 Py_tss_t 而é�ž int æ�¥è¡¨ç¤º TSS 密钥 -- 这是一ç§�具体定义ä¾�赖于下层 TLS 实现的ä¸�é€�明类型。 å› æ¤ï¼Œè¿™å°†å…�è®¸åœ¨ä»¥æ— æ³•å®‰å…¨åœ°è½¬æ�¢ä¸º int 的方å¼�定义原生 TLS 密钥的平å�°ä¸Šæž„建 CPython。
请注æ„�在 TLS 密钥定义方å¼�ä½¿å…¶æ— æ³•è¢«å®‰å…¨åœ°è½¬æ�¢ä¸º int 的平å�°ä¸Šï¼ŒçŽ°æœ‰ TLS API ä¸çš„å…¨éƒ¨å‡½æ•°å°†æ— æ³•æ‰§è¡Œå¹¶ä¼šç«‹å�³è¿”回失败信æ�¯ã€‚ è¿™æ ·å�¯ä»¥æ¸…楚地表明原有 API åœ¨æ— æ³•å�¯é€‰ä½¿ç”¨çš„å¹³å�°ä¸Šä¸�å�—支æŒ�,并且也ä¸�å‡†å¤‡æ·»åŠ æ¤ç§�支æŒ�。
��
- PEP 539 -- 在 CPython ä¸ç”¨äºŽçº¿ç¨‹å±€éƒ¨å˜å‚¨çš„æ–° C-API
PEP 由 Erik M. Bray 撰写;由 Masayuki Yamamoto 实现。
PEP 562: 定制对模�属性的访问¶
Python 3.7 �许在模�上定义 __getattr__() 并且当以其他方�找�到�个模�属性时将会调用它。 在模�上定义 __dir__() 现在也是�许的。
一个典型的å�¯èƒ½æœ‰ç”¨çš„例å�是已弃用模å�—å±žæ€§å’Œæƒ°æ€§åŠ è½½ã€‚
��
- PEP 562 -- 模�的
__getattr__和__dir__ PEP 由 Ivan Levkivskyi 撰写并实现
PEP 564: 具有纳秒级精度的新时间函数¶
现代系统的时钟精度å�¯ä»¥è¶…过由 time.time() 函数å�Šå…¶å�˜åŒ–å½¢å¼�所返回的浮点数的有é™�精度。 为了é�¿å…�精度æ�Ÿå¤±ï¼ŒPEP 564 在 time 模å�—ä¸å¢žåŠ äº†åŽŸæœ‰è®¡æ—¶å™¨å‡½æ•°çš„å…个新“纳秒版â€�å�˜åŒ–å½¢å¼�:
这些新函数会以整数值的形�返回纳秒数。
测�结果 显示在 Linux 和 Windows time.time_ns() 的精度相比 time.time() 大约�高 3 �。
��
- PEP 564 -- å¢žåŠ å…·æœ‰çº³ç§’çº§ç²¾åº¦çš„æ–°æ—¶é—´å‡½æ•°
PEP 由 Victor Stinner 撰写并实现
PEP 565: 在 __main__ 䏿˜¾ç¤º DeprecationWarning¶
DeprecationWarning 的默认处ç�†æ–¹å¼�å·²ç»�被更改,这æ¤è¦å‘Šé»˜è®¤å�ªæ˜¾ç¤ºä¸€æ¬¡ï¼Œä»…有当直接在 __main__ 模å�—ä¸è¿�行的代ç �触å�‘它们时æ‰�会å†�次显示。 å› æ¤ï¼Œå�•文件脚本开å�‘者以å�Š Python 交互模å¼�使用者应该会å†�次开始看到针对他们所使用 API 的已弃用è¦å‘Šï¼Œä½†è¢«å¯¼å…¥åº”用ã€�库和框架模å�—所触å�‘的已弃用è¦å‘Šé»˜è®¤å°†ç»§ç»éš�è—�。
作为æ¤é¡¹æ›´æ”¹çš„ç»“æžœï¼Œæ ‡å‡†åº“çŽ°åœ¨å…�许开å�‘者在三ç§�ä¸�å�Œçš„已弃用è¦å‘Šè¡Œä¸ºä¹‹é—´è¿›è¡Œé€‰æ‹©:
FutureWarning: 默认情况下总是会显示,建议用于应用程åº�最终用户应该看到的è¦å‘Šä¿¡æ�¯ï¼ˆä¾‹å¦‚对于已弃用的应用程åº�é…�置的设置选项)。DeprecationWarning: 默认情况下仅在__main__ä¸ä»¥å�Šå½“è¿�行测试时会显示,建议用于其他 Python å¼€å�‘者应该看到的è¦å‘Šä¿¡æ�¯ï¼Œæ��示版本å�‡çº§å�¯èƒ½å¯¼è‡´è¡Œä¸ºæ”¹å�˜æˆ–者错误。PendingDeprecationWarning: 默认情况下仅在è¿�行测试时会显示,å�¯ç”¨äºŽæ��示未æ�¥ç‰ˆæœ¬å�‡çº§å°†ä¼šæ”¹å�˜è¦å‘Šç±»åˆ«ä¸ºDeprecationWarning或FutureWarning的情况。
在æ¤ä¹‹å‰� DeprecationWarning å’Œ PendingDeprecationWarning 都仅在è¿�行测试时å�¯è§�,这æ„�味ç�€ä¸»è¦�编写å�•文件脚本或使用 Python 交互模å¼�的开å�‘者å�¯èƒ½ä¼šå› 他们所用 API çª�然出现的改å�˜è€Œæ„Ÿåˆ°æƒŠè®¶ã€‚
��
- PEP 565 -- 在
__main__䏿˜¾ç¤º DeprecationWarning PEP ç”± Nick Coghlan 撰写并实现
PEP 560: 对 typing 模å�—å’Œæ³›åž‹ç±»åž‹çš„æ ¸å¿ƒæ”¯æŒ�¶
PEP 484 最åˆ�的设计方å¼�使其ä¸�会å�‘æ ¸å¿ƒ CPython 解释器引入 任何 更改。 现在类型æ��示和 typing 模å�—å·²è¢«ç¤¾åŒºå¹¿æ³›ä½¿ç”¨ï¼Œå› æ¤è¿™ä¸ªé™�制已被å�–消。 这个 PEP 引入了两个特殊方法 __class_getitem__() å’Œ __mro_entries__,这些方法现在被 typing ä¸çš„å¤§å¤šæ•°ç±»å’Œç‰¹æ®Šæž„é€ æ‰€ä½¿ç”¨ã€‚ 结果就是与类型相关的å�„ç±»æ“�作的速度æ��å�‡äº† 7 å€�,泛型类型å�¯ä»¥åœ¨æ²¡æœ‰å…ƒç±»å†²çª�的情况下被使用,而 typing 模å�—ä¸å‡ 个长期å˜åœ¨çš„错误也已被修æ£ã€‚
��
- PEP 560 -- 对 typing 模å�—å’Œæ³›åž‹ç±»åž‹çš„æ ¸å¿ƒæ”¯æŒ�
PEP 由 Ivan Levkivskyi 撰写并实现
PEP 552: 基于哈希值的 .pyc 文件¶
ä¼ ç»Ÿä¸Š Python 检查å—节ç �ç¼“å˜æ–‡ä»¶ (å�³ .pyc 文件) 是å�¦æœ€æ–°çš„æ–¹å¼�是通过对æº�ç �元数æ�® (最å�Žæ›´æ”¹çš„æ—¶é—´æˆ³å’Œå¤§å°�)和生æˆ�ç¼“å˜æ—¶ä¿�å˜åœ¨å…¶æ–‡ä»¶å¤´ä¸çš„æº�ç �元数æ�®è¿›è¡Œæ¯”较。 è¿™ç§�检查方法虽然有效,但也å˜åœ¨ç¼ºç‚¹ã€‚ 当文件系统的时间戳太粗糙时,Python 有å�¯èƒ½é”™è¿‡æº�ç �更新,导致用户感到困惑。 æ¤å¤–ï¼Œåœ¨ç¼“å˜æ–‡ä»¶ä¸å˜åœ¨æ—¶é—´æˆ³å¯¹äºŽ 构建å�¯å†�现 并且基于内容的构建系统æ�¥è¯´æ˜¯æœ‰é—®é¢˜çš„。
PEP 552 扩展了 pyc æ ¼å¼�以å…�许使用æº�文件的哈希值而é�žæº�文件的时间戳æ�¥æ£€æŸ¥æœ‰æ•ˆæ€§ã€‚ è¿™ç§� .pyc 文件就称为“基于哈希值的â€�。 默认情况下,Python ä»�然使用基于时间戳的有效性检查,ä¸�会在è¿�行时生æˆ�基于哈希值的 .pyc 文件。 基于哈希值的 .pyc 文件å�¯ä»¥ä½¿ç”¨ py_compile 或 compileall æ�¥ç”Ÿæˆ�。
基于哈希值的 .pyc 文件包å�«ä¸¤ç§�å�˜ä½“:已选定和未选定。 Python 会在è¿�行时针对相应æº�ç �文件验è¯�已选定基于哈希值的 .pyc 文件,但对未选定基于哈希值的 pyc 文件则ä¸�ä¼šè¿™æ ·å�šã€‚ 未选定基于哈希值的 .pyc 文件对于需è¦�ç”± Python 外部的系统(例如构建系统)负责使 .pyc 文件ä¿�æŒ�最新的环境æ�¥è¯´æ˜¯ä¸€ç§�有用的性能优化。
请å�‚阅 已缓å˜å—节ç �的失效 了解更多信æ�¯ã€‚
��
- PEP 552 -- 确定性的 pyc 文件
PEP 由 Benjamin Peterson 撰写并实现
PEP 545: Python 文档翻译¶
PEP 545 �述了创建和维护 Python 文档翻译的整个过程。
新增了三个新的翻译版本:
æ—¥è¯: https://docs.python.org/ja/
法è¯: https://docs.python.org/fr/
韩è¯: https://docs.python.org/ko/
��
- PEP 545 -- Python 文档翻译
PEP 由 Julien Palard, Inada Naoki 和 Victor Stinner 撰写并实现。
Python 开�模� (-X dev)¶
新的 -X dev 命令行选项或新的 PYTHONDEVMODE 环境���被用��用 Python 开�模�。 在开�模�下,Python 将执行�外的如果默认�用会导致开销过大的�行时检查。 请�阅 Python 开�模� 文档查看完整说明。
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
await表达å¼�和包å�«async forå�å�¥çš„æŽ¨å¯¼å¼�ä¸�å…�许在 æ ¼å¼�化å—符串å—é�¢å€¼ 的表达å¼�ä¸ä½¿ç”¨ã€‚ 在 Python 3.7 䏿¤é™�制已被å�–消。现在å�¯ä»¥å°†è¶…过 255 个å�‚æ•°ä¼ é€’ç»™ä¸€ä¸ªå‡½æ•°ï¼Œè€ŒçŽ°åœ¨ä¸€ä¸ªå‡½æ•°ä¹Ÿå�¯ä»¥æ‹¥æœ‰è¶…过 255 个形å�‚。 (由 Serhiy Storchaka 在 bpo-12844 å’Œ bpo-18896 ä¸è´¡çŒ®ã€‚)
现在
bytes.fromhex()å’Œbytearray.fromhex()会忽略所有 ASCII 空白符,而é�žä»…æ˜¯ç©ºæ ¼ç¬¦. (由 Robert Xiao 在 bpo-28927 ä¸è´¡çŒ®ã€‚)str,byteså’Œbytearray获得了对新isascii()方法的支æŒ�,该方法å�¯è¢«ç”¨æ�¥æµ‹è¯•是个å—符串或å—节串是å�¦ä»…包å�« ASCII å—符。 (由 INADA Naoki 在 bpo-32677 ä¸è´¡çŒ®ã€‚)现在当
from ... import ...失败时ImportError会显示模å�—å��称和模å�—__file__路径。 (由 Matthias Bussonnier 在 bpo-29546 ä¸è´¡çŒ®ã€‚)现在已支æŒ�涉å�Šå°†å�模å�—绑定到一个å��ç§°çš„ç»�对导入的循环导入。 (由 Serhiy Storchaka 在 bpo-30024 ä¸è´¡çŒ®ã€‚)
现在
object.__format__(x, '')ç‰ä»·äºŽstr(x)而é�žformat(str(self), '')。 (由 Serhiy Storchaka d bpo-28974 ä¸è´¡çŒ®ã€‚)为了更好地支æŒ�æ ˆè·Ÿè¸ªçš„åŠ¨æ€�创建,现在
types.TracebackTypeå�¯ä»¥ä»Ž Python 代ç �ä¸è¢«å®žä¾‹åŒ–,并且 回溯对象 çš„tb_next属性现在是å�¯å†™çš„。 (由 Nathaniel J. Smith 在 bpo-30579 ä¸è´¡çŒ®ã€‚)当使用
-m开关时,现在sys.path[0]会主动扩展为完整的起始目录路径,而ä¸�是ä¿�æŒ�为空目录(这将å…�许在å�‘生导入时从 当å‰� 工作目录导入) (由 Nick Coghlan 在 bpo-33053 ä¸è´¡çŒ®ã€‚)新的
-Ximporttime选项或PYTHONPROFILEIMPORTTIME环境å�˜é‡�å�¯è¢«ç”¨æ�¥æ˜¾ç¤ºæ¯�次模å�—导入的时间。 (由 Inada Naoki 在 bpo-31415 ä¸è´¡çŒ®ã€‚)
新增模�¶
contextvars¶
æ–°çš„ contextvars 模å�—和一组 æ–°çš„ C API 引入了对 上下文å�˜é‡� 的支æŒ�。 上下文å�˜é‡�在概念上类似于线程局部å�˜é‡�。 与 TLS ä¸�å�Œï¼Œä¸Šä¸‹æ–‡å�˜é‡�能æ£ç¡®åœ°æ”¯æŒ�异æ¥ä»£ç �。
asyncio å’Œ decimal 已得到更新以使用和支æŒ�开箱å�³ç”¨çš„上下文å�˜é‡�。 特别是激活的 decimal 上下文现在将å˜å‚¨åœ¨ä¸Šä¸‹æ–‡å�˜é‡�ä¸ï¼Œå®ƒå…�许å��进制è¿�算在异æ¥ä»£ç �ä¸ä½¿ç”¨æ£ç¡®çš„上下文。
��
- PEP 567 -- 上下文��
PEP 由 Yury Selivanov 撰写并实现
dataclasses¶
æ–°çš„ dataclass() 装饰器æ��供了一ç§�声明 æ•°æ�®ç±» 的方å¼�。 æ•°æ�®ç±»ä½¿ç”¨å�˜é‡�æ ‡æ³¨æ�¥æ��述其属性。 å®ƒçš„æž„é€ å™¨å’Œå…¶ä»–é”æœ¯æ–¹æ³•例如 __repr__(), __eq__() 以å�Š __hash__() 会自动地生æˆ�。
示例:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
��
- PEP 557 -- 数�类
PEP 由 Eric V. Smith 撰写并实现
importlib.resources¶
æ–°çš„ importlib.resources 模å�—æ��供了一些新的 API 和一个新的 ABC 用于访问ã€�打开和读å�–包内的 资æº�。 资æº�基本上类似于包内的文件,但它们ä¸�一定是物ç�†æ–‡ä»¶ç³»ç»Ÿä¸å®žé™…的文件。 模å�—åŠ è½½å™¨å�¯ä»¥æ��ä¾› get_resource_reader() 函数,它会返回一个 importlib.abc.ResourceReader 实例æ�¥æ”¯æŒ�这个新 API。 å†…ç½®çš„æ–‡ä»¶è·¯å¾„åŠ è½½å™¨å’Œ zip æ–‡ä»¶åŠ è½½å™¨éƒ½æ”¯æŒ�æ¤ç‰¹æ€§ã€‚
ç”± Barry Warsaw å’Œ Brett Cannon 在 bpo-32248 ä¸è´¡çŒ®ã€‚
��
importlib_resources -- 用于较早版本 Python 的 PyPI �下移�包。
改进的模�¶
argparse¶
æ–°çš„ ArgumentParser.parse_intermixed_args() 方法å…�许混å�ˆé€‰é¡¹ä¸Žä½�ç½®å�‚数。 (由 paul.j3 在 bpo-14191 䏿��供。)
asyncio¶
asyncio 模�获得了许多新的特性��用性和 性能��。 ��的改�包括:
新的 暂定
asyncio.run()函数å�¯è¢«ç”¨äºŽé€šè¿‡è‡ªåŠ¨åˆ›å»ºå’Œé”€æ¯�事件循环æ�¥åŸºäºŽå�Œæ¥ä»£ç �è¿�行å��程。 (由 Yury Selivanov 在 bpo-32314 ä¸è´¡çŒ®ã€‚)asyncio å¢žåŠ æ”¯æŒ�
contextvars.loop.call_soon(),loop.call_soon_threadsafe(),loop.call_later(),loop.call_at()并且Future.add_done_callback()具有新的å�¯é€‰ä»…关键å—å�‚æ•° context。 现在Tasks会自动跟踪其上下文。 详情å�‚è§� PEP 567。 (由 Yury Selivanov 在 bpo-32436 ä¸è´¡çŒ®ã€‚ï¼‰å¢žåŠ äº†æ–°çš„
asyncio.create_task()函数作为asyncio.get_event_loop().create_task()的快æ�·æ–¹å¼�。 (由 Andrew Svetlov 在 bpo-32311 ä¸è´¡çŒ®ã€‚)新的
loop.start_tls()方法å�¯ç”¨äºŽå�‡çº§çŽ°æœ‰çš„ TLS 连接。 (由 Yury Selivanov 在 bpo-23749 ä¸è´¡çŒ®ã€‚)新的
loop.sock_recv_into()方法å…�许直接从套接å—读å�–æ•°æ�®æ”¾å…¥æ‰€æ��供的缓冲区,从而å�¯ä»¥å‡�å°‘æ•°æ�®å¤�制。 (由 Antoine Pitrou 在 bpo-31819 ä¸è´¡çŒ®ã€‚)新的
asyncio.current_task()函数å�¯è¿”回当å‰�è¿�行的Task实例,以å�Šæ–°çš„asyncio.all_tasks()函数å�¯è¿”å›žç»™å®šå¾ªçŽ¯ä¸æ‰€æœ‰çްå˜Task实例的集å�ˆã€‚Task.current_task()å’ŒTask.all_tasks()方法已弃用。 (由 Andrew Svetlov 在 bpo-32250 ä¸è´¡çŒ®ã€‚)新的 暂定
BufferedProtocolç±»å…�许通过手动控制接收缓冲区æ�¥å®žçްæµ�å¼�å��议。 (由 Yury Selivanov 在 bpo-32251 ä¸è´¡çŒ®ã€‚)新的
asyncio.get_running_loop()函数å�¯è¿”回当å‰�è¿�行的循环,如果没有循环在è¿�行则引å�‘RuntimeError。 这与asyncio.get_event_loop()ä¸�å�Œï¼Œå�Žè€…在没有循环在è¿�行时将 创建 一个新的事件循环。 (由 Yury Selivanov 在 bpo-32269 䏿��供。)新的
StreamWriter.wait_closed()å��程方法å…�许执行ç‰å¾…直到æµ�写入器被关é—。 æ–°çš„StreamWriter.is_closing()方法å�¯ç”¨äºŽç¡®å®šå†™å…¥å™¨æ˜¯å�¦è¢«å…³é—。 (由 Andrew Svetlov 在 bpo-32391 ä¸è´¡çŒ®ã€‚)新的
loop.sock_sendfile()å��程方法å…�许在å�¯èƒ½çš„æƒ…况下使用os.sendfileå�‘é€�文件。 (由 Andrew Svetlov 在 bpo-32410 ä¸è´¡çŒ®ã€‚)新的
Future.get_loop()å’ŒTask.get_loop()方法会返回创建 task 或 future 对象的事件循环的实例。Server.get_loop()å…�许为asyncio.Server对象执行å�Œæ ·æ“�作。 (由 Yury Selivanov 在 bpo-32415 ä¸ï¼Œä»¥å�Šç”± Srinivas Reddy Thatiparthy 在 bpo-32418 ä¸è´¡çŒ®ã€‚)现在å�¯ä»¥æŽ§åˆ¶
asyncio.Server的实例如何开å�¯æœ�务。 之å‰�,æœ�务在创建å�Žå°†ç«‹å�³å¼€å�¯æœ�务。 æ–°çš„ start_serving 关键å—å�‚æ•°å·²æ·»åŠ åˆ°loop.create_server()å’Œloop.create_unix_server(),并且Server.start_serving(), å’ŒServer.serve_forever()å�¯è¢«ç”¨æ�¥åˆ†ç¦»æœ�务的实例化和æœ�务的开å�¯ã€‚ æ–°çš„Server.is_serving()方法会在æœ�务开å�¯æ—¶è¿”回True。 现在Server对象已是异æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨:srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(由 Yury Selivanov 在 bpo-32662 ä¸è´¡çŒ®ã€‚)
ç”±
loop.call_later()所返回的回调对象已获得新的when()方法,该方法会返回一个排入计划日程的ç»�对时间戳。 (由 Andrew Svetlov 在 bpo-32741 ä¸è´¡çŒ®ã€‚)loop.create_datagram_endpoint()方法已获得对 Unix 套接å—的支æŒ�。 (由 Quentin Dawans 在 bpo-31245 ä¸è´¡çŒ®ã€‚)asyncio.open_connection(),asyncio.start_server()functions,loop.create_connection(),loop.create_server(),loop.create_accepted_socket()方法å�Šå…¶å¯¹åº”çš„ UNIX 套接å—å�˜ä½“现在接å�— ssl_handshake_timeout 关键å—å�‚数。 (由 Neil Aspinall 在 bpo-29970 ä¸è´¡çŒ®ã€‚)新的
Handle.cancelled()方法会在回调被å�–消时返回True。 (由 Marat Sharafutdinov 在 bpo-31943 ä¸è´¡çŒ®ã€‚)asyncio æº�已被转æ�¢ä¸ºä½¿ç”¨
async/awaitè¯æ³•。 (由 Andrew Svetlov 在 bpo-32193 ä¸è´¡çŒ®ã€‚)新的
ReadTransport.is_reading()方法å�¯ç”¨äºŽç¡®å®šä¼ 输的读å�–状æ€�。 æ¤å¤–,对ReadTransport.resume_reading()å’ŒReadTransport.pause_reading()的调用现在是幂ç‰çš„。 (由 Yury Selivanov 在 bpo-32356 ä¸è´¡çŒ®ã€‚)接å�—套接å—路径的循环方法现在支æŒ�ä¼ å…¥ 路径类对象。 (由 Yury Selivanov 在 bpo-32066 ä¸è´¡çŒ®ã€‚)
在
asyncioä¸ï¼ŒLinux 上的 TCP 套接å—现在创建时默认带有TCP_NODELAYæ——æ ‡è®¾ç½®ã€‚ (由 Yury Selivanov å’Œ Victor Stinner 在 bpo-27456 ä¸è´¡çŒ®ã€‚)在被å�–消任务ä¸å�‘生的异常ä¸�会å†�被记录。 (由 Yury Selivanov 在 bpo-30508 ä¸è´¡çŒ®ã€‚)
æ–°çš„
WindowsSelectorEventLoopPolicyå’ŒWindowsProactorEventLoopPolicy类。 (由 Yury Selivanov 在 bpo-33792 ä¸è´¡çŒ®ã€‚)
部分 asyncio API 改为 已弃用。
binascii¶
b2a_uu() 函数现在接å�—å�¯é€‰çš„ backtick 关键å—å�‚数。 当其为真值时,零会以 '`' 而é�žç©ºæ ¼æ�¥è¡¨ç¤ºã€‚ (由 Xiang Zhang 在 bpo-30103 ä¸è´¡çŒ®ã€‚)
calendar¶
HTMLCalendar 类具有新的类属性,å�¯ä»¥ç®€åŒ–所生æˆ� HTML æ—¥åŽ†ä¸ CSS 类的自定义。 (由 Oz Tiram 在 bpo-30095 ä¸è´¡çŒ®ã€‚)
collections¶
collections.namedtuple() 现在支æŒ�默认值。 (由 Raymond Hettinger 在 bpo-32320 ä¸è´¡çŒ®ã€‚)
compileall¶
compileall.compile_dir() å¢žåŠ äº†æ–°çš„ invalidation_mode å½¢å�‚,å�¯ç”¨äºŽå�¯ç”¨ 基于哈希值的 .pyc 有效性检测。 失效模å¼�也å�¯ä»¥åœ¨å‘½ä»¤è¡Œä¸ä½¿ç”¨æ–°çš„ --invalidation-mode å�‚æ•°æ�¥æŒ‡å®šã€‚ (由 Benjamin Peterson 在 bpo-31650 ä¸è´¡çŒ®ã€‚)
concurrent.futures¶
ProcessPoolExecutor å’Œ ThreadPoolExecutor 现在支æŒ�æ–°çš„ åˆ�始化器 以å�Š initargs æž„é€ å™¨å�‚数。 (由 Antoine Pitrou 在 bpo-21423 ä¸è´¡çŒ®ã€‚)
ProcessPoolExecutor 现在能通过新的 mp_context å�‚æ•°æ�¥æŽ¥å�—多进程上下文。 (由 Thomas Moreau 在 bpo-31540 ä¸è´¡çŒ®ã€‚)
contextlib¶
æ–°çš„ nullcontext() 是一个比 ExitStack 更简å�•å’Œå¿«é€Ÿçš„æ— æ“�作上下文管ç�†å™¨ã€‚ (由 Jesse-Bakker 在 bpo-10049 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº†æ–°çš„ asynccontextmanager(), AbstractAsyncContextManager å’Œ AsyncExitStack 以补充它们所对应的å�Œæ¥é¡¹ã€‚ (由 Jelle Zijlstra 在 bpo-29679 å’Œ bpo-30241 ä¸ï¼Œä»¥å�Šç”± Alexander Mohr å’Œ Ilya Kulakov 在 bpo-29302 ä¸è´¡çŒ®ã€‚)
cProfile¶
cProfile 命令行现在接å�— -m module_name 作为脚本路径的替代。 (由 Sanyam Khurana 在 bpo-21862 ä¸è´¡çŒ®ã€‚)
crypt¶
crypt 模å�—现在支æŒ� Blowfish 哈希方法。 (由 Serhiy Storchaka 在 bpo-31664 ä¸è´¡çŒ®ã€‚)
mksalt() 函数现在å…�许指定哈希æ“�作的轮数。 (由 Serhiy Storchaka 在 bpo-31702 ä¸è´¡çŒ®ã€‚)
datetime¶
æ–°çš„ datetime.fromisoformat() 方法会基于由 datetime.isoformat() 所输出的æŸ�ä¸€ç‰¹å®šæ ¼å¼�å—符串构建 datetime 对象。 (由 Paul Ganssle 在 bpo-15873 ä¸è´¡çŒ®ã€‚)
tzinfo 类现在支æŒ�å°�于一分钟的å��ç§»é‡�。 (由 Alexander Belopolsky 在 bpo-5288 ä¸è´¡çŒ®ã€‚)
dbm¶
dbm.dumb 现在支�读��读文件,并且在其未改�时��写入索引文件。
decimal¶
decimal 模å�—现在使用 上下文å�˜é‡� æ�¥å‚¨å˜å��进制值上下文。 (由 Yury Selivanov 在 bpo-32630 ä¸è´¡çŒ®ã€‚)
dis¶
dis() 函数现在能够å��汇编嵌套的代ç �对象(推导å¼�ã€�生æˆ�器表达å¼�和嵌套函数的代ç �,以å�Šç”¨äºŽæž„建嵌套类的代ç �)。 å��汇编递归的最大深度由新的 depth å½¢å�‚æ�¥æŽ§åˆ¶ã€‚ (由 Serhiy Storchaka 在 bpo-11822 ä¸è´¡çŒ®ã€‚)
distutils¶
README.rst 现在包å�«åœ¨ distutils çš„æ ‡å‡† README 列表之ä¸ï¼Œå› 而也包å�«åœ¨æº�ç �å�‘布之ä¸ã€‚ (由 Ryan Gonzalez 在 bpo-11913 ä¸è´¡çŒ®ã€‚)
enum¶
Enum å¢žåŠ äº†æ–°çš„ _ignore_ 类特å¾�属性,该属性å…�许列出ä¸�应当æˆ�为枚举æˆ�员的特å¾�属性å��称。 (由 Ethan Furman 在 bpo-31801 ä¸è´¡çŒ®ã€‚)
在 Python 3.8 ä¸ï¼Œå°�试在 Enum ç±»ä¸æ£€æŸ¥é�ž Enum 对象将引å�‘ TypeError (例如 1 in Color);类似地,å°�试在 Flag æˆ�å‘˜ä¸æ£€æŸ¥é�ž Flag 对象也将引å�‘ TypeError (例如 1 in Perm.RW);目å‰�,两ç§�æ“�作å�‡ä¼šè¿”回 False 并且已弃用。 (由 Ethan Furman 在 bpo-33217 ä¸è´¡çŒ®ã€‚)
functools¶
functools.singledispatch() 现在支æŒ�ä½¿ç”¨ç±»åž‹æ ‡æ³¨æ�¥æ³¨å†Œå®žçŽ°ã€‚ (由 Å�ukasz Langa 在 bpo-32227 ä¸è´¡çŒ®ã€‚)
gc¶
æ–°çš„ gc.freeze() 函数å…�许冻结由垃圾回收器所跟踪的所有对象,并将它们从未æ�¥çš„集å�ˆä¸æŽ’除。 è¿™å�¯ä»¥åœ¨ POSIX fork() 调用之å‰�使用以令 GC å�‹å¥½åœ°è¿›è¡Œå†™å…¥æ—¶å¤�åˆ¶æˆ–åŠ é€Ÿæ”¶é›†ã€‚ æ–°çš„ gc.unfreeze() 函数会å��è½¬æ¤æ“�作。 æ¤å¤–,gc.get_freeze_count() å�¯è¢«ç”¨äºŽèŽ·å�–冻结对象的数é‡�。 (由 Li Zekun 在 bpo-31558 ä¸è´¡çŒ®ã€‚)
hmac¶
hmac 现在具有ç»�优化的一次性 digest() 函数,其速度比 HMAC() è¦�快三å€�。 (由 Christian Heimes 在 bpo-32433 ä¸è´¡çŒ®ã€‚)
http.client¶
HTTPConnection å’Œ HTTPSConnection 现在支æŒ�æ–°çš„ blocksize å�‚数以æ��å�‡ä¸Šä¼ å�žå��é‡�。 (由 Nir Soffer 在 bpo-31945 ä¸è´¡çŒ®ã€‚)
http.server¶
SimpleHTTPRequestHandler 现在支æŒ� HTTP If-Modified-Since æ ‡å¤´ã€‚ å¦‚æžœç›®æ ‡æ–‡ä»¶åœ¨è¯¥æ ‡ç‚¹æŒ‡å®šçš„æ—¶é—´ä¹‹å�Žæœªè¢«ä¿®æ”¹åˆ™æœ�务器会返回 304 å“�应状æ€�。 (由 Pierre Quentel 在 bpo-29654 ä¸è´¡çŒ®ã€‚)
SimpleHTTPRequestHandler 接å�—æ–°çš„ directory å�‚æ•°å¹¶å¢žåŠ äº†æ–°çš„ --directory 命令行å�‚数。 通过æ¤å½¢å�‚,æœ�务器å�¯ä»¥å¯¹æœ�务指定目录,默认情况下它使用当å‰�工作目录。 (由 Stéphane Wirtel å’Œ Julien Palard 在 bpo-28707 ä¸è´¡çŒ®ã€‚)
æ–°çš„ ThreadingHTTPServer 类使用线程æ�¥å¤„ç�†ä½¿ç”¨ ThreadingMixin 的请求。 它会在 http.server 附带 -m è¿�行时被使用。 (由 Julien Palard 在 bpo-31639 ä¸è´¡çŒ®ã€‚)
idlelib 与 IDLE¶
多个对自动补全的修æ£ã€‚ (由 Louie Lu 在 bpo-15786 ä¸è´¡çŒ®ã€‚)
Module Browser (在 File è�œå�•ä¸ï¼Œä¹‹å‰�称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 (由 Guilherme Polo, Cheryl Sabella å’Œ Terry Jan Reedy 在 bpo-1612262 ä¸è´¡çŒ®ã€‚)
Settings 对è¯�框 (Options ä¸çš„ Configure IDLE) å·²ç»�被部分é‡�写以改进外观和功能。 (由 Cheryl Sabella å’Œ Terry Jan Reedy 在多个问题项ä¸è´¡çŒ®ã€‚)
å—ä½“æ ·æœ¬çŽ°åœ¨åŒ…æ‹¬ä¸€ç»„é�žæ‹‰ä¸�å—符以便用户能更好地查看所选特定å—体的效果。 (由 Terry Jan Reedy 在 bpo-13802 ä¸è´¡çŒ®ã€‚) æ ·æœ¬å�¯ä»¥è¢«ä¿®æ”¹ä»¥åŒ…括其他å—符。 (由 Serhiy Storchaka 在 bpo-31860 ä¸è´¡çŒ®ã€‚)
之å‰�以扩展形å¼�实现的 IDLE 特性已作为æ£å¸¸ç‰¹æ€§é‡�新实现。 它们的设置已从 Extensions 选项å�¡ç§»è‡³å…¶ä»–对è¯�框选项å�¡ã€‚ (由 Charles Wohlganger å’Œ Terry Jan Reedy 在 bpo-27099 ä¸å®žçŽ°ã€‚ï¼‰
编辑器代ç �上下文选项已ç»�过修改。 Box 会显示所有上下文行直到最大行数。 点击一个上下文行会使编辑器跳转到该行。 è‡ªå®šä¹‰ä¸»é¢˜çš„ä¸Šä¸‹æ–‡é¢œè‰²å·²æ·»åŠ åˆ° Settings 对è¯�框的 Highlights 选项å�¡ã€‚ (由 Cheryl Sabella å’Œ Terry Jan Reedy 在 bpo-33642, bpo-33768 å’Œ bpo-33679 ä¸è´¡çŒ®ã€‚)
在 Windows 上,会有新的 API 调用将 tk 对 DPI 的调整告知 Windows。 在 Windows 8.1+ 或 10 上,如果 Python 二进制ç �çš„ DPI 兼容属性未改å�˜ï¼Œå¹¶ä¸”监视器分辨率大于 96 DPI,这应该会令文本和线æ�¡æ›´æ¸…晰。 å�¦åˆ™çš„è¯�它应该ä¸�é€ æˆ�å½±å“�。 (由 Terry Jan Reedy 在 bpo-33656 ä¸è´¡çŒ®ã€‚)
在 3.7.1 䏿–°å¢ž:
超过 N 行(默认值为 50)的输出将被折å� 为一个按钮。 N å�¯ä»¥åœ¨ Settings 对è¯�框的 General 页的 PyShell 部分ä¸è¿›è¡Œä¿®æ”¹ã€‚ æ•°é‡�较少但是超长的行å�¯ä»¥é€šè¿‡åœ¨è¾“出上å�³å‡»æ�¥æŠ˜å� 。 被折å� 的输出å�¯é€šè¿‡å�Œå‡»æŒ‰é’®æ�¥å±•开,或是通过å�³å‡»æŒ‰é’®æ�¥æ”¾å…¥å‰ªè´´æ�¿æˆ–是å�•独的窗å�£ã€‚ (由 Tal Einat 在 bpo-1529353 ä¸è´¡çŒ®ã€‚)
上述修改已被å��å�‘ç§»æ¤�到 3.6 维护å�‘行版ä¸ã€‚
在 3.7.4 䏿–°å¢ž:
在 Run è�œå�•ä¸å¢žåŠ äº† "Run Customized" 以使用自定义设置æ�¥è¿�行模å�—。 输入的任何命令行å�‚æ•°éƒ½ä¼šè¢«åŠ å…¥ sys.argv。 它们在下次自定义è¿�行时会å†�次显示在窗体ä¸ã€‚ 用户也å�¯ä»¥ç¦�用通常的 Shell 主模å�—é‡�å�¯ã€‚ (由 Cheryl Sabella, Terry Jan Reedy ç‰äººåœ¨ bpo-5680 å’Œ bpo-37627 ä¸è´¡çŒ®ã€‚)
在 3.7.5 䏿–°å¢ž:
在 IDLE 编辑器窗å�£ä¸å¢žåŠ äº†å�¯é€‰çš„行åº�å�·ã€‚ 窗å�£æ‰“开时默认ä¸�带行åº�å�·ï¼Œé™¤é�žåœ¨é…�置对è¯�框的 General 选项å�¡ä¸è¿›è¡Œè®¾ç½®ã€‚ 已打开窗å�£ä¸çš„行åº�å�·å�¯ä»¥åœ¨ Options è�œå�•䏿˜¾ç¤ºå’Œéš�è—�。 (由 Tal Einat å’Œ Saimadhav Heblikar 在 bpo-17535 ä¸è´¡çŒ®ã€‚)
importlib¶
引入了 importlib.abc.ResourceReader ABC 以支æŒ�从包ä¸åŠ è½½èµ„æº�。 å�¦è¯·å�‚阅 importlib.resources。 (由 Barry Warsaw, Brett Cannon 在 bpo-32248 ä¸è´¡çŒ®ã€‚)
如果模å�—ç¼ºå°‘è§„æ ¼æ��è¿° importlib.reload() 现在会引å�‘ ModuleNotFoundError。 (由 Garvit Khatri 在 bpo-29851 ä¸è´¡çŒ®ã€‚)
如果指定的父模å�—ä¸�是一个包 (å�³ç¼ºå°‘ __path__ 属性) importlib.find_spec() 现在会引å�‘ ModuleNotFoundError 而é�ž AttributeError。 (由 Milan Oberkirch 在 bpo-30436 ä¸è´¡çŒ®ã€‚)
æ–°çš„ importlib.source_hash() å�¯è¢«ç”¨æ�¥è®¡ç®—ä¼ å…¥æº�的哈希值。 基于哈希值的 .pyc 文件 会嵌入æ¤å‡½æ•°æ‰€è¿”回的值。
io¶
æ–°çš„ TextIOWrapper.reconfigure() 方法å�¯ç”¨äºŽæ ¹æ�®æ–°çš„设置é‡�æ–°é…�置文本æµ�。 (由 Antoine Pitrou 在 bpo-30526 以å�Š INADA Naoki 在 bpo-15216 ä¸è´¡çŒ®ã€‚)
ipaddress¶
methods of ipaddress.IPv6Network å’Œ ipaddress.IPv4Network 䏿–°çš„ subnet_of() 以å�Š supernet_of() 方法å�¯ç”¨äºŽç½‘络包å�«æµ‹è¯•。 (由 Michel Albert å’Œ Cheryl Sabella 在 bpo-20825 ä¸è´¡çŒ®ã€‚)
itertools¶
itertools.islice() 现在接å�— 类整数对象 作为 start, stop å’Œ slice å�‚数。 (由 Will Roberts 在 bpo-30537 ä¸è´¡çŒ®ã€‚)
locale¶
locale.format_string() 䏿–°çš„ monetary å�‚æ•°å�¯ç”¨äºŽè½¬æ�¢æ‰€ä½¿ç”¨çš„å�ƒä½�分隔符和分组å—符串。 (由 Garvit 在 bpo-10379 ä¸è´¡çŒ®ã€‚)
现在 locale.getpreferredencoding() 函数在 Android 上或是在 强制 UTF-8 模� 下总是返回 'UTF-8' 。
logging¶
Logger 实例现在å�¯ä»¥è¢« pickle。 (由 Vinay Sajip 在 bpo-30520 ä¸è´¡çŒ®ã€‚)
æ–°çš„ StreamHandler.setStream() 方法å�¯ç”¨äºŽåœ¨å�¥æŸ„创建之å�Žæ›¿æ�¢æ—¥å¿—æµ�。 (由 Vinay Sajip 在 bpo-30522 ä¸åˆ›å»ºã€‚)
现在å�¯ä»¥åœ¨ä¼ 递给 logging.config.fileConfig() çš„é…�置信æ�¯ä¸å¯¹å�¥æŸ„æž„é€ å™¨æŒ‡å®šå…³é”®å—å�‚数。 (由 Preston Landers 在 bpo-31080 ä¸è´¡çŒ®ã€‚)
math¶
æ–°çš„ math.remainder() 函数实现了 IEEE 754 é£Žæ ¼çš„ä½™æ•°è¿�算。 (由 Mark Dickinson 在 bpo-29962 ä¸è´¡çŒ®ã€‚)
mimetypes¶
.bmp çš„ MIME type 从 'image/x-ms-bmp' 改为 'image/bmp'。 (由 Nitish Chandra 在 bpo-22589 ä¸è´¡çŒ®ã€‚)
msilib¶
æ–°çš„ Database.Close() 方法å�¯ç”¨äºŽå…³é— MSI æ•°æ�®åº“。 (由 Berker Peksag 在 bpo-20486 ä¸è´¡çŒ®ã€‚)
multiprocessing¶
æ–°çš„ Process.close() 方法会显å¼�地关é—进程对象并释放与其关è�”的所有资æº�。 如果底层进程ä»�在è¿�行则将引å�‘ ValueError。 (由 Antoine Pitrou 在 bpo-30596 ä¸è´¡çŒ®ã€‚)
æ–°çš„ Process.kill() 方法å�¯ç”¨äºŽåœ¨ Unix 上使用 SIGKILL ä¿¡å�·æ�¥ç»ˆæ¢è¿›ç¨‹ã€‚ (由 Vitor Pereira 在 bpo-30794 ä¸è´¡çŒ®ã€‚)
ç”± Process 所创建的é�žå®ˆæŠ¤çº¿ç¨‹çŽ°åœ¨ä¼šåœ¨è¿›ç¨‹é€€å‡ºæ—¶è¢«å�ˆå¹¶ã€‚ (由 Antoine Pitrou 在 bpo-18966 ä¸è´¡çŒ®ã€‚)
os¶
os.fwalk() 现在接å�— bytes 类型的 path å�‚数。 (由 Serhiy Storchaka 在 bpo-28682 ä¸è´¡çŒ®ã€‚)
os.scandir() 已获得对 文件æ��述器 的支æŒ�。 (由 Serhiy Storchaka 在 bpo-25996 ä¸è´¡çŒ®ã€‚)
æ–°çš„ register_at_fork() 函数å…�许注册 Python 回调以便在进程分å�‰ä¸æ‰§è¡Œã€‚ (由 Antoine Pitrou 在 bpo-16500 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† os.preadv() (结å�ˆäº† os.readv() 与 os.pread() 的功能) 以å�Š os.pwritev() 函数 (结å�ˆäº† os.writev() å’Œ os.pwrite() 的功能)。 (由 Pablo Galindo 在 bpo-31368 ä¸è´¡çŒ®ã€‚)
os.makedirs() çš„ mode å�‚æ•°ä¸�å†�会影å“�新创建的ä¸é—´å±‚级目录的æ�ƒé™�ä½�。 (由 Serhiy Storchaka 在 bpo-19930 ä¸è´¡çŒ®ã€‚)
os.dup2() 现在会返回新的文件æ��述器。 之å‰�,返回的总是 None。 (由 Benjamin Peterson 在 bpo-32441 ä¸è´¡çŒ®ã€‚)
在 Solaris å�Šå…¶æ´¾ç”Ÿç³»ç»Ÿä¸Š os.stat() 所返回的结构现在会包å�« st_fstype 属性。 (由 Jesús Cea Avión 在 bpo-32659 ä¸è´¡çŒ®ã€‚)
pathlib¶
在 POSIX 类系统上新的 Path.is_mount() 方法现在å�¯ç”¨äºŽç¡®å®šä¸€ä¸ªè·¯å¾„是å�¦ä¸ºæŒ‚载点。 (由 Cooper Ry Lees 在 bpo-30897 ä¸è´¡çŒ®ã€‚)
pdb¶
pdb.set_trace() 现在接å�—一个å�¯é€‰çš„é™�关键å—å�‚æ•° header。 如果给出,它会在调试开始之å‰�被打å�°åˆ°æŽ§åˆ¶å�°ã€‚ (由 Barry Warsaw 在 bpo-31389 ä¸è´¡çŒ®ã€‚)
pdb 命令行现在接å�— -m module_name 作为对脚本文件的替代。 (由 Mario Corchero 在 bpo-32206 ä¸è´¡çŒ®ã€‚)
py_compile¶
py_compile.compile() -- å�Šå…¶æ‰©å±•å½¢å¼� compileall -- çŽ°åœ¨ä¼šé€šè¿‡æ— æ�¡ä»¶åœ°ä¸ºåŸºäºŽå“ˆå¸Œå€¼çš„æœ‰æ•ˆæ€§éªŒè¯�创建 .pyc 文件æ�¥æ”¯æŒ� SOURCE_DATE_EPOCH 环境å�˜é‡�。 è¿™æ ·å�¯ä»¥ç¡®ä¿�当 .pyc 文件被主动创建时 å�¯é‡�现的生æˆ�。 (由 Bernhard M. Wiedemann 在 bpo-29708 ä¸è´¡çŒ®ã€‚)
pydoc¶
pydoc æœ�务器现在å�¯ä»¥ç»‘定到由新的 -n 命令行å�‚数所指定的任æ„�主机å��。 (由 Feanil Patel 在 bpo-31128 ä¸è´¡çŒ®ã€‚)
queue¶
æ–°çš„ SimpleQueue ç±»æ˜¯ä¸€ä¸ªæ— ç•Œçš„ FIFO 队列。 (由 Antoine Pitrou 在 bpo-14976 ä¸è´¡çŒ®ã€‚)
re¶
æ——æ ‡ re.ASCII, re.LOCALE å’Œ re.UNICODE å�¯ä»¥åœ¨ç»„的范围内设置。 (由 Serhiy Storchaka 在 bpo-31690 ä¸è´¡çŒ®ã€‚)
re.split() 现在支æŒ�基于匹é…�一个空å—符串的模å¼�例如 r'\b', '^$' 或 (?=-) 进行拆分。 (由 Serhiy Storchaka 在 bpo-25054 ä¸è´¡çŒ®ã€‚)
使用 re.LOCALE æ——æ ‡ç¼–è¯‘çš„æ£åˆ™è¡¨è¾¾å¼�ä¸�å†�ä¾�赖于编译时的区域设置。 区域设置仅在已编译æ£åˆ™è¡¨è¾¾å¼�被使用时æ‰�被应用。 (由 Serhiy Storchaka 在 bpo-30215 ä¸è´¡çŒ®ã€‚)
现在如果一个æ£åˆ™è¡¨è¾¾å¼�包å�«è¯ä¹‰å°†åœ¨æœªæ�¥å�‘生改å�˜çš„å—ç¬¦é›†æž„é€ ï¼Œåˆ™ä¼šå¼•å�‘ FutureWarning,例如嵌套集与集å�ˆæ“�作ç‰ã€‚ (由 Serhiy Storchaka 在 bpo-30349 ä¸è´¡çŒ®ã€‚)
已编译æ£åˆ™è¡¨è¾¾å¼�和匹é…�对象现在å�¯ä»¥ä½¿ç”¨ copy.copy() å’Œ copy.deepcopy() 进行拷è´�。 (由 Serhiy Storchaka 在 bpo-10076 ä¸è´¡çŒ®ã€‚)
signal¶
signal.set_wakeup_fd() 函数新增的 warn_on_full_buffer å�‚æ•°å�¯ä»¥æŒ‡å®šå½“唤醒缓冲区溢出时 Python 是å�¦è¦�在 stderr 上打å�°è¦å‘Šä¿¡æ�¯ã€‚ (由 Nathaniel J. Smith 在 bpo-30050 ä¸è´¡çŒ®ã€‚)
socket¶
新增的 socket.getblocking() 方法会在套接å—处于阻塞模å¼�时返回 True,å�¦åˆ™è¿”回 False。 (由 Yury Selivanov 在 bpo-32373 ä¸è´¡çŒ®ã€‚)
æ–°çš„ socket.close() 函数å�¯å…³é—æ‰€ä¼ å…¥çš„å¥—æŽ¥å—æ–‡ä»¶æ��述符。 应该用æ¤å‡½æ•°æ�¥ä»£æ›¿ os.close() 以获得更好的跨平å�°å…¼å®¹æ€§ã€‚ (由 Christian Heimes 在 bpo-32454 ä¸è´¡çŒ®ã€‚)
socket 模å�—现在会公开 socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) 以å�Š socket.TCP_NOTSENT_LOWAT (Linux 3.12) 常é‡�。 (由 Omar Sandoval 在 bpo-26273 以å�Š Nathaniel J. Smith 在 bpo-29728 ä¸è´¡çŒ®ã€‚)
å·²å¢žåŠ å¯¹ socket.AF_VSOCK 套接å—的支æŒ�以å…�许在虚拟机å�Šå…¶å®¿ä¸»æœºä¹‹é—´è¿›è¡Œé€šä¿¡ã€‚ (由 Cathy Avery 在 bpo-27584 ä¸è´¡çŒ®ã€‚)
套接å—çŽ°åœ¨é»˜è®¤ä¼šæ ¹æ�®æ–‡ä»¶æ��述符自动检测所属æ—�ã€�类型和å��议。 (由 Christian Heimes 在 bpo-28134 ä¸è´¡çŒ®ã€‚)
socketserver¶
socketserver.ThreadingMixIn.server_close() 现在会ç‰å¾…所有é�žå®ˆæŠ¤çº¿ç¨‹å®Œæˆ�。 socketserver.ForkingMixIn.server_close() 现在会ç‰å¾…所有å�进程完æˆ�。
为 socketserver.ForkingMixIn å’Œ socketserver.ThreadingMixIn ç±»å¢žåŠ äº†æ–°çš„ socketserver.ForkingMixIn.block_on_close 类属性。 该类属性值设为 False 以ä¿�æŒ� 3.7 之å‰�的行为。
sqlite3¶
现在当下层的 SQLite 库版本为 3.6.11 å�Šä»¥ä¸Šæ—¶ sqlite3.Connection 会开放 backup() 方法。 (由 Lele Gaifax 在 bpo-27645 ä¸è´¡çŒ®ã€‚)
sqlite3.connect() çš„ database å�‚数现在接å�—任何 path-like object,而ä¸�是å�ªæŽ¥å�—å—符串。 (由 Anders Lorentsen 在 bpo-31843 ä¸è´¡çŒ®ã€‚)
ssl¶
ssl 模å�—现在使用 OpenSSL 的内置 API 代替 match_hostname() æ�¥æ£€æŸ¥ä¸»æœºå��或 IP 地å�€ã€‚ 值的验è¯�会在 TLS æ�¡æ‰‹æœŸé—´è¿›è¡Œã€‚ 任何è¯�书验è¯�错误包括主机å��检查失败现在将引å�‘ SSLCertVerificationError 并使用æ£ç¡®çš„ TLS Alert 消æ�¯ä¸æ¢æ�¡æ‰‹è¿‡ç¨‹ã€‚ 这个新异常包å�«æœ‰é¢�外的信æ�¯ã€‚ 主机å��验è¯�å�¯é€šè¿‡ SSLContext.hostname_checks_common_name 进行自定义。 (由 Christian Heimes 在 bpo-31399 ä¸è´¡çŒ®ã€‚)
备注
改进的主机å��检测需è¦�有兼容 OpenSSL 1.0.2 或 1.1 çš„ libssl 实现。 å› æ¤ï¼ŒOpenSSL 0.9.8 å’Œ 1.0.1 ä¸�å†�被支æŒ�(请å�‚阅 å¹³å�°æ”¯æŒ�的移除 了解详情)。 ç›®å‰� ssl 模å�—主è¦�兼容 LibreSSL 2.7.2 å�Šæ›´é«˜ç‰ˆæœ¬ã€‚
ssl 模å�—ä¸�å†�以 SNI TLS 扩展å�‘é€� IP 地å�€ã€‚ (由 Christian Heimes 在 bpo-32185 ä¸è´¡çŒ®ã€‚)
match_hostname() ä¸�å†�支æŒ�部分通é…�符例如 www*.example.org。 (由 Mandeep Singh 在 bpo-23033 以å�Š Christian Heimes 在 bpo-31399 ä¸è´¡çŒ®ã€‚)
ssl 模å�—é»˜è®¤çš„åŠ å¯†å¥—ä»¶é€‰æ‹©çŽ°åœ¨æ˜¯ä½¿ç”¨é»‘å��å�•æ–¹å¼�而é�žç¡¬ç¼–ç �的白å��å�•。 Python ä¸�会å†�é‡�æ–°å�¯ç”¨å·²ç»�被 OpenSSL 安全更新所阻æ¢çš„åŠ å¯†ã€‚ é»˜è®¤çš„åŠ å¯†å¥—ä»¶é€‰æ‹©å�¯ä»¥åœ¨ç¼–译时进行é…�置。 (由 Christian Heimes 在 bpo-31429 ä¸è´¡çŒ®ã€‚)
现在已支æŒ�包å�«å›½é™…化域å�� (IDN) çš„æœ�务器è¯�书验è¯�。 ä½œä¸ºæ¤æ›´æ”¹çš„一部分,SSLSocket.server_hostname 属性现在会以预期的 A æ ‡ç¾å½¢å¼� ("xn--pythn-mua.org") 而ä¸�是以 U æ ‡ç¾å½¢å¼� ("pythön.org") å˜å‚¨ã€‚ (由 Nathaniel J. Smith 与 Christian Heimes 在 bpo-28414 ä¸è´¡çŒ®ã€‚)
ssl 模å�—对 TLS 1.3 å’Œ OpenSSL 1.1.1 具有åˆ�æ¥å’Œå®žéªŒæ€§çš„æ”¯æŒ�。 在 Python 3.7.0 å�‘布的时刻,OpenSSL 1.1.1 ä»�在开å�‘ä¸ï¼Œè€Œ TLS 1.3 尚未最终确定。 TLS 1.3 æ�¡æ‰‹å’Œå��议行为与 TLS 1.2 å�Šæ›´æ—©çš„版本略有差异,请å�‚阅 TLS 1.3。 (由 Christian Heimes 在 bpo-32947, bpo-20995, bpo-29136, bpo-30622 以å�Š bpo-33618 ä¸è´¡çŒ®ã€‚)
SSLSocket å’Œ SSLObject ä¸�å†�å…·æœ‰å…¬å…±æž„é€ å™¨ã€‚ 直接实例化从未æˆ�为有文档和å�—支æŒ�的特性。 实际必须通过 SSLContext 的方法 wrap_socket() å’Œ wrap_bio() æ�¥åˆ›å»ºã€‚ (由 Christian Heimes 在 bpo-32951 ä¸è´¡çŒ®ã€‚)
用于设置最å°�和最大 TLS å��议版本的 OpenSSL 1.1 API 现已å�¯ç”¨ï¼Œå��称分别为 SSLContext.minimum_version å’Œ SSLContext.maximum_version。 å�—支æŒ�çš„å��è®®ç”±å‡ ä¸ªæ–°å¢žæ——æ ‡æŒ‡å®šï¼Œä¾‹å¦‚ HAS_TLSv1_1。 (由 Christian Heimes 在 bpo-32609 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† ssl.SSLContext.post_handshake_auth 以å�¯ç”¨å¹¶é€šè¿‡ ssl.SSLSocket.verify_client_post_handshake() æ�¥åˆ�始化 TLS 1.3 æ�¡æ‰‹å�ŽéªŒè¯�。 (由 Christian Heimes 在 gh-78851 ä¸è´¡çŒ®ã€‚)
string¶
string.Template 现在å…�è®¸ä½ æœ‰é€‰æ‹©åœ°åˆ†åˆ«ä¿®æ”¹å¸¦å¤§æ‹¬å�·çš„å� ä½�符和ä¸�带大括å�·çš„å� ä½�符所对应的æ£åˆ™è¡¨è¾¾å¼�模å¼�。 (由 Barry Warsaw 在 bpo-1198569 ä¸è´¡çŒ®ã€‚)
subprocess¶
subprocess.run() 函数接å�—æ–°çš„ capture_output 关键å—å�‚数。 当其为真值时,将会æ�•获 stdout å’Œ stderr。 è¿™ç‰ä»·äºŽä¼ å…¥ subprocess.PIPE 作为 stdout å’Œ stderr å�‚数。 (由 Bo Bayles 在 bpo-32102 ä¸è´¡çŒ®ã€‚).)
subprocess.run 函数和 subprocess.Popen æž„é€ å™¨çŽ°åœ¨æŽ¥å�— text 关键å—å�‚数作为 universal_newlines 的别å��。 (由 Andrew Clegg 在 bpo-31756 ä¸è´¡çŒ®ã€‚)
在 Windows ä¸å½“é‡�定å�‘æ ‡å‡†å�¥æŸ„æ—¶ close_fds 的默认值由 False 改为 True。 现在å�¯ä»¥åœ¨é‡�定å�‘æ ‡å‡†å�¥æŸ„æ—¶å°† close_fds 设为真值。 å�‚阅 subprocess.Popen。 è¿™æ„�味ç�€çŽ°åœ¨ close_fds 在所有å�—支æŒ�的平å�°ä¸Šé»˜è®¤å€¼å�‡ä¸º True。 (由 Segev Finer 在 bpo-19764 ä¸è´¡çŒ®ã€‚)
在 subprocess.call(), subprocess.run() 期间或在 Popen 上下文管ç�†å™¨ä¸ï¼Œsubprocess 模å�—现在能更优雅地处ç�† KeyboardInterrupt。 它现在会ç‰å¾…一å°�段时间以便å�进程退出,然å�Žå†�ç»§ç»å¤„ç�† KeyboardInterrupt 异常。 (由 Gregory P. Smith 在 bpo-25942 ä¸è´¡çŒ®ã€‚)
sys¶
新增 sys.breakpointhook() é’©å�函数,供内置的 breakpoint() 进行调用。 (由 Barry Warsaw 在 bpo-31353 ä¸è´¡çŒ®ã€‚)
在 Android 䏿–°å¢žçš„ sys.getandroidapilevel() 会返回构建时的 Android API 版本。 (由 Victor Stinner 在 bpo-28740 ä¸è´¡çŒ®ã€‚)
æ–°çš„ sys.get_coroutine_origin_tracking_depth() 函数会返回当å‰�å��程的由新的 sys.set_coroutine_origin_tracking_depth() 所设定的原始跟踪深度。 asyncio 已转æ�¢ä¸ºä½¿ç”¨è¿™ä¸ªæ–° API 代替已弃用的 sys.set_coroutine_wrapper()。 (由 Nathaniel J. Smith 在 bpo-32591 ä¸è´¡çŒ®ã€‚)
time¶
PEP 564 å�‘ time 模å�—å¢žåŠ å…个具有纳秒级精度的新函数:
å¢žåŠ äº†æ–°çš„æ—¶é’Ÿæ ‡è¯†ç¬¦:
time.CLOCK_BOOTTIME(Linux): 与time.CLOCK_MONOTONIC相似,ä¸�å�Œä¹‹å¤„在于它还包括任何系统挂起的时间。time.CLOCK_PROF(FreeBSD, NetBSD å’Œ OpenBSD): 高精度的分进程 CPU 计时器。time.CLOCK_UPTIME(FreeBSD, OpenBSD): 该时间的ç»�对值是系统è¿�行且未挂起的时间,æ��供准确的æ£å¸¸è¿�行时间度é‡�。
æ–°çš„ time.thread_time() å’Œ time.thread_time_ns() 函数å�¯ç”¨äºŽèŽ·å�–æ¯�线程的 CPU 时间度é‡�。 (由 Antoine Pitrou 在 bpo-32025 ä¸è´¡çŒ®ã€‚)
æ–°çš„ time.pthread_getcpuclockid() å‡½æ•°ä¼šè¿”å›žç‰¹å®šçº¿ç¨‹ä¸ CPU 时钟的时钟 ID。
tkinter¶
æ–°çš„ tkinter.ttk.Spinbox 类现已å�¯ç”¨ã€‚ (由 Alan Moore 在 bpo-32585 ä¸è´¡çŒ®ã€‚)
tracemalloc¶
tracemalloc.Traceback 的行为更接近æ£è§„的回溯,会对所有帧按从最旧到最新æ�¥æŽ’åº�。 Traceback.format() 现在接å�—è´Ÿçš„ limit,并会将结果截çŸè‡³æŽ’在第 abs(limit) ä½�的旧帧。 如果è¦�获得旧的行为,请在 Traceback.format() ä¸ä½¿ç”¨æ–°çš„ most_recent_first å�‚数。 (由 Jesse Bakker 在 bpo-32121 ä¸è´¡çŒ®ã€‚)
types¶
æ–°çš„ WrapperDescriptorType, MethodWrapperType, MethodDescriptorType å’Œ ClassMethodDescriptorType 类现已å�¯ç”¨ã€‚ (由 Manuel Krebber å’Œ Guido van Rossum 在 bpo-29377 以å�Š Serhiy Storchaka 在 bpo-32265 ä¸è´¡çŒ®ã€‚)
æ–°çš„ types.resolve_bases() 函数会以 PEP 560 所规定的方å¼�动æ€�è§£æž� MRO æ�¡ç›®ã€‚ (由 Ivan Levkivskyi 在 bpo-32717 ä¸è´¡çŒ®ã€‚)
unicodedata¶
内部 unicodedata 数�库已�级为使用 Unicode 11。 (由 Benjamin Peterson 贡献。)
unittest¶
æ–°çš„ -k 命令行选项å…�许通过å��ç§°å�å—符串或类似于 Unix shell 的模å¼�æ�¥ç›é€‰æµ‹è¯•项。 例如,python -m unittest -k foo å°†è¿�行 foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo,但ä¸�会è¿�行 bar_tests.FooTest.test_something。 (由 Jonas Haag 在 bpo-32071 ä¸è´¡çŒ®ã€‚)
unittest.mock¶
现在 sentinel 属性会在它们被 å¤�制 或 å°�å˜ æ—¶ä¿�å˜å…¶æ ‡è¯†ã€‚ (由 Serhiy Storchaka 在 bpo-20804 ä¸è´¡çŒ®ã€‚)
æ–°çš„ seal() 函数å…�许 Mock 对实例进行密å°�,这将ç¦�æ¢è¿›ä¸€æ¥åˆ›å»ºå±žæ€§æ¨¡æ‹Ÿã€‚ 密å°�会以递归方å¼�应用于自身模拟的所有属性。 (由 Mario Corchero 在 bpo-30541 ä¸è´¡çŒ®ã€‚)
urllib.parse¶
urllib.parse.quote() å·²ç»�从 RFC 2396 更新为 RFC 3986,将 ~ æ·»åŠ åˆ°é»˜è®¤æƒ…å†µä¸‹ä»Žæœªå¼•ç”¨çš„å—符集。 (由 Christian Theune å’Œ Ratnadeep Debnath 在 bpo-16285 ä¸è´¡çŒ®ã€‚)
uu¶
uu.encode() 函数现在接å�—å�¯é€‰çš„ backtick 关键å—å�‚数。 当其为真时,零会以 '`' 而é�žç©ºæ ¼æ�¥è¡¨ç¤ºã€‚ (由 Xiang Zhang 在 bpo-30103 ä¸è´¡çŒ®ã€‚)
uuid¶
æ–°çš„ UUID.is_safe 属性会从平å�°ä¸ç»§æœ‰å…³æ˜¯å�¦ä½¿ç”¨å¤šè¿›ç¨‹å®‰å…¨æ¨¡å¼�æ�¥ç”Ÿæˆ�所需 UUID 的信æ�¯ã€‚ (由 Barry Warsaw 在 bpo-22807 ä¸è´¡çŒ®ã€‚)
uuid.getnode() 现在更倾å�‘于统一管ç�†çš„ MAC 地å�€è€Œä¸�是本地管ç�†çš„ MAC 地å�€ã€‚ è¿™æ ·å�¯ä»¥æ›´å¥½åœ°ä¿�è¯�从 uuid.uuid1() 返回的 UUID 的全局唯一性。 如果å�ªæœ‰æœ¬åœ°ç®¡ç�†çš„ MAC 地å�€å�¯ç”¨ï¼Œåˆ™è¿”回首个找到的æ¤ç±»åœ°å�€ã€‚ (由 Barry Warsaw 在 bpo-32107 ä¸è´¡çŒ®ã€‚)
warnings¶
默认è¦å‘Šè¿‡æ»¤å™¨çš„åˆ�始化已进行以下更改:
通过命令行选项(包括
-b以å�Šæ–°çš„ CPython 专属的-Xdev选项)å�¯ç”¨çš„è¦å‘Šæ€»æ˜¯ä¼šé€šè¿‡sys.warnoptionså±žæ€§è¢«ä¼ é€’ç»™è¦å‘Šæœºåˆ¶ã€‚通过命令行或环境å�˜é‡�å�¯ç”¨çš„è¦å‘Šè¿‡æ»¤å™¨çŽ°åœ¨å…·æœ‰ä»¥ä¸‹ä¼˜å…ˆé¡ºåº�:
用于
-b(或-bb) 的BytesWarning过滤器通过
-W选项指定的任何过滤器通过
PYTHONWARNINGS环境��指定的任何过滤器任何其他 CPython 专属过滤器(例如
-X dev模å¼�䏿–°å¢žçš„default过滤器)由è¦å‘Šæœºåˆ¶æ‰€å®šä¹‰çš„任何éš�å¼�过滤器
在 CPython 调试版本 ä¸ï¼ŒçŽ°åœ¨é»˜è®¤æƒ…å†µä¸‹ä¼šæ˜¾ç¤ºæ‰€æœ‰è¦å‘Šï¼ˆéš�å¼�过滤器列表为空)
(由 Nick Coghlan å’Œ Victor Stinner 在 bpo-20361, bpo-32043 以å�Š bpo-32230 ä¸è´¡çŒ®ã€‚)
在å�•文件脚本和交互å¼�æ��示符ä¸ï¼Œé»˜è®¤æƒ…况下会å†�次显示已弃用è¦å‘Šã€‚ 详情å�‚è§� PEP 565: 在 __main__ 䏿˜¾ç¤º DeprecationWarning。 (由 Nick Coghlan 在 bpo-31975 ä¸è´¡çŒ®ã€‚)
xml¶
作为对 DTD 和外部实体检查的缓解,在默认情况下 xml.dom.minidom å’Œ xml.sax 模å�—å°†ä¸�å†�处ç�†å¤–部实体。 (由 Christian Heimes 在 gh-61441 ä¸è´¡çŒ®ã€‚)
xml.etree¶
find() 方法ä¸çš„ ElementPath æ��è¿°è¯�现在å�¯ä»¥å°†å½“å‰�节点文本与 [. = "text"] 进行比较,而ä¸�仅是å�节点ä¸çš„æ–‡æœ¬ã€‚ æ��è¿°è¯�还å…�è®¸æ·»åŠ ç©ºæ ¼ä»¥æ��高å�¯è¯»æ€§ã€‚ (由 Stefan Behnel 在 bpo-31648 ä¸è´¡çŒ®ã€‚)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function 现在å�¯ä»¥è¢«ç”¨ä½œè£…饰器。 (由 Xiang Zhang 在 bpo-7769 ä¸è´¡çŒ®ã€‚)
zipapp¶
函数 create_archive() 现在接å�—å�¯é€‰çš„ filter å�‚数,以å…�è®¸ç”¨æˆ·é€‰æ‹©å“ªäº›æ–‡ä»¶åº”è¢«åŠ å…¥å½’æ¡£åŒ…ã€‚ (由 Irmen de Jong 在 bpo-31072 ä¸è´¡çŒ®ã€‚)
函数 create_archive() 现在接å�—å�¯é€‰çš„ compressed å�‚数,以生æˆ�压缩归档包。 å�¦å¤–ä¹ŸåŠ å…¥äº†å‘½ä»¤è¡Œé€‰é¡¹ --compress 以支æŒ�压缩。 (由 Zhiming Wang 在 bpo-31638 ä¸è´¡çŒ®ã€‚)
zipfile¶
ZipFile 现在接å�—æ–°çš„ compresslevel å½¢å�‚,以控制压缩级别。 (由 Bo Bayles 在 bpo-21417 ä¸è´¡çŒ®ã€‚)
ZipFile 所创建的归档包ä¸çš„å�ç›®å½•çŽ°åœ¨ä¼šæŒ‰å—æ¯�表顺åº�ä¿�å˜ã€‚ (由 Bernhard M. Wiedemann 在 bpo-30693 ä¸è´¡çŒ®ã€‚)
C API 的改�¶
已实现了用于线程本地å˜å‚¨çš„æ–° API。 相关概述请å�‚阅 PEP 539: 用于线程局部å˜å‚¨çš„æ–° C API,完整å�‚考文档请查看 线程专属å˜å‚¨ (TSS) API。 (由 Masayuki Yamamoto 在 bpo-25658 ä¸è´¡çŒ®ã€‚)
新的 上下文�� 功能开放了许多 新的 C API。
æ–°çš„ PyImport_GetModule() 函数会返回之å‰�所导入的具有给定å��称的模å�—。 (由 Eric Snow 在 bpo-28411 ä¸è´¡çŒ®ã€‚)
æ–°çš„ Py_RETURN_RICHCOMPARE å®�å�¯ä»¥ç®€åŒ–丰富比较函数的编写。 (由 Petr Victorin 在 bpo-23699 ä¸è´¡çŒ®ã€‚)
æ–°çš„ Py_UNREACHABLE å®�å�¯ç”¨äºŽæ ‡è®°ä¸�å�¯åˆ°è¾¾çš„代ç �路径。 (由 Barry Warsaw 在 bpo-31338 ä¸è´¡çŒ®ã€‚)
tracemalloc 现在通过新的 PyTraceMalloc_Track() å’Œ PyTraceMalloc_Untrack() 函数公开了一个 C API。 (由 Victor Stinner 在 bpo-30054 ä¸è´¡çŒ®ã€‚)
æ–°çš„ import__find__load__start() å’Œ import__find__load__done() é�™æ€�æ ‡è®°å�¯ç”¨äºŽè·Ÿè¸ªæ¨¡å�—导入。 (由 Christian Heimes 在 bpo-31574 ä¸è´¡çŒ®ã€‚)
结构体 PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc å’Œ wrapperbase çš„å—æ®µ name å’Œ doc 现在的类型为 const char * 而ä¸�是 char *。 (由 Serhiy Storchaka 在 bpo-28761 ä¸è´¡çŒ®ã€‚)
PyUnicode_AsUTF8AndSize() å’Œ PyUnicode_AsUTF8() 的结果类型现在是 const char * 而é�ž char *。 (由 Serhiy Storchaka 在 bpo-28769 ä¸è´¡çŒ®ã€‚)
PyMapping_Keys(), PyMapping_Values() å’Œ PyMapping_Items() 的结果现在肯定是列表,而é�žå�¯èƒ½æ˜¯åˆ—表也å�¯èƒ½æ˜¯å…ƒç»„。 (由 Oren Milman 在 bpo-28280 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†å‡½æ•° PySlice_Unpack() å’Œ PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 ä¸è´¡çŒ®ã€‚)
PyOS_AfterFork() 已弃用,建议改用新的 functions PyOS_BeforeFork(), PyOS_AfterFork_Parent() å’Œ PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 bpo-16500 ä¸è´¡çŒ®ã€‚)
曾ç»�作为公共 API 一部分的 PyExc_RecursionErrorInst å�•ä¾‹å·²è¢«ç§»é™¤ï¼Œå› ä¸ºå®ƒçš„æˆ�员永远ä¸�会被清ç�†ï¼Œå�¯èƒ½åœ¨è§£é‡Šå™¨çš„æœ€ç»ˆåŒ–过程ä¸å¯¼è‡´æ®µé”™è¯¯ã€‚ ç”± Xavier de Gaye 在 bpo-22898 å’Œ bpo-30697 ä¸è´¡çŒ®ã€‚
æ·»åŠ C API 对使用 timezone çš„æž„é€ å™¨ PyTimeZone_FromOffset() å’Œ PyTimeZone_FromOffsetAndName() 的时区的支æŒ�,以å�Šé€šå¸¸ PyDateTime_TimeZone_UTC 使用 UTC å�•例。 ç”± Paul Ganssle 在 bpo-10381 ä¸è´¡çŒ®ã€‚
PyThread_start_new_thread() å’Œ PyThread_get_thread_ident() 的结果类型以å�Š PyThreadState_SetAsyncExc() çš„ id å½¢å�‚类型由 long 改为 unsigned long。 (由 Serhiy Storchaka 在 bpo-6532 ä¸è´¡çŒ®ã€‚)
现在 PyUnicode_AsWideCharString() 在第二个å�‚数为 NULL 且 wchar_t* å—符串包å�«ç©ºå—符时会引å�‘ ValueError。 (由 Serhiy Storchaka 在 bpo-30708 ä¸è´¡çŒ®ã€‚)
对å�¯åŠ¨é¡ºåº�以å�ŠåЍæ€�内å˜åˆ†é…�器管ç�†çš„æ›´æ”¹æ„�味ç�€æ—©å·²è®°å½•在案的,对在调用大多数 C API 函数之å‰�调用 Py_Initialize() çš„è¦�求的ä¾�赖现在å�˜å¾—æ›´åŠ å¼ºçƒˆï¼Œæœªé�µå¾ªæ¤è¦�求å�¯èƒ½å¯¼è‡´åµŒå…¥å¼�应用程åº�ä¸çš„æ®µé”™è¯¯ã€‚ 请å�‚é˜…æ¤æ–‡æ¡£çš„ ç§»æ¤�到 Python 3.7 一节以å�Š C API 文档的 在Pythonåˆ�始化之å‰� 一节了解更多细节。
æ–°çš„ PyInterpreterState_GetID() 会返回给定解释器的唯一 ID。 (由 Eric Snow 在 bpo-29102 ä¸è´¡çŒ®ã€‚)
现在当å�¯ç”¨ UTF-8 模å¼� æ—¶ Py_DecodeLocale(), Py_EncodeLocale() 会使用 UTF-8 ç¼–ç �。 (由 Victor Stinner 在 bpo-29240 ä¸è´¡çŒ®ã€‚)
PyUnicode_DecodeLocaleAndSize() å’Œ PyUnicode_EncodeLocale() 现在会为 surrogateescape 错误å�¥æŸ„使用当å‰�区域编ç �。 (由 Victor Stinner 在 bpo-29240 ä¸è´¡çŒ®ã€‚)
PyUnicode_FindChar() çš„ start å’Œ end å½¢å�‚的行为现在调整为与å—符串切片类似。 (由 Xiang Zhang 在 bpo-28822 ä¸è´¡çŒ®ã€‚)
构建的改�¶
对于 --without-threads 构建的支æŒ�已被移除。 threading 模å�—现在将总是å�¯ç”¨ã€‚ (由 Antoine Pitrou 在 bpo-31370 ä¸è´¡çŒ®ã€‚)
在é�ž OSX UNIX å¹³å�°ä¸Šå·²ä¸�å†�包å�«ç”¨äºŽæž„建 _ctypes 模å�—的完整 libffi 副本。 现在当在æ¤ç±»å¹³å�°ä¸Šæž„建 _ctypes 时需è¦�事先装有 libffi 的副本。 (由 Zachary Ware 在 bpo-27979 ä¸è´¡çŒ®ã€‚)
Windows 构建过程ä¸�å†�ä¾�èµ– Subversion æ�¥æ‹‰å�–外部æº�ç �,而是改用一段 Python 脚本从 GitHub 下载 zip 文件。 å¦‚æžœæœªåœ¨ç³»ç»Ÿä¸æ‰¾åˆ° Python 3.6 (通过 py -3.6),则会使用 NuGet 下载一份 32 ä½�çš„ Python 副本用于æ¤ç›®çš„。 (由 Zachary Ware 在 bpo-30450 ä¸è´¡çŒ®ã€‚)
ssl 模å�—需è¦�兼容 OpenSSL 1.0.2 或 1.1 çš„ libssl。 OpenSSL 1.0.1 的生命期已于 2016-12-31 终æ¢ä¸”ä¸�å†�å�—支æŒ�。 LibreSSL 暂时也ä¸�å�—支æŒ�。 LibreSSL å�‘布版直到 2.6.4 版还缺少所需的 OpenSSL 1.0.2 API。
性能优化¶
通过移æ¤�更多代ç �æ�¥ä½¿ç”¨ METH_FASTCALL 的约定,å�¯ä»¥æ˜¾è‘—地å‡�少调用 C 代ç �ä¸å®žçŽ°çš„å�„ç±»æ ‡å‡†åº“çš„å¾ˆå¤šæ–¹æ³•çš„å¼€é”€ã€‚ (由 Victor Stinner 在 bpo-29300ã€�bpo-29507ã€�bpo-29452 以å�Š bpo-29286 ä¸è´¡çŒ®ã€‚)
通过å�„ç§�优化方å¼�,使 Python 在 Linux 上的å�¯åŠ¨æ—¶é—´ç¼©çŸäº† 10%,在 macOS 上缩çŸäº† 30%。 (由 Victor Stinner, INADA Naoki 在 bpo-29585 ä¸ï¼Œä»¥å�Š Ivan Levkivskyi 在 bpo-31333 ä¸è´¡çŒ®ã€‚)
由于é�¿å…�创建绑定方法案例的å—节ç �æ›´æ”¹ï¼Œæ–¹æ³•è°ƒç”¨é€Ÿåº¦çŽ°åœ¨åŠ å¿«äº† 20%。 (由 Yury Selivanov å’Œ INADA Naoki 在 bpo-26110 ä¸è´¡çŒ®ã€‚)
对 asyncio 模�里�的一些常用函数�了显著的性能优化。
asyncio.get_event_loop()函数已ç»�改用 C é‡�æ–°å®žçŽ°ï¼Œä½¿å…¶æ‰§è¡Œé€Ÿåº¦åŠ å¿«äº† 15 å€�。 (由 Yury Selivanov 在 bpo-32296 ä¸è´¡çŒ®ã€‚)asyncio.Future回调管ç�†å·²ç»�过优化。 (由 Yury Selivanov 在 bpo-32348 ä¸è´¡çŒ®ã€‚)asyncio.gather()çš„æ‰§è¡Œé€Ÿåº¦çŽ°åœ¨åŠ å¿«äº† 15%。 (由 Yury Selivanov 在 bpo-32355 ä¸è´¡çŒ®ã€‚)当 delay å�‚数为零或负值时
asyncio.sleep()çš„æ‰§è¡Œé€Ÿåº¦çŽ°åœ¨åŠ å¿«äº† 2 å€�。 (由 Andrew Svetlov 在 bpo-32351 ä¸è´¡çŒ®ã€‚)asyncio 调试模å¼�的执行开销已获å‡�轻。 (由 Antoine Pitrou 在 bpo-31970 ä¸è´¡çŒ®ã€‚)
作为 PEP 560 工作 的结果,typing 的导入时间已å‡�少了 7 å€�,许多与类型相关的æ“�作现在会执行得更快。 (由 Ivan Levkivskyi 在 bpo-32226 ä¸è´¡çŒ®ã€‚)
sorted() å’Œ list.sort() å·²ç»�过优化,在通常情况下执行速度å�¯æ��å�‡ 40-75%。 (由 Elliot Gorokhovsky 在 bpo-28685 ä¸è´¡çŒ®ã€‚)
dict.copy() çš„æ‰§è¡Œé€Ÿåº¦çŽ°åœ¨åŠ å¿«äº† 5.5 å€�。 (由 Yury Selivanov 在 bpo-31179 ä¸è´¡çŒ®ã€‚)
当 name 未找到并且 obj 未é‡�è½½ object.__getattr__() 或 object.__getattribute__() æ—¶ hasattr() å’Œ getattr() 现在会比原æ�¥å¿«å¤§çº¦ 4 å€�。 (由 INADA Naoki 在 bpo-32544 ä¸è´¡çŒ®ã€‚)
在å—ç¬¦ä¸²ä¸æ�œç´¢ç‰¹å®šçš„ Unicode å—符(例如乌克兰è¯å—æ¯�“Єâ€�)会比æ�œç´¢å…¶ä»–å—符慢上 25 å€�。 而现在最å��情况下也å�ªä¼šæ…¢ä¸Š 3 å€�。 (由 Serhiy Storchaka 在 bpo-24821 ä¸è´¡çŒ®ã€‚)
collections.namedtuple() 工厂对象已ç»�é‡�写实现,使得创建具å��å…ƒç»„çš„é€Ÿåº¦åŠ å¿«äº† 4 到 6 å€�。 (由 Jelle Zijlstra 在 bpo-28638 ä¸è´¡çŒ®ï¼Œè¿›ä¸€æ¥çš„æ”¹è¿›ç”± INADA Naoki, Serhiy Storchaka å’Œ Raymond Hettinger 贡献。)
现在 date.fromordinal() å’Œ date.fromtimestamp() 在通常情况下执行速度å�¯æ��å�‡ 30%。 (由 Paul Ganssle 在 bpo-32403 ä¸è´¡çŒ®ã€‚)
由于使用了 os.scandir(),现在 os.fwalk() 函数执行速度æ��å�‡äº† 2 å€�。 (由 Serhiy Storchaka 在 bpo-25996 ä¸è´¡çŒ®ã€‚)
由于使用了 os.scandir() 函数,shutil.rmtree() 函数的执行速度已ç»�æ��å�‡äº† 20--40%。 (由 Serhiy Storchaka 在 bpo-28564 ä¸è´¡çŒ®ã€‚)
æ£åˆ™è¡¨è¾¾å¼� 忽略大å°�写的匹é…�å’Œæ�œç´¢å·²èŽ·å¾—ä¼˜åŒ–ã€‚ 现在æ�œç´¢æŸ�些模å¼�的速度æ��å�‡äº† 20 å€�。 (由 Serhiy Storchaka 在 bpo-30285 ä¸è´¡çŒ®ã€‚)
re.compile() 现在会将 flags å½¢å�‚转æ�¢ä¸º int 对象,如果它是 RegexFlag çš„è¯�。 它现在会和 Python 3.5 ä¸€æ ·å¿«ï¼Œè€Œæ¯” Python 3.6 快大约 10%,实际速度å�–决于具体的模å¼�。 (由 INADA Naoki 在 bpo-31671 ä¸è´¡çŒ®ã€‚)
selectors.EpollSelector, selectors.PollSelector å’Œ selectors.DevpollSelector è¿™å‡ ä¸ªç±»çš„ modify() 方法在é‡�负载下å�¯ä»¥åŠ å¿« 10% å·¦å�³ã€‚ (由 Giampaolo Rodola' 在 bpo-30014 ä¸è´¡çŒ®ã€‚)
常é‡�折å� å·²ç»�从窥å”优化器è¿�移至新的 AST 优化器,å�Žè€…å�¯ä»¥ä»¥æ›´é«˜çš„一致性æ�¥æ‰§è¡Œä¼˜åŒ–。 (由 Eugene Toder å’Œ INADA Naoki 在 bpo-29469 å’Œ bpo-11549 ä¸è´¡çŒ®ã€‚)
abc ä¸çš„大部分函数和方法已ç»�用 C é‡�写。 这使得创建抽åƒ�基类以å�Šè°ƒç”¨å…¶ isinstance() å’Œ issubclass() çš„é€Ÿåº¦åŠ å¿«äº† 1.5 å€�。 这也使得 Python å�¯åŠ¨è€—æ—¶å‡�少了 10%。 (由 Ivan Levkivskyi å’Œ INADA Naoki 在 bpo-31333 ä¸è´¡çŒ®ã€‚)
在ä¸�æž„é€ å�ç±»æ—¶ï¼Œé€šè¿‡ä½¿ç”¨å¿«é€Ÿè·¯å¾„æž„é€ å™¨ä½¿å¾— datetime.date å’Œ datetime.datetime çš„æ›¿ä»£æž„é€ å™¨èŽ·å¾—äº†æ˜¾è‘—çš„é€Ÿåº¦æ��å�‡ã€‚ (由 Paul Ganssle 在 bpo-32403 ä¸è´¡çŒ®ã€‚)
在特定情况下 array.array 实例的比较速度已获得很大æ��å�‡ã€‚ çŽ°åœ¨å½“æ¯”è¾ƒå˜æ”¾ç›¸å�Œçš„æ•´æ•°ç±»åž‹çš„值的数组时会比原æ�¥å¿« 10 到 70 å€�。 (由 Adrian Wielgosik 在 bpo-24700 ä¸è´¡çŒ®ã€‚)
在大多数平å�°ä¸Š math.erf() å’Œ math.erfc() 函数现在使用(更快的)C 库实现。 (由 Serhiy Storchaka 在 bpo-26121 ä¸è´¡çŒ®ã€‚)
其他 CPython 实现的改�¶
跟踪钩å�现在å�¯ä»¥é€‰æ‹©ä¸�接收
line而选择从解释器接收opcode事件,具体å�šæ³•æ˜¯åœ¨è¢«è·Ÿè¸ªçš„å¸§ä¸Šç›¸åº”åœ°è®¾ç½®æ–°çš„f_trace_lineså’Œf_trace_opcodes属性。 (由 Nick Coghlan 在 bpo-31344 ä¸è´¡çŒ®ã€‚)修å¤�了一些命å��空间包模å�—属性的一致性问题。 命å��空间模å�—对象的
__file__被设置为None(原先未设置),对象的__spec__.origin也被设置为None(之å‰�为å—符串"namespace")。 å�‚è§� bpo-32305。 而且,命å��空间模å�—对象的__spec__.loader被设置的值与__loader__相å�Œ (原先å‰�者被设置为None)。 å�‚è§� bpo-32303。locals()å—典现在以å�˜é‡�定义的è¯�法顺åº�显示。 原先未定义顺åº�。 (由 Raymond Hettinger 在 bpo-32690 ä¸è´¡çŒ®ã€‚)distutilsupload命令ä¸�会å†�试图将行结æ�Ÿç¬¦ CR 改为 CRLF。 这修å¤�了 sdists 的一个以与 CR ç‰ä»·çš„å—节结æ�Ÿçš„æ•°æ�®æ�Ÿå��问题。 (由 Bo Bayles 在 bpo-32304 ä¸è´¡çŒ®ã€‚)
已弃用的 Python 行为¶
在推导å¼�和生æˆ�器表达å¼�ä¸çš„ yield è¯å�¥ï¼ˆåŒ…括 yield å’Œ yield from å�å�¥ï¼‰çŽ°åœ¨å·²å¼ƒç”¨ï¼ˆæœ€å·¦ç«¯çš„ for å�å�¥ä¸çš„å�¯è¿ä»£å¯¹è±¡è¡¨è¾¾å¼�除外)。 这确ä¿�了推导å¼�总是立å�³è¿”回适当类型的容器(而ä¸�是有å�¯èƒ½è¿”回 generator iterator å¯¹è±¡ï¼‰ï¼Œè¿™æ ·ç”Ÿæˆ�器表达å¼�ä¸�会试图将它们的éš�å¼�输出与任何æ�¥è‡ªæ˜¾å¼� yield 表达å¼�的输出交错起æ�¥ã€‚ 在 Python 3.7 ä¸ï¼Œè¿™æ ·çš„表达å¼�会在编译时引å�‘ DeprecationWarning,在 Python 3.8 ä¸åˆ™å°†å¼•å�‘ SyntaxError。 (由 Serhiy Storchaka 在 bpo-10544 ä¸è´¡çŒ®ã€‚)
从 object.__complex__() 返回一个 complex çš„å�类的行为已弃用并将在未æ�¥çš„ Python 版本ä¸å¼•å�‘错误。 这使得 __complex__() 的行为与 object.__int__() å’Œ object.__float__() ä¿�æŒ�一致。 (由 Serhiy Storchaka 在 bpo-28894 ä¸è´¡çŒ®ã€‚)
已弃用的 Python 模��函数和方法¶
aifc¶
aifc.openfp() 已弃用并将在 Python 3.9 ä¸è¢«ç§»é™¤ã€‚ 请改用 aifc.open()。 (由 Brian Curtin 在 bpo-31985 ä¸è´¡çŒ®ã€‚)
asyncio¶
对 asyncio.Lock 和其他 asyncio å�Œæ¥åŽŸè¯çš„ await 实例的直接支æŒ�已弃用。 想è¦�获å�–并释放å�Œæ¥èµ„æº�必须使用异æ¥ä¸Šä¸‹æ–‡ç®¡ç�†å™¨ã€‚ (由 Andrew Svetlov 在 bpo-32253 ä¸è´¡çŒ®ã€‚)
asyncio.Task.current_task() å’Œ asyncio.Task.all_tasks() 方法已弃用。 (由 Andrew Svetlov 在 bpo-32250 ä¸è´¡çŒ®ã€‚)
collections¶
在 Python 3.8 ä¸ï¼Œcollections.abc 内的抽象基类将ä¸�会å†�通过常规的 collections 模å�—公开。 这有助于更清晰地区别具体类与抽象基类。 (由 Serhiy Storchaka 在 bpo-25988 ä¸è´¡çŒ®ã€‚)
dbm¶
dbm.dumb 现在支æŒ�读å�–å�ªè¯»æ–‡ä»¶ï¼Œä¸”当其未被更改时ä¸�会å†�写入索引文件。 现在如果索引文件丢失并在 'r' 与 'w' 模å¼�下被é‡�新创建,则会å�‘出已弃用è¦å‘Šï¼ˆåœ¨æœªæ�¥çš„ Python å�‘布版ä¸å°†æ”¹ä¸ºé”™è¯¯ï¼‰ã€‚ (由 Serhiy Storchaka 在 bpo-28847 ä¸è´¡çŒ®ã€‚)
enum¶
在 Python 3.8 ä¸ï¼Œå°�试在 Enum ç±»ä¸æ£€æŸ¥é�ž Enum 对象将引å�‘ TypeError (例如 1 in Color);类似地,å°�试在 Flag æˆ�å‘˜ä¸æ£€æŸ¥é�ž Flag 对象也将引å�‘ TypeError (例如 1 in Perm.RW);目å‰�,两ç§�æ“�作å�‡ä¼šè¿”回 False。 (由 Ethan Furman 在 bpo-33217 ä¸è´¡çŒ®ã€‚)
gettext¶
使用é�žæ•´æ•°å€¼åœ¨ gettext ä¸é€‰æ‹©å¤�æ•°å½¢å¼�现在已弃用。 它从未æ£ç¡®åœ°å�‘挥作用。 (由 Serhiy Storchaka 在 bpo-28692 ä¸è´¡çŒ®ã€‚)
importlib¶
方法 MetaPathFinder.find_module() (被 MetaPathFinder.find_spec() 替代) å’Œ PathEntryFinder.find_loader() (被 PathEntryFinder.find_spec() 替代) 都已在 Python 3.4 ä¸è¢«å¼ƒç”¨ï¼ŒçŽ°åœ¨ä¼šå�‘出 DeprecationWarning。 (由 Matthias Bussonnier 在 bpo-29576 ä¸è´¡çŒ®ã€‚)
importlib.abc.ResourceLoader ABC 已弃用,推�改用 importlib.abc.ResourceReader。
locale¶
locale.format() 已弃用,请改用 locale.format_string()。 (由 Garvit 在 bpo-10379 ä¸è´¡çŒ®ã€‚)
macpath¶
macpath 现在已弃用,将在 Python 3.8 ä¸è¢«ç§»é™¤ã€‚ (由 Chi Hsuan Yen 在 bpo-9850 ä¸è´¡çŒ®ã€‚)
threading¶
dummy_threading å’Œ _dummy_thread 已弃用。 构建ç¦�用线程的 Python å·²ä¸�å†�å�¯èƒ½ã€‚ 请改用 threading。 (由 Antoine Pitrou 在 bpo-31370 ä¸è´¡çŒ®ã€‚)
socket¶
socket.htons() å’Œ socket.ntohs() ä¸çš„é�™é»˜å�‚数截æ–已弃用。 在未æ�¥çš„ Python 版本ä¸ï¼Œå¦‚æžœä¼ å…¥çš„å�‚数长度大于 16 比特ä½�,将会引å�‘异常。 (由 Oren Milman 在 bpo-28332 ä¸è´¡çŒ®ã€‚)
ssl¶
ssl.wrap_socket() 已弃用。 请改用 ssl.SSLContext.wrap_socket()。 (由 Christian Heimes 在 bpo-28124 ä¸è´¡çŒ®ã€‚)
sunau¶
sunau.openfp() 已弃用并将在 Python 3.9 ä¸è¢«ç§»é™¤ã€‚ 请改用 sunau.open()。 (由 Brian Curtin 在 bpo-31985 ä¸è´¡çŒ®ã€‚)
sys¶
已弃用 sys.set_coroutine_wrapper() 和 sys.get_coroutine_wrapper()。
未写入文档的 sys.callstats() 函数已弃用并将在未æ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ã€‚ (由 Victor Stinner 在 bpo-28799 ä¸è´¡çŒ®ã€‚)
wave¶
wave.openfp() 已弃用并将在 Python 3.9 ä¸è¢«ç§»é™¤ã€‚ 请改用 wave.open()。 (由 Brian Curtin 在 bpo-31985 ä¸è´¡çŒ®ã€‚)
已弃用的 C API 函数和类型¶
如果 Py_LIMITED_API 未设定或设定为范围在 0x03050400 å’Œ 0x03060000 (ä¸�å�«) 之间,或为 0x03060100 或更高的值,函数 PySlice_GetIndicesEx() 已弃用并被一个å®�所替代。 (由 Serhiy Storchaka 在 bpo-27867 ä¸è´¡çŒ®ã€‚)
PyOS_AfterFork() 已弃用。 请改用 PyOS_BeforeFork(), PyOS_AfterFork_Parent() 或 PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 bpo-16500 ä¸è´¡çŒ®ã€‚)
平�支�的移除¶
官方已��支� FreeBSD 9 �更旧的版本。
为了完整的 Unicode 支�,包括在扩展模�之内,*nix 平�现在至少应当�供
C.UTF-8(完整区域),C.utf8(完整区域) 或UTF-8(LC_CTYPE专属区域) ä¸çš„一个作为基于ASCIIçš„ä¼ ç»ŸC区域的替代。OpenSSL 0.9.8 å’Œ 1.0.1 å·²ä¸�å†�å�—支æŒ�,这æ„�味ç�€åœ¨ä»�然使用这些版本的旧平å�°ä¸Šæž„建带有 SSL/TLS 支æŒ�çš„ CPython 3.7 时,需è¦�自定义构建选项以链接到更新的 OpenSSL 版本。
注æ„�,æ¤é—®é¢˜ä¼šå½±å“�到 Debian 8 (代å�·â€œjessieâ€�) å’Œ Ubuntu 14.04 (代å�·â€œTrustyâ€�) ç‰é•¿æœŸæ”¯æŒ� Linux å�‘è¡Œç‰ˆï¼Œå› ä¸ºå®ƒä»¬é»˜è®¤ä»�然使用 OpenSSL 1.0.1。
Debian 9 (“stretchâ€�) å’Œ Ubuntu 16.04 (“xenialâ€�) 以å�Šå…¶ä»–最新的长期支æŒ� Linux å�‘行版 (例如 RHEL/CentOS 7.5, SLES 12-SP3) 都使用 OpenSSL 1.0.2 æˆ–æ›´æ–°çš„ç‰ˆæœ¬ï¼Œå› æ¤ç»§ç»åœ¨é»˜è®¤çš„æž„建é…�ç½®ä¸å�—到支æŒ�。
CPython 自己的 CI é…�置文件 æ��供了一个使用 CPython 测试套件ä¸çš„ SSL 兼容性测试架构 基于 OpenSSL 1.1.0 而é�žç³»ç»Ÿæ‰€æ��供的过时 OpenSSL 进行构建和链接的例å�。
API 与特性的移除¶
下列特性与 API 已从 Python 3.7 ä¸ç§»é™¤:
os.stat_float_times()函数已被移除。 它在 Python 2.3 ä¸è¢«å¼•入用于å�‘下兼容 Python 2.2,并自 Python 3.1 起就已弃用。在
re.sub()的替æ�¢æ¨¡å�—ä¸ç”±'\'与一个 ASCII å—æ¯�æž„æˆ�的未知转义在 Python 3.5 ä¸å·²å¼ƒç”¨ï¼ŒçŽ°åœ¨å°†ä¼šå¼•å�‘错误。在
tarfile.TarFile.add()ä¸ç§»é™¤äº†å¯¹ exclude å�‚数的支æŒ�。 它在 Python 2.7 å’Œ 3.2 ä¸å·²å¼ƒç”¨ã€‚ 请改用 filter å�‚数。ntpath.splitunc()函数在 Python 3.1 ä¸è¢«å¼ƒç”¨ï¼ŒçŽ°åœ¨å·²è¢«ç§»é™¤ã€‚ 请改用splitdrive()。collections.namedtuple()ä¸�å†�支æŒ� verbose å½¢å�‚或_source属性,该属性会显示为具å��元组类所生æˆ�çš„æº�代ç �。 è¿™æ˜¯åŠ é€Ÿç±»åˆ›å»ºçš„è®¾è®¡ä¼˜åŒ–çš„ä¸€éƒ¨åˆ†ã€‚ (由 Jelle Zijlstra 在 bpo-28638 ä¸è´¡çŒ®ï¼Œè¿›ä¸€æ¥çš„æ”¹è¿›ç”± INADA Naoki, Serhiy Storchaka å’Œ Raymond Hettinger 贡献。)函数
bool(),float(),list()å’Œtuple()ä¸�å†�接å�—关键å—å�‚数。int()的第一个å�‚数现在å�ªèƒ½ä½œä¸ºä½�ç½®å�‚æ•°ä¼ å…¥ã€‚ç§»é™¤äº†ä¹‹å‰�在 Python 2.4 ä¸å·²å¼ƒç”¨çš„
plistlib模å�—的类Plist,Dictå’Œ_InternalDict。 作为函数readPlist()å’ŒreadPlistFromBytes()返回结果的 Dict 值现在为普通 dict。 ä½ ä¸�能å†�使用属性访问æ�¥èŽ·å�–这些å—典的项。asyncio.windows_utils.socketpair()函数已被移除。 请改用socket.socketpair()函数,它自 Python 3.5 起就在所有平å�°ä¸Šå�¯ç”¨ã€‚asyncio.windows_utils.socketpair在 Python 3.5 å�Šæ›´æ–°ç‰ˆæœ¬ä¸Šå�ªæ˜¯socket.socketpair的别å��。asyncioä¸�å†�å°†selectorså’Œ_overlapped模å�—导出为asyncio.selectorså’Œasyncio._overlapped。 请将from asyncio import selectors替æ�¢ä¸ºimport selectors。现在已ç¦�æ¢ç›´æŽ¥å®žä¾‹åŒ–
ssl.SSLSocketå’Œssl.SSLObject对象。 ç›¸åº”æž„é€ å™¨ä»Žæœªå†™å…¥æ–‡æ¡£ã€�ä¹Ÿä»Žæœªä½œä¸ºå…¬æœ‰æž„é€ å™¨è¿›è¡Œæµ‹è¯•æˆ–è®¾è®¡ã€‚ 用户应当使用ssl.wrap_socket()或ssl.SSLContext。 (由 Christian Heimes 在 bpo-32951 ä¸è´¡çŒ®ã€‚)未被使用的
distutilsinstall_misc命令已被移除。 (由 Eric N. Vander Weele 在 bpo-29218 ä¸è´¡çŒ®ã€‚)
移除的模�¶
fpectl 模å�—已被移除。 它从未被默认å�¯ç”¨ï¼Œä»Žæœªåœ¨ x86-64 上æ£ç¡®å�‘挥效果,并且它对 Python ABI 的改å�˜ä¼šå¯¼è‡´ C 扩展的æ„�外æ�Ÿå��。 (由 Nathaniel J. Smith 在 bpo-29137 ä¸è´¡çŒ®ã€‚)
Windows 专属的改�¶
Python å�¯åŠ¨å™¨ï¼ˆpy.exe)å�¯ä»¥æŽ¥å�— 32 ä½�或 64 ä½�æ ‡è®°è€Œ ä¸�å¿… å�Œæ—¶æŒ‡å®šä¸€ä¸ªå°�版本。 å› æ¤ py -3-32 å’Œ py -3-64 与 py -3.7-32 å�‡ä¸ºæœ‰æ•ˆï¼Œå¹¶ä¸”现在还接å�— -m-64 å’Œ -m.n-64 æ�¥å¼ºåˆ¶ä½¿ç”¨ 64 ä½� python 命令,å�³ä½¿æ˜¯æœ¬åº”使用 32 ä½�的时候。 如果指定版本ä¸�å�¯ç”¨åˆ™ py.exe 将报错退出。 (由 Steve Barnes 在 bpo-30291 ä¸è´¡çŒ®ã€‚)
å�¯åЍ噍å�¯ä»¥è¿�行 py -0 æ�¥åˆ—出已安装的所有 python,默认版本会以星å�·æ ‡å‡ºã€‚ è¿�行 py -0p å°†å�Œæ—¶åˆ—出相应的路径。 如果è¿�行 py æ—¶æŒ‡å®šäº†æ— æ³•åŒ¹é…�的版本,它将显示 简çŸå½¢å¼� çš„å�¯ç”¨ç‰ˆæœ¬åˆ—表。 (由 Steve Barnes 在 bpo-30362 ä¸è´¡çŒ®ã€‚)
移�到 Python 3.7¶
本节列出了先å‰�æ��述的更改以å�Šå�¯èƒ½éœ€è¦�更改代ç �的其他错误修æ£.
Python 行为的更改¶
asyncå’Œawait现在是ä¿�留关键å—。 使用了这些å��ç§°ä½œä¸ºæ ‡è¯†ç¬¦çš„ä»£ç �现在将引å�‘SyntaxError。 (由 Jelle Zijlstra 在 bpo-30406 ä¸è´¡çŒ®ã€‚)PEP 479 在 Python 3.7 ä¸å¯¹æ‰€æœ‰ä»£ç �å�¯ç”¨ï¼Œåœ¨å��程和生æˆ�器ä¸ç›´æŽ¥æˆ–间接引å�‘çš„
StopIteration异常会被转æ�¢ä¸ºRuntimeError异常。 (由 Yury Selivanov 在 bpo-32670 ä¸è´¡çŒ®ã€‚)object.__aiter__()方法ä¸�å†�能被声明为异æ¥çš„。 (由 Yury Selivanov 在 bpo-31709 ä¸è´¡çŒ®ã€‚)由于一个ç–�忽,之å‰�çš„ Python 版本会错误地接å�—ä»¥ä¸‹è¯æ³•:
f(1 for x in [1],) class C(1 for x in [1]): pass
现在 Python 3.7 会æ£ç¡®åœ°å¼•å�‘
SyntaxErrorï¼Œå› ä¸ºç”Ÿæˆ�器表达å¼�总是必须直接包å�«äºŽä¸€å¯¹æ‹¬å�·ä¹‹å†…, 且å‰�å�Žéƒ½ä¸�能有逗å�·ï¼Œä»…在调用时å�¯ä»¥å¿½ç•¥é‡�å¤�的括å�·ã€‚ (由 Serhiy Storchaka 在 bpo-32012 å’Œ bpo-32023 ä¸è´¡çŒ®ã€‚)现在当使用
-m开关时,会将åˆ�å§‹å·¥ä½œç›®å½•æ·»åŠ åˆ°sys.path,而ä¸�å†�是一个空å—符串(å�³åœ¨æ¯�次导入时动æ€�地指明当å‰�工作目录)。 任何会检测该空å—符串,或是以其他方å¼�ä¾�赖之å‰�行为的的程åº�将需è¦�进行相应的更新(例如改为还è¦�检测os.getcwd()或os.path.dirname(__main__.__file__),具体å�šæ³•é¦–å…ˆè¦�å�–决于为何è¦�对代ç �执行空å—符串检测)。
Python API 的�化¶
socketserver.ThreadingMixIn.server_close()现在会ç‰å¾…所有é�žå®ˆæŠ¤çº¿ç¨‹å®Œæˆ�。 将新增的socketserver.ThreadingMixIn.block_on_close类属性设为Falseå�¯èŽ·å¾— 3.7 之å‰�版本的行为。 (由 Victor Stinner 在 bpo-31233 å’Œ bpo-33540 ä¸è´¡çŒ®ã€‚)socketserver.ForkingMixIn.server_close()现在会ç‰ç‰æ‰€æœ‰å�进程完æˆ�。 将新增的socketserver.ForkingMixIn.block_on_close类属性设为Falseå�¯èŽ·å¾— 3.7 之å‰�版本的行为。 (由 Victor Stinner 在 bpo-31151 å’Œ bpo-33540 ä¸è´¡çŒ®ã€‚)æŸ�些情况下
locale.localeconv()函数现在会临时将LC_CTYPE区域设置为LC_NUMERIC的值。 (由 Victor Stinner 在 bpo-31900 ä¸è´¡çŒ®ã€‚)如果 path 为å—符串
pkgutil.walk_packages()现在会引å�‘ValueError。 之å‰�则是返回一个空列表。 (由 Sanyam Khurana 在 bpo-24744 ä¸è´¡çŒ®ã€‚)string.Formatter.format()çš„æ ¼å¼�å—符串å�‚数现在为 ä»…é™�ä½�ç½® å�‚数。 将其作为关键å—å�‚æ•°ä¼ å…¥çš„æ–¹å¼�自 Python 3.5 起已弃用。 (由 Serhiy Storchaka 在 bpo-29193 ä¸è´¡çŒ®ã€‚)类
http.cookies.Morsel的属性key,valueå’Œcoded_value现在å�‡ä¸ºå�ªè¯»ã€‚ 对其赋值的æ“�作自 Python 3.5 起已弃用。 è¦�设置它们的值请使用set()方法。 (由 Serhiy Storchaka 在 bpo-29192 ä¸è´¡çŒ®ã€‚)os.makedirs()çš„ mode å�‚æ•°ä¸�会å†�å½±å“�新建ä¸é—´å±‚级目录的æ�ƒé™�ä½�。 è¦�设置它们的文件æ�ƒé™�ä½ å�¯ä»¥åœ¨å�‘起调用makedirs()之å‰�设置 umask。 (由 Serhiy Storchaka 在 bpo-19930 ä¸è´¡çŒ®ã€‚)struct.Struct.format的类型现在是str而é�žbytes。 (由 Victor Stinner 在 bpo-21071 ä¸è´¡çŒ®ã€‚)parse_multipart()现在接å�— encoding å’Œ errors å�‚数并返回与FieldStorage相å�Œçš„结果:对于é�žæ–‡ä»¶å—段,与键相关è�”的值是一个å—符串列表,而é�žå—节串列表。(由 Pierre Quentel 在 bpo-29979 ä¸è´¡çŒ®ã€‚)由于
socketä¸çš„内部更改,在由旧版 Python ä¸çš„socket.share所创建的套接å—上调用socket.fromshare()å·²ä¸�å�—支æŒ�。BaseExceptionçš„repr已更改为ä¸�包å�«æœ«å°¾çš„逗å�·ã€‚ 大多数异常都会å�—æ¤æ›´æ”¹å½±å“�。 (由 Serhiy Storchaka 在 bpo-30399 ä¸è´¡çŒ®ã€‚)datetime.timedeltaçš„repr已更改为在输出ä¸åŒ…å�«å…³é”®å—å�‚数。 (由 Utkarsh Upadhyay 在 bpo-30302 ä¸è´¡çŒ®ã€‚ï¼‰å› ä¸º
shutil.rmtree()现在是使用os.scandir()函数实现的,用户指定的å�¥æŸ„ onerror 现在被调用时如果列目录失败会附带第一个å�‚æ•°os.scandir而ä¸�是os.listdir。未æ�¥å�¯èƒ½åŠ å…¥åœ¨æ£åˆ™è¡¨è¾¾å¼�ä¸å¯¹ Unicode æŠ€æœ¯æ ‡å‡† #18 ä¸åµŒå¥—集å�ˆä¸Žé›†å�ˆæ“�作的支æŒ�。 这会改å�˜çŽ°æœ‰è¯æ³•。 为了推动这项未æ�¥çš„æ”¹å�˜ï¼Œç›®å‰�在有æ§ä¹‰çš„æƒ…况下会引å�‘
FutureWarning。 这包括以å—é�¢å€¼'['开头或包å�«å—é�¢å€¼å—符åº�列'--','&&','~~'以å�Š'||'的集å�ˆã€‚ è¦�é�¿å…�è¦å‘Šï¼Œè¯·ç”¨å��æ–œæ� 对其进行转义。 (由 Serhiy Storchaka 在 bpo-30349 ä¸è´¡çŒ®ã€‚)基于å�¯ä»¥åŒ¹é…�空å—符串的
æ£åˆ™è¡¨è¾¾å¼�对å—符串进行拆分的结果已被更改。 例如基于r'\s*'的拆分现在ä¸�仅会åƒ�åŽŸå…ˆé‚£æ ·æ‹†åˆ†ç©ºæ ¼ç¬¦ï¼Œè€Œä¸”ä¼šæ‹†åˆ†æ‰€æœ‰é�žç©ºæ ¼å—符之å‰�å’Œå—符串结尾处的空å—符串。 通过将模å¼�修改为r'\s+'å�¯ä»¥æ�¢å¤�原先的行为。 自 Python 3.5 开始æ¤ç±»æ¨¡å¼�将会引å�‘FutureWarning。对于å�Œæ—¶åŒ¹é…�空å—符串和é�žç©ºå—符串的模å¼�,在其他情况下æ�œç´¢æ‰€æœ‰åŒ¹é…�的结果也å�¯èƒ½ä¼šè¢«æ›´æ”¹ã€‚ 例如在å—符串
'a\n\n'ä¸ï¼Œæ¨¡å¼�r'(?m)^\s*?$'å°†ä¸�仅会匹é…�ä½�ç½® 2 å’Œ 3 上的空å—符串,还会匹é…�ä½�ç½® 2--3 上的å—符串'\n'。 想è¦�å�ªåŒ¹é…�空行,模å¼�应当改写为r'(?m)^[^\S\n]*$'。re.sub()现在会替æ�¢ä¸Žå‰�一个的é�žç©ºåŒ¹é…�相邻的空匹é…�。 例如re.sub('x*', '-', 'abxd')现在会返回'-a-b--d-'而ä¸�是'-a-b-d-'('b' å’Œ 'd' 之间的第一个å‡�å�·æ˜¯æ›¿æ�¢ 'x',而第二个å‡�å�·åˆ™æ˜¯æ›¿æ�¢ 'x' å’Œ 'd' 之间的空å—符串)。(由 Serhiy Storchaka 在 bpo-25054 å’Œ bpo-32308 ä¸è´¡çŒ®ã€‚)
re.escape()更改为å�ªè½¬ä¹‰æ£åˆ™è¡¨è¾¾å¼�特殊å—符,而ä¸�转义 ASCII å—æ¯�ã€�æ•°å—å’Œ'_'以外的所有å—符。 (由 Serhiy Storchaka 在 bpo-29995 ä¸è´¡çŒ®ã€‚)tracemalloc.Traceback帧现在是按从最旧到最新排åº�,以便与traceback更为一致。 (由 Jesse Bakker 在 bpo-32121 ä¸è´¡çŒ®ã€‚)在支æŒ�
socket.SOCK_NONBLOCK或socket.SOCK_CLOEXECæ ‡å¿—ä½�çš„æ“�作系统上,socket.typeä¸�å†�应用它们。 å› æ¤ï¼Œåƒ�if sock.type == socket.SOCK_STREAM之类的检测会在所有平å�°ä¸ŠæŒ‰é¢„期的方å¼�工作。 (由 Yury Selivanov 在 bpo-32331 ä¸è´¡çŒ®ã€‚)在 Windows 上当é‡�定å�‘æ ‡å‡†å�¥æŸ„时,
subprocess.Popençš„ close_fds å�‚数的默认值从False更改为True。 å¦‚æžœä½ ä»¥å‰�ä¾�èµ–äºŽåœ¨ä½¿ç”¨å¸¦æœ‰æ ‡å‡† io é‡�定å�‘çš„subprocess.Popen时所继承的å�¥æŸ„ï¼Œåˆ™å¿…é¡»ä¼ å…¥close_fds=False以ä¿�留原先的行为,或是使用STARTUPINFO.lpAttributeList。importlib.machinery.PathFinder.invalidate_caches()-- æ¤æ–¹æ³•éš�å¼�地影å“�importlib.invalidate_caches()-- çŽ°åœ¨ä¼šåˆ é™¤sys.path_importer_cacheä¸è¢«è®¾ä¸ºNoneçš„æ�¡ç›®ã€‚ (由 Brett Cannon 在 bpo-33169 ä¸è´¡çŒ®ã€‚)在
asyncioä¸ï¼Œloop.sock_recv(),loop.sock_sendall(),loop.sock_accept(),loop.getaddrinfo(),loop.getnameinfo()已被更改为æ£ç¡®çš„å��程方法以与培è®äº”日文档相匹é…�。 之å‰�,这些方法会返回asyncio.Future实例。 (由 Yury Selivanov 在 bpo-32327 ä¸è´¡çŒ®ã€‚)asyncio.Server.sockets现在会返回æœ�务器套接å—列表的副本,而ä¸�是直接地返回它。 (由 Yury Selivanov 在 bpo-32662 ä¸è´¡çŒ®ã€‚)Struct.format现在是一个str实例而é�žbytes实例。 (由 Victor Stinner 在 bpo-21071 ä¸è´¡çŒ®ã€‚)现在å�¯ä»¥é€šè¿‡å°†
required=Trueä¼ ç»™ArgumentParser.add_subparsers()使得argparseå�è§£æž�器æˆ�为必需的。 (由 Anthony Sottile 在 bpo-26510 ä¸è´¡çŒ®ã€‚)ast.literal_eval()çŽ°åœ¨æ›´ä¸ºä¸¥æ ¼ã€‚ ä»»æ„�åœ°åŠ å‡�æ•°å—å·²ä¸�å†�被å…�许。 (由 Serhiy Storchaka 在 bpo-31778 ä¸è´¡çŒ®ã€‚)当一个日期超出
0001-01-01到9999-12-31范围时Calendar.itermonthdates现在将始终如一地引å�‘异常,以便支æŒ�ä¸�能容å¿�æ¤ç±»å¼‚常的应用程åº�,å�¯ä»¥ä½¿ç”¨æ–°å¢žçš„Calendar.itermonthdays3å’ŒCalendar.itermonthdays4。 这些新方法返回元组,并且其ä¸�å�—datetime.date所支æŒ�的范围é™�制。 (由 Alexander Belopolsky 在 bpo-28292 ä¸è´¡çŒ®ã€‚)collections.ChainMap现在会ä¿�ç•™åº•å±‚æ˜ å°„çš„é¡ºåº�。 (由 Raymond Hettinger 在 bpo-32792 ä¸è´¡çŒ®ã€‚ï¼‰å¦‚æžœåœ¨è§£é‡Šå™¨å…³é—æœŸé—´è¢«è°ƒç”¨ï¼Œ
concurrent.futures.ThreadPoolExecutorå’Œconcurrent.futures.ProcessPoolExecutorçš„submit()方法现在会引å�‘RuntimeError。 (由 Mark Nemec 在 bpo-33097 ä¸è´¡çŒ®ã€‚)configparser.ConfigParseræž„é€ å™¨çŽ°åœ¨ä½¿ç”¨read_dict()æ�¥å¤„ç�†é»˜è®¤å€¼ï¼Œä»¥ä½¿å…¶è¡Œä¸ºä¸Žè§£æž�器的其余部分ä¿�æŒ�致。 在默认å—å…¸ä¸çš„é�žå—符串键和值现在会被éš�å¼�地转æ�¢ä¸ºå—符串。 (由 James Tocknell 在 bpo-23835 ä¸è´¡çŒ®ã€‚)一些未写入文档的内部导入已被移除。 一个例å�是
os.errnoå·²ä¸�å†�å�¯ç”¨ï¼›åº”改为直接使用import errno。 请注æ„�æ¤ç±»æœªå†™å…¥æ–‡æ¡£çš„内部导入å�¯èƒ½æœªç»�通知地éš�时被移除,甚至是在微版本å�·å�‘行版ä¸ç§»é™¤ã€‚
C API 的�化¶
函数 PySlice_GetIndicesEx() 被认为对于大å°�å�¯å�˜çš„åº�列æ�¥è¯´å¹¶ä¸�安全。 如果切片索引ä¸�是 int 的实例,而是实现了 __index__() 方法的对象,则åº�列å�¯ä»¥åœ¨å…¶é•¿åº¦è¢«ä¼ ç»™ PySlice_GetIndicesEx() 之å�Žè°ƒæ•´å¤§å°�。 è¿™å�¯èƒ½å¯¼è‡´è¿”回超出åº�列长度的索引å�·ã€‚ 为了é�¿å…�å�¯èƒ½çš„问题,请使用新增的函数 PySlice_Unpack() å’Œ PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 ä¸è´¡çŒ®ã€‚)
CPython å—节ç �的改å�˜Â¶
新增了两个æ“�作ç �: LOAD_METHOD å’Œ CALL_METHOD。 (由 Yury Selivanov å’Œ INADA Naoki 在 bpo-26110 ä¸è´¡çŒ®ã€‚)
STORE_ANNOTATION æ“�作ç �已被移除。 (由 Mark Shannon 在 bpo-32550 ä¸è´¡çŒ®ã€‚)
Windows 专属的改�¶
用于覆盖 sys.path 的文件现在被命å��为 <python-executable>._pth 而ä¸�是 'sys.path'。 请å�‚阅 查找模å�— 了解更多信æ�¯ã€‚ (由 Steve Dower 在 bpo-28137 ä¸è´¡çŒ®ã€‚)
其他 CPython 实现的改�¶
为了准备在未æ�¥å¯¹å…¬å¼€çš„ CPython è¿�行时åˆ�始化 API 进行潜在更改(请å�‚阅 PEP 432 获å�–最åˆ�但略为过时的文稿),CPython 内部的å�¯åŠ¨å’Œé…�置管ç�†é€»è¾‘å·²ç»�过大幅é‡�构。 虽然这些更新旨在对嵌入å¼�应用程åº�和常规的 CPython CLI 用户都完全é€�明,但它们在这里被æ��å�Šæ˜¯å› 为é‡�构会改å�˜è§£é‡Šå™¨å�¯åŠ¨æœŸé—´è®¸å¤šæ“�作的内部顺åº�ï¼Œå› æ¤å�¯èƒ½æ��示出原先éš�è—�的缺陷,这å�¯èƒ½å˜åœ¨äºŽåµŒå…¥å¼�应用程åº�ä¸ï¼Œæˆ–是在 CPython 自身内部。 (最åˆ�ç”± Nick Coghlan å’Œ Eric Snow 作为 bpo-22257 的一部分贡献,并由 Nick, Eric å’Œ Victor Stinner 在一系列其他问题报告ä¸è¿›ä¸€æ¥æ›´æ–°ï¼‰ã€‚ 已知会å�—到影å“�的一些细节:
目�
PySys_AddWarnOptionUnicode()对嵌入å¼�应用程åº�ä¸�å�¯ç”¨ï¼Œå› 为在调用Py_Initialize之å‰�需è¦�创建一个 Unicode 对象。 请改用PySys_AddWarnOption()。嵌入å¼�应用程åº�通过
PySys_AddWarnOption()æ‰€æ·»åŠ çš„è¦å‘Šè¿‡æ»¤å™¨çŽ°åœ¨åº”è¯¥ä»¥æ›´é«˜çš„ä¸€è‡´æ€§ä¼˜å…ˆäºŽç”±è§£é‡Šå™¨æ‰€è®¾ç½®çš„é»˜è®¤è¿‡æ»¤å™¨
由于默认è¦å‘Šè¿‡æ»¤å™¨çš„é…�置方å¼�å�‘生了å�˜åŒ–,将 Py_BytesWarningFlag 设置为大于一的值ä¸�å†�足以在å�‘出 BytesWarning 消æ�¯çš„å�Œæ—¶å°†å…¶è½¬æ�¢ä¸ºå¼‚常。 è€Œæ˜¯æ”¹ä¸ºå¿…é¡»è®¾ç½®æ——æ ‡ï¼ˆä»¥ä¾¿é¦–å…ˆå�‘出è¦å‘Šï¼‰ï¼Œä»¥å�Šæ·»åŠ æ˜¾å¼�çš„ error::BytesWarning è¦å‘Šè¿‡æ»¤å™¨æ�¥å°†å…¶è½¬æ�¢ä¸ºå¼‚常。
由于编译器处ç�†æ–‡æ¡£å—符串的方å¼�å�‘生了å�˜åŒ–,一个仅由文档å—符串构æˆ�的函数体ä¸éš�å¼�çš„ return None çŽ°åœ¨è¢«æ ‡è®°ä¸ºåœ¨ä¸Žæ–‡æ¡£å—符串相å�Œçš„行,而ä¸�æ˜¯åœ¨å‡½æ•°çš„æ ‡é¢˜è¡Œã€‚
当å‰�异常状æ€�已从帧对象移到å��程对象。 这会简化解释器并修æ£ç”±äºŽåœ¨è¿›å…¥æˆ–退出生æˆ�器时具有交æ�¢å¼‚常状æ€�而导致的一些模糊错误。 (由 Mark Shannon 在 bpo-25612 ä¸è´¡çŒ®ã€‚)
Python 3.7.1 ä¸çš„é‡�è¦�å�˜åŒ–¶
从 3.7.1 开始,Py_Initialize() 现在始终会读å�–å¹¶é�µå¾ªä¸Ž Py_Main() 相å�Œçš„环境设置(在更早的 Python 版本ä¸ï¼Œå®ƒä¼šé�µå¾ªä¸€ä¸ªé”™è¯¯å®šä¹‰çš„环境å�˜é‡�å�集,而在 Python 3.7.0 ä¸åˆ™ä¼šç”±äºŽ bpo-34247 而完全ä¸�读å�–它们)。 如果ä¸�想è¦�æ¤è¡Œä¸ºï¼Œè¯·åœ¨è°ƒç”¨ Py_Initialize() 之å‰�å°† Py_IgnoreEnvironmentFlag 设为 1。
在 3.7.1 ä¸ï¼Œä¸Šä¸‹æ–‡å�˜é‡�çš„ C API å·² 获得更新 以使用 PyObject 指针。 å�¦è¯·å�‚阅 bpo-34762。
在 3.7.1 ä¸ï¼Œå½“æ��ä¾›ä¸�带末尾新行的输入时 tokenize 模å�—现在会éš�å¼�åœ°æ·»åŠ NEWLINE 形符。 æ¤è¡Œä¸ºçŽ°åœ¨å·²ä¸Ž C è¯�法分æž�器的内部行为相匹é…�。 (由 Ammar Askar 在 bpo-33899 ä¸è´¡çŒ®ã€‚)
Python 3.7.2 ä¸çš„é‡�è¦�å�˜åŒ–¶
在 3.7.2 ä¸ï¼ŒWindows 下的 venv ä¸�å†�å¤�制原æ�¥çš„二进制文件,而是改为创建å��为 python.exe å’Œ pythonw.exe çš„é‡�定å�‘脚本。 这解决了一个长期å˜åœ¨çš„问题,å�³æ‰€æœ‰è™šæ‹ŸçŽ¯å¢ƒåœ¨æ¯�次 Python å�‡çº§å�Žéƒ½å¿…须进行å�‡çº§æˆ–是é‡�新创建。 然而,è¦�注æ„�æ¤å�‘布版ä»�ç„¶è¦�求é‡�新创建虚拟环境以获得新的脚本。
Python 3.7.6 ä¸çš„é‡�è¦�å�˜åŒ–¶
出于é‡�è¦�的安全性考é‡�,asyncio.loop.create_datagram_endpoint() çš„ reuse_address å½¢å�‚ä¸�å†�被支æŒ�。 这是由 UDP ä¸çš„套接å—选项 SO_REUSEADDR 的行为导致的。 更多细节请å�‚阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou å’Œ Yury Selivanov 在 bpo-37228 ä¸è´¡çŒ®ã€‚。)
Python 3.7.10 ä¸çš„é‡�è¦�å�˜åŒ–¶
早先的 Python 版本å…�许使用 ; å’Œ & 作为 urllib.parse.parse_qs() å’Œ urllib.parse.parse_qsl() ä¸ query å½¢å�‚的分隔键。 出于安全考虑,也为了é�µå¾ªæ›´æ–°çš„ W3C 推è��设置,这已被改为å�ªå…�许å�•个分隔键,默认为 &。 这一改å�˜è¿˜ä¼šå½±å“� cgi.parse() å’Œ cgi.parse_multipart() å› ä¸ºå®ƒä»¬åœ¨å†…éƒ¨ä½¿ç”¨äº†å�—å½±å“�的函数。 è¦�了解更多细节,请查看它们å�„自的文档。 (由 Adam Goldschmidt, Senthil Kumaran å’Œ Ken Jin 在 bpo-42967 ä¸è´¡çŒ®ã€‚)
Python 3.7.11 ä¸çš„é‡�è¦�å�˜åŒ–¶
新的安全修æ£å°† ftplib.FTP 的行为改æˆ�当设置被动数æ�®é€šé�“æ—¶ä¸�信任远程æœ�务器所å�‘é€�çš„ IPv4 地å�€ã€‚ 我们会改为é‡�用 ftp æœ�务器的 IP 地å�€ã€‚ 对于需è¦�原先的行为的ä¸�常è§�代ç �ï¼Œè¯·åœ¨ä½ çš„ FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (å�‚è§� gh-87451。)
在 URL ä¸å˜åœ¨æ�¢è¡Œç¬¦æˆ–制表符å�¯èƒ½ä¼šå¯¼è‡´æŸ�ç§�å½¢å¼�的攻击。 æ ¹æ�®æ›´æ–°äº† RFC 3986 çš„ WHATWG 规范,解æž�器 urllib.parse() 将从 URL ä¸å޻除 ASCII æ�¢è¡Œç¬¦ \n, \r 和制表符 \t 以防æ¢è¿™ç§�攻击。 移除的å—符将由一个新的模å�—层级å�˜é‡� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE æ�¥æŽ§åˆ¶ã€‚ (å�‚è§� gh-88048。)
3.7.14 ä¸çš„é‡�è¦�安全特性¶
使用å��进制以外的底,如 2(二进制)ã€�4ã€�8(八进制)ã€�16(å��å…进制)ã€�32 以外作为基数在 int å’Œ str 之间进行转æ�¢ï¼Œå¦‚æžœå—符串形å¼�çš„æ•°å—æ•°é‡�超过一个é™�制,会抛出 ValueError,以é�¿å…�å› ç®—æ³•å¤�æ�‚而导致的潜在拒ç»�æœ�务攻击。这是对 CVE-2020-10735 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�å‘½ä»¤è¡Œæ——æ ‡æˆ– sys API 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是å—符串形å¼�çš„ 4300 ä½�æ•°å—。