Python 3.8 有什么新�化¶
- 编者:
Raymond Hettinger(译者:wh2099 at outlook dot com)
è¿™ç¯‡æ–‡ç« ä»‹ç»�了 Python 3.8 相比 3.7 å¢žåŠ çš„æ–°ç‰¹æ€§ã€‚ Python 3.8 å�‘布于 2019 å¹´ 10 月 14 日。 更详细的信æ�¯å�¯å�‚阅 更新日志。
摘� -- �布�点¶
新的特性¶
赋值表达�¶
æ–°å¢žçš„è¯æ³• := å�¯åœ¨è¡¨è¾¾å¼�内部为å�˜é‡�赋值。 它被昵称为“海象è¿�算符â€�å› ä¸ºå®ƒå¾ˆåƒ�是 海象的眼ç�›å’Œé•¿ç‰™ã€‚
在这个示例ä¸ï¼Œèµ‹å€¼è¡¨è¾¾å¼�å�¯ä»¥é�¿å…�调用 len() 两次:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
类似的益处还å�¯å‡ºçŽ°åœ¨æ£åˆ™è¡¨è¾¾å¼�匹é…�ä¸éœ€è¦�使用两次匹é…�对象的情况ä¸ï¼Œä¸€æ¬¡æ£€æµ‹ç”¨äºŽåŒ¹é…�是å�¦å�‘生,å�¦ä¸€æ¬¡ç”¨äºŽæ��å�–å�分组:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
æ¤è¿�算符也适用于é…�å�ˆ while 循环计算一个值æ�¥æ£€æµ‹å¾ªçŽ¯æ˜¯å�¦ç»ˆæ¢ï¼Œè€Œå�Œä¸€ä¸ªå€¼å�ˆåœ¨å¾ªçޝ体ä¸å†�次被使用的情况:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
å�¦ä¸€ä¸ªå€¼å¾—介ç»�的用例出现于列表推导å¼�ä¸ï¼Œåœ¨ç›é€‰æ�¡ä»¶ä¸è®¡ç®—一个值,而å�Œä¸€ä¸ªå€¼å�ˆåœ¨è¡¨è¾¾å¼�ä¸éœ€è¦�被使用:
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
请尽é‡�将海象è¿�算符的使用é™�制在清晰的场å�ˆä¸ï¼Œä»¥é™�低å¤�æ�‚性并æ��å�‡å�¯è¯»æ€§ã€‚
请�阅 PEP 572 了解详情。
(由 Morehouse 在 bpo-35224 ä¸è´¡çŒ®ã€‚)
仅��置形�¶
新增了一个函数形å�‚è¯æ³• / 用æ�¥æŒ‡æ˜ŽæŸ�些函数形å�‚必须作为ä½�ç½®å�‚数而ä¸�å�¯ä½œä¸ºå…³é”®å—å�‚数。 è¿™ç§�æ ‡è®°è¯æ³•与通过 help() 显示的使用 Larry Hastings çš„ Argument Clinic å·¥å…·æ‰€æ ‡è®°çš„ C 函数相å�Œã€‚
在下é�¢çš„例å�ä¸ï¼Œå½¢å�‚ a å’Œ b 为仅é™�ä½�置形å�‚,c 或 d å�¯ä»¥æ˜¯ä½�置形å�‚或关键å—å½¢å�‚,而 e 或 f è¦�求为关键å—å½¢å�‚:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
以下�为�法的调用:
f(10, 20, 30, d=40, e=50, f=60)
但是,以下�为��法的调用:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
è¿™ç§�æ ‡è®°å½¢å¼�的一个用例是它å…�许纯 Python 函数完整模拟现有的用 C 代ç �编写的函数的行为。 例如,内置的 divmod() 函数ä¸�接å�—关键å—å�‚æ•°:
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
å�¦ä¸€ä¸ªç”¨ä¾‹æ˜¯åœ¨ä¸�需è¦�å½¢å�‚å��称时排除关键å—å�‚数。 例如,内置的 len() 函数的ç¾å��为 len(obj, /)。 è¿™å�¯ä»¥æŽ’除如下这ç§�笨拙的调用形å¼�:
len(obj='hello') # The "obj" keyword argument impairs readability
å�¦ä¸€ä¸ªç›Šå¤„是将形å�‚æ ‡è®°ä¸ºä»…é™�ä½�置形å�‚å°†å…�许在未æ�¥ä¿®æ”¹å½¢å�‚å��而ä¸�ä¼šç ´å��客户的代ç �。 例如,在 statistics 模å�—ä¸ï¼Œå½¢å�‚å�� dist 在未æ�¥å�¯èƒ½è¢«ä¿®æ”¹ã€‚ 这使得以下函数æ��è¿°æˆ�为å�¯èƒ½:
def quantiles(dist, /, *, n=4, method='exclusive')
...
由于在 / 左侧的形å�‚ä¸�会被公开为å�¯ç”¨å…³é”®å—,其他形å�‚å��ä»�å�¯åœ¨ **kwargs ä¸ä½¿ç”¨:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
è¿™æž�大地简化了需è¦�接å�—ä»»æ„�关键å—å�‚数的函数和方法的实现。 例如,以下是一段摘自 collections 模å�—的代ç �:
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
请�阅 PEP 570 了解详情。
(由 Pablo Galindo 在 bpo-36540 ä¸è´¡çŒ®ã€‚)
用于已编译å—节ç �文件的并行文件系统缓å˜Â¶
新增的 PYTHONPYCACHEPREFIX 设置 (也å�¯ä½¿ç”¨ -X pycache_prefix) å�¯å°†éš�å¼�çš„å—节ç �缓å˜é…�置为使用å�•ç‹¬çš„å¹¶è¡Œæ–‡ä»¶ç³»ç»Ÿæ ‘ï¼Œè€Œä¸�是默认的æ¯�个æº�代ç �目录下的 __pycache__ å�目录。
缓å˜çš„ä½�置会在 sys.pycache_prefix ä¸æŠ¥å‘Š (None 表示默认ä½�ç½®å�³ __pycache__ å�目录)。
(由 Carl Meyer 在 bpo-33499 ä¸è´¡çŒ®ã€‚)
调试构建使用与�布构建相�的 ABI¶
Python 现在ä¸�论是以å�‘布模å¼�还是调试模å¼�进行构建都将使用相å�Œçš„ ABI。 在 Unix 上,当 Python 以调试模å¼�构建时,现在将å�¯ä»¥åŠ è½½ä»¥å�‘布模å¼�构建的 C 扩展和使用稳定版 ABI 构建的 C 扩展。
å�‘布编译版和 调试编译版 现在都是 ABI 兼容的:定义 Py_DEBUG å®�ä¸�会å†�应用 Py_TRACE_REFS å®�,它引入 了唯一的 ABI ä¸�兼容性。 Py_TRACE_REFS å®�æ·»åŠ äº† sys.getobjects() 函数和 PYTHONDUMPREFS 环境å�˜é‡�,它å�¯ä»¥ä½¿ç”¨æ–°çš„ ./configure --with-trace-refs 编译选项æ�¥è®¾ç½®ã€‚ (由 Victor Stinner 在 bpo-36465 ä¸è´¡çŒ®ã€‚)
在 Unix 上,C 扩展ä¸�会å†�被链接到 libpython,但 Android å’Œ Cygwin 例外。 现在é�™æ€�链接的 Python å°†å�¯ä»¥åŠ è½½ä½¿ç”¨å…±äº«åº“ Python 构建的 C 扩展。 (由 Victor Stinner 在 bpo-21536 ä¸è´¡çŒ®ã€‚)
在 Unix 上,当 Python 以调试模å¼�构建时,导入æ“�作现在也会查找在å�‘布模å¼�下编译的 C 扩展以å�Šä½¿ç”¨ç¨³å®šç‰ˆ ABI 编译的 C 扩展。 (由 Victor Stinner 在 bpo-36722 ä¸è´¡çŒ®ã€‚)
è¦�å°† Python 嵌入到一个应用ä¸ï¼Œå¿…须将新增的 --embed é€‰é¡¹ä¼ ç»™ python3-config --libs --embed 以获得 -lpython3.8 (将应用链接到 libpython)。 è¦�å�Œæ—¶æ”¯æŒ� 3.8 和旧版本,请先å°�试 python3-config --libs --embed 并在æ¤å‘½ä»¤å¤±è´¥æ—¶å›žé€€åˆ° python3-config --libs (å�³ä¸�带 --embed)。
å¢žåŠ ä¸€ä¸ª pkg-config python-3.8-embed 模å�—用æ�¥å°† Python 嵌入到一个应用ä¸: pkg-config python-3.8-embed --libs 包å�« -lpython3.8。 è¦�å�Œæ—¶æ”¯æŒ� 3.8 和旧版本,请先å°�试 pkg-config python-X.Y-embed --libs 并在æ¤å‘½ä»¤å¤±è´¥æ—¶å›žé€€åˆ° pkg-config python-X.Y --libs (å�³ä¸�带 --embed) (请将 X.Y 替æ�¢ä¸º Python 版本å�·ï¼‰ã€‚
å�¦ä¸€æ–¹é�¢ï¼Œpkg-config python3.8 --libs ä¸�å†�包å�« -lpython3.8。 C 扩展ä¸�å�¯è¢«é“¾æŽ¥åˆ° libpython (但 Android å’Œ Cygwin 例外,这两者的情况由脚本处ç�†)ï¼›æ¤æ”¹å�˜æ˜¯æ•…æ„�被设为å�‘下ä¸�兼容的。 (由 Victor Stinner 在 bpo-36721 ä¸è´¡çŒ®ã€‚)
f-å—符串支æŒ� = 用于自动记录表达å¼�和调试文档¶
å¢žåŠ = 说明符用于 f-string。 å½¢å¼�为 f'{expr=}' çš„ f-å—符串将扩展表示为表达å¼�æ–‡æœ¬ï¼ŒåŠ ä¸€ä¸ªç‰äºŽå�·ï¼Œå†�åŠ è¡¨è¾¾å¼�的求值结果。 例如:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常的 f-å—ç¬¦ä¸²æ ¼å¼�说明符 å…�许更细致地控制所è¦�显示的表达å¼�结果:
>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
= 说明符将输出整个表达�,以便详细演示计算过程:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(由 Eric V. Smith å’Œ Larry Hastings 在 bpo-36817 ä¸è´¡çŒ®ã€‚)
PEP 578: Python è¿�è¡Œæ—¶å®¡æ ¸é’©å�¶
æ¤ PEP æ·»åŠ äº†å®¡æ ¸é’©å�和已验è¯�开放钩å�。 两者在 Python 与本机代ç �ä¸å�‡å�¯ç”¨ã€‚å…�许以纯 Python 代ç �编写的应用和框架利用é¢�外的通知,å�Œæ—¶å…�许嵌入开å�‘人员或系统管ç�†å‘˜éƒ¨ç½²å§‹ç»ˆå�¯ç”¨å®¡æ ¸çš„ Python 版本。
请�阅 PEP 578 了解详情。
PEP 587: Python �始化�置¶
PEP 587 å¢žåŠ äº†ä¸€ä¸ªæ–°çš„ C API 用æ�¥é…�ç½® Python åˆ�始化,æ��供对整个é…�置过程的更细致控制以å�Šæ›´å¥½çš„错误报告。
新的结构:
新的函数:
æ¤ PEP è¿˜ä¸ºè¿™äº›å†…éƒ¨ç»“æž„æ·»åŠ äº† _PyRuntimeState.preconfig (PyPreConfig 类型) å’Œ PyInterpreterState.config (PyConfig 类型) å—æ®µã€‚ PyInterpreterState.config æˆ�为新的引用é…�置,替代全局é…�ç½®å�˜é‡�和其他ç§�有å�˜é‡�。
请�阅 Python �始化�置 获�详细文档。
请�阅 PEP 587 了解详情。
(由 Victor Stinner 在 bpo-36763 ä¸è´¡çŒ®ã€‚)
PEP 590: Vectorcall: 用于 CPython 的快速调用�议¶
å°† Vectorcall å��è®® æ·»åŠ åˆ° Python/C API。 å®ƒçš„ç›®æ ‡æ˜¯å¯¹å·²è¢«åº”ç”¨äºŽå¤šä¸ªç±»çš„çŽ°æœ‰ä¼˜å…ˆè¿›è¡Œæ£å¼�化。 任何实现了å�¯è°ƒç”¨å¯¹è±¡çš„ é�™æ€�类型 å�‡å�¯ä½¿ç”¨æ¤å��议。
æ¤ç‰¹æ€§ç›®å‰�为暂定状æ€�,计划在 Python 3.9 将其完全公开。
请�阅 PEP 590 了解详情。
(由 Jeroen Demeyer, Mark Shannon å’Œ Petr Viktorin 在 bpo-36974 ä¸è´¡çŒ®ã€‚)
具有外部数�缓冲区的 pickle �议 5¶
当使用 pickle 在 Python è¿›ç¨‹é—´ä¼ è¾“å¤§é‡�æ•°æ�®ä»¥å……分å�‘æŒ¥å¤šæ ¸æˆ–å¤šæœºå¤„ç�†çš„优势时,é�žå¸¸é‡�è¦�一点是通过å‡�å°‘å†…å˜æ‹·è´�æ�¥ä¼˜åŒ–ä¼ è¾“æ•ˆçŽ‡ï¼Œå¹¶å�¯èƒ½åº”用一些定制技巧例如针对特定数æ�®çš„压缩。
pickle å��è®® 5 引入了对于外部缓冲区的支æŒ�ï¼Œè¿™æ · PEP 3118 兼容的数æ�®å�¯ä»¥ä¸Žä¸» pickle æµ�åˆ†å¼€è¿›è¡Œä¼ è¾“ï¼Œè¿™æ˜¯ç”±é€šä¿¡å±‚æ�¥ç¡®å®šçš„。
请�阅 PEP 574 了解详情。
(由 Antoine Pitrou 在 bpo-36785 ä¸è´¡çŒ®ã€‚)
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
在之å‰�版本ä¸
continueè¯å�¥ä¸�å…�许在finallyå�å�¥ä¸ä½¿ç”¨ï¼Œè¿™æ˜¯å› 为具体实现å˜åœ¨ä¸€ä¸ªé—®é¢˜ã€‚ 在 Python 3.8 䏿¤é™�制已被å�–消。 (由 Serhiy Storchaka 在 bpo-32489 ä¸è´¡çŒ®ã€‚)bool,intå’Œfractions.Fraction类型现在都有一个as_integer_ratio()方法,与floatå’Œdecimal.Decimalä¸çš„已有方法类似。 这个微å°�çš„ API 扩展使得numerator, denominator = x.as_integer_ratio()è¿™æ ·çš„å†™æ³•åœ¨å¤šç§�æ•°å—类型上通用æˆ�为å�¯èƒ½ã€‚ (由 Lisa Roach 在 bpo-33073 å’Œ Raymond Hettinger 在 bpo-37819 ä¸è´¡çŒ®ã€‚)int,floatå’Œcomplexçš„æž„é€ å™¨çŽ°åœ¨ä¼šä½¿ç”¨__index__()特殊方法,如果该方法å�¯ç”¨è€Œå¯¹åº”的方法 method__int__(),__float__()或__complex__()方法ä¸�å�¯ç”¨çš„è¯�。 (由 Serhiy Storchaka 在 bpo-20092 ä¸è´¡çŒ®ã€‚)在
æ£åˆ™è¡¨è¾¾å¼�: 䏿·»åŠ äº†å¯¹\N{name}转义ç �的支æŒ�:>>> notice = 'Copyright © 2019' >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') >>> int(copyright_year_pattern.search(notice).group(1)) 2019
(由 Jonathan Eunice å’Œ Serhiy Storchaka 在 bpo-30688 ä¸è´¡çŒ®ã€‚)
现在 dict 和 dictview �以使用
reversed()按æ�’入顺åº�å��å�‘è¿ä»£ã€‚ (由 Rémi Lapeyre 在 bpo-33462 ä¸è´¡çŒ®ã€‚)在函数调用ä¸å…�许使用的关键å—å��ç§°è¯æ³•å�—到进一æ¥çš„é™�制。 特别地,
f((keyword)=arg)ä¸�å†�被å…�许。 关键å—å�‚数赋值形å¼�的左侧ç»�ä¸�å…�è®¸ä¸€èˆ¬æ ‡è¯†ç¬¦ä»¥å¤–çš„å…¶ä»–å†…å®¹ã€‚ (由 Benjamin Peterson 在 bpo-34641 ä¸è´¡çŒ®ã€‚)在
yieldå’Œreturnè¯å�¥ä¸çš„一般å�¯è¿ä»£å¯¹è±¡è§£åŒ…ä¸�å†�è¦�æ±‚åŠ åœ†æ‹¬å�·ã€‚ 这使得 yield å’Œ return çš„è¯æ³•与æ£å¸¸çš„èµ‹å€¼è¯æ³•更为一致:>>> def parse(family): lastname, *members = family.split() return lastname.upper(), *members >>> parse('simpsons homer marge bart lisa maggie') ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie')
(由 David Cuthbert å’Œ Jordan Chapman 在 bpo-32117 ä¸è´¡çŒ®ã€‚)
当类似
[(10, 20) (30, 40)]è¿™æ ·åœ¨ä»£ç �ä¸å°‘了一个逗å�·æ—¶ï¼Œç¼–译器将显示SyntaxWarning并附带更有帮助的æ��示。 这相比原æ�¥ç”¨TypeErroræ�¥æ��示第一个元组是ä¸�å�¯è°ƒç”¨çš„æ›´å®¹æ˜“被ç�†è§£ã€‚ (由 Serhiy Storchaka 在 bpo-15248 ä¸è´¡çŒ®ã€‚)datetime.date或datetime.datetimeå’Œdatetime.timedelta对象之间的算术è¿�算现在将返回相应å�类的实例而ä¸�是基类的实例。 这也会影å“�到在具体实现ä¸ï¼ˆç›´æŽ¥æˆ–间接地)使用了datetime.timedelta算术è¿�算的返回类型,例如astimezone()。 (由 Paul Ganssle 在 bpo-32417 ä¸è´¡çŒ®ã€‚)当 Python 解释器通过 Ctrl-C (SIGINT) è¢«ä¸æ–并且所产生的
KeyboardInterrupt异常未被æ�•获,Python 进程现在会通过一个 SIGINT ä¿¡å�·æˆ–是使得å�‘起调用的进程能检测到它是由 Ctrl-C æ“�作æ�€æ»çš„æ£ç¡®é€€å‡ºä»£ç �æ�¥é€€å‡ºã€‚ POSIX å’Œ Windows 上的终端会相应地使用æ¤ä»£ç �在交互å¼�会è¯�ä¸ç»ˆæ¢è„šæœ¬ã€‚ (由 Google çš„ Gregory P. Smith 在 bpo-1054041 ä¸è´¡çŒ®ã€‚)æŸ�äº›é«˜çº§ç¼–ç¨‹é£Žæ ¼è¦�求为现有的函数更新
types.CodeType对象。 由于代ç �对象是ä¸�å�¯å�˜çš„,需è¦�基于现有代ç �对象模型创建一个新的代ç �对象。 使用 19 个形å�‚将会相当ç¹�ç��。 现在,新的replace()方法使得通过少é‡�修改的形å�‚创建克隆对象æˆ�为å�¯èƒ½ã€‚下é�¢æ˜¯ä¸€ä¸ªä¿®æ”¹
statistics.mean()函数æ�¥é˜²æ¢ data å½¢å�‚被用作关键å—å�‚数的例å�:>>> from statistics import mean >>> mean(data=[10, 20, 90]) 40 >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1) >>> mean(data=[10, 20, 90]) Traceback (most recent call last): ... TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
(由 Victor Stinner 在 bpo-37032 ä¸è´¡çŒ®ã€‚)
对于整数,现在
pow()函数的三�数形�在底数与模数��约的情况下�许指数为负值。 ��它会在指数为-1时计算底数的模乘逆元,并对其他负指数计算�模的适当幂次。 例如,�计算 38 模 137 的 模乘逆元 则�写为:>>> pow(38, -1, 137) 119 >>> 119 * 38 % 137 1
模乘逆元在求解 线性丢番图方程 会被用到。 例如,想�求出
4258� + 147� = 369的整数解,首先应�写为4258� ≡ 369 (mod 147)然�求解:>>> x = 369 * pow(4258, -1, 147) % 147 >>> y = (4258 * x - 369) // -147 >>> 4258 * x + 147 * y 369
(由 Mark Dickinson 在 bpo-36027 ä¸è´¡çŒ®ã€‚)
å—典推导å¼�已与å—å…¸å—é�¢å€¼å®žçްå�Œæ¥ï¼Œä¼šå…ˆè®¡ç®—é”®å†�计算值:
>>> # Dict comprehension >>> cast = {input('role? '): input('actor? ') for i in range(2)} role? King Arthur actor? Chapman role? Black Knight actor? Cleese >>> # Dict literal >>> cast = {input('role? '): input('actor? ')} role? Sir Robin actor? Eric Idle
对执行顺åº�çš„ä¿�è¯�对赋值表达å¼�æ�¥è¯´å¾ˆæœ‰ç”¨ï¼Œå› 为在键表达å¼�ä¸èµ‹å€¼çš„å�˜é‡�å°†å�¯åœ¨å€¼è¡¨è¾¾å¼�ä¸è¢«ä½¿ç”¨:
>>> names = ['Martin von Löwis', '�ukasz Langa', 'Walter Dörwald'] >>> {(n := normalize('NFC', name)).casefold() : n for name in names} {'martin von löwis': 'Martin von Löwis', 'łukasz langa': '�ukasz Langa', 'walter dörwald': 'Walter Dörwald'}
(由 Jörn Heissler 在 bpo-35224 ä¸è´¡çŒ®ã€‚)
object.__reduce__()方法现在å�¯è¿”回长度为二至å…ä¸ªå…ƒç´ çš„å…ƒç»„ã€‚ 之å‰�的上é™�为五个。 新增的第å…个å�¯é€‰å…ƒç´ 是ç¾å��为(obj, state)çš„å�¯è°ƒç”¨å¯¹è±¡ã€‚ è¿™æ ·å°±å…�许直接控制特定对象的状æ€�更新。 å¦‚æžœå…ƒç´ å€¼ä¸�为 None,该å�¯è°ƒç”¨å¯¹è±¡å°†ä¼˜å…ˆäºŽå¯¹è±¡çš„__setstate__()方法。 (由 Pierre Glaser å’Œ Olivier Grisel 在 bpo-35900 ä¸è´¡çŒ®ã€‚)
新增模�¶
新增的
importlib.metadata模å�—æ��供了从第三方包读å�–元数æ�®çš„(临时)支æŒ�。 例如,它å�¯ä»¥æ��å�–一个已安装软件包的版本å�·ã€�å…¥å�£ç‚¹åˆ—表ç‰ç‰:>>> # Note following example requires that the popular "requests" >>> # package has been installed. >>> >>> from importlib.metadata import version, requires, files >>> version('requests') '2.22.0' >>> list(requires('requests')) ['chardet (<3.1.0,>=3.0.2)'] >>> list(files('requests'))[:5] [PackagePath('requests-2.22.0.dist-info/INSTALLER'), PackagePath('requests-2.22.0.dist-info/LICENSE'), PackagePath('requests-2.22.0.dist-info/METADATA'), PackagePath('requests-2.22.0.dist-info/RECORD'), PackagePath('requests-2.22.0.dist-info/WHEEL')]
(由 Barry Warsaw å’Œ Jason R. Coombs 在 bpo-34632 ä¸è´¡çŒ®ï¼‰ã€‚
改进的模�¶
ast¶
AST 节点现在具有 end_lineno 和 end_col_offset 属性,它们给出节点结�的精确�置。 (这�适用于具有 lineno 和 col_offset 属性的节点。)
新增函数 ast.get_source_segment() 返回指定 AST 节点的æº�代ç �。
(由 Ivan Levkivskyi 在 bpo-33416 ä¸è´¡çŒ®ã€‚)
ast.parse() å‡½æ•°å…·æœ‰ä¸€äº›æ–°çš„æ——æ ‡ï¼š
type_comments=True导致其返回与特定 AST 节点相关è�”çš„ PEP 484 å’Œ PEP 526 类型注释文本;mode='func_type'å�¯è¢«ç”¨äºŽè§£æž� PEP 484 "ç¾å��类型注释" (为函数定义 AST 节点而返回)ï¼›feature_version=(3, N)å…�许指定一个更早的 Python 3 版本。 例如,feature_version=(3, 4)将把asyncå’Œawait视为é�žä¿�ç•™å—。
(由 Guido van Rossum 在 bpo-35766 ä¸è´¡çŒ®ã€‚)
asyncio¶
asyncio.run() å·²ç»�从暂定状æ€�晋级为稳定 API。 æ¤å‡½æ•°å�¯è¢«ç”¨äºŽæ‰§è¡Œä¸€ä¸ª coroutine 并返回结果,å�Œæ—¶è‡ªåŠ¨ç®¡ç�†äº‹ä»¶å¾ªçŽ¯ã€‚ 例如:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
asyncio.run(main())
è¿™ 大致 ç‰ä»·äºŽ:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
asyncio.set_event_loop(None)
loop.close()
实际的实现è¦�æ›´å¤�æ�‚许多。 å› æ¤ asyncio.run() 应该作为è¿�行 asyncio 程åº�的首选方å¼�。
(由 Yury Selivanov 在 bpo-32314 ä¸è´¡çŒ®ã€‚)
è¿�行 python -m asyncio å°†å�¯åŠ¨ä¸€ä¸ªåŽŸç”Ÿå¼‚æ¥ REPL。 è¿™å…�许快速体验具有最高层级 await 的代ç �。 这时ä¸�å†�需è¦�直接调用 asyncio.run()ï¼Œå› ä¸ºæ¤æ“�作会在æ¯�次å�‘起调用时产生一个新事件循环:
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello
(由 Yury Selivanov 在 bpo-37028 ä¸è´¡çŒ®ã€‚)
异常 asyncio.CancelledError 现在继承自 BaseException 而ä¸�是 Exception 并且ä¸�å†�继承自 concurrent.futures.CancelledError。 (由 Yury Selivanov 在 bpo-32528 ä¸è´¡çŒ®ã€‚)
在 Windows 上,现在默认的事件循环为 ProactorEventLoop。 (由 Victor Stinner 在 bpo-34687 ä¸è´¡çŒ®ã€‚)
ProactorEventLoop 现在也支æŒ� UDP。 (由 Adam Meily å’Œ Andrew Svetlov 在 bpo-29883 ä¸è´¡çŒ®ã€‚)
ProactorEventLoop 现在å�¯é€šè¿‡ KeyboardInterrupt ("CTRL+C") æ�¥ä¸æ–。 (由 Vladimir Matveev 在 bpo-23057 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† asyncio.Task.get_coro() 用æ�¥èŽ·å�– asyncio.Task ä¸çš„已包装å��程。 (由 Alex Grönholm 在 bpo-36999 ä¸è´¡çŒ®ã€‚)
asyncio 任务现在å�¯ä»¥è¢«å‘½å��,或者是通过将 name 关键å—å�‚æ•°ä¼ ç»™ asyncio.create_task() 或 create_task() 事件循环方法,或者是通过在任务对象上调用 set_name() 方法。 任务å��称在 asyncio.Task çš„ repr() 输出ä¸å�¯è§�,并且还å�¯ä»¥ä½¿ç”¨ get_name() 方法æ�¥èŽ·å�–。 (由 Alex Grönholm 在 bpo-34270 ä¸è´¡çŒ®ã€‚)
将对 Happy Eyeballs 的支æŒ�æ·»åŠ åˆ° asyncio.loop.create_connection()。 è¦�指定æ¤è¡Œä¸ºï¼Œå·²å¢žåŠ äº†ä¸¤ä¸ªæ–°çš„å½¢å�‚: happy_eyeballs_delay å’Œ interleave。 Happy Eyeballs 算法å�¯æ��å�‡æ”¯æŒ� IPv4 å’Œ IPv6 的应用的å“�应速度,具体å�šæ³•æ˜¯å°�试å�Œæ—¶ä½¿ç”¨ä¸¤è€…进行连接。 (由 twisteroid ambassador 在 bpo-33530 ä¸è´¡çŒ®ã€‚)
builtins¶
内置的 compile() 已改进为å�¯æŽ¥å�— ast.PyCF_ALLOW_TOP_LEVEL_AWAIT æ——æ ‡ã€‚ å½“ä¼ å…¥æ¤æ–°æ——æ ‡æ—¶ï¼Œcompile() å°†å…�è®¸é€šå¸¸è¢«è§†ä¸ºæ— æ•ˆè¯æ³•的最高层级 await, async for å’Œ async with æž„é€ ã€‚ æ¤å�Žå°†å�¯è¿”回带有 CO_COROUTINE æ——æ ‡çš„å¼‚æ¥ä»£ç �对象。 (由 Matthias Bussonnier 在 bpo-34616 ä¸è´¡çŒ®ã€‚)
collections¶
collections.namedtuple() çš„ _asdict() 方法现在将返回 dict 而ä¸�是 collections.OrderedDict。 æ¤é¡¹æ›´æ”¹æ˜¯ç”±äºŽæ™®é€šå—典自 Python 3.7 èµ·å·²ä¿�è¯�å…·æœ‰ç¡®å®šçš„å…ƒç´ é¡ºåº�。 如果还需è¦� OrderedDict çš„é¢�外特性,建议的解决方案是将结果转æ�¢ä¸ºéœ€è¦�的类型: OrderedDict(nt._asdict())。 (由 Raymond Hettinger 在 bpo-35864 ä¸è´¡çŒ®ã€‚)
cProfile¶
cProfile.Profile 类现在å�¯è¢«ç”¨ä½œä¸Šä¸‹æ–‡ç®¡ç�†å™¨ã€‚ 在è¿�行时对一个代ç �å�—实现性能分æž�:
import cProfile
with cProfile.Profile() as profiler:
# code to be profiled
...
(由 Scott Sanderson 在 bpo-29235 ä¸è´¡çŒ®ã€‚)
csv¶
csv.DictReader 现在将返回 dict 而ä¸�是 collections.OrderedDict。 æ¤å·¥å…·çŽ°åœ¨ä¼šæ›´å¿«é€Ÿä¸”æ¶ˆè€—æ›´å°‘å†…å˜å�Œæ—¶ä»�ç„¶ä¿�ç•™å—æ®µé¡ºåº�。 (由 Michael Selik 在 bpo-34003 ä¸è´¡çŒ®ã€‚)
curses¶
æ·»åŠ äº†ä¸€ä¸ªæ–°å�˜é‡�用于ä¿�å˜ä¸‹å±‚ ncurses 库的结构版信æ�¯: ncurses_version。 (由 Serhiy Storchaka 在 bpo-31680 ä¸è´¡çŒ®ã€‚)
ctypes¶
在 Windows 上,CDLL å�Šå…¶å�类现在接å�— winmode å½¢å�‚æ�¥æŒ‡å®šç”¨äºŽåº•层 LoadLibraryEx è°ƒç”¨çš„æ——æ ‡ã€‚ é»˜è®¤æ——æ ‡è¢«è®¾ä¸ºä»…åŠ è½½æ�¥è‡ªå�¯ä¿¡ä»»ä½�置的 DLL ä¾�赖项,包括 DLL çš„å˜æ”¾è·¯å¾„ï¼ˆå¦‚æžœåŠ è½½åˆ�å§‹ DLL 时使用了完整或部分路径)以å�Šé€šè¿‡ add_dll_directory() æ·»åŠ çš„è·¯å¾„ã€‚ (由 Steve Dower 在 bpo-36085 ä¸è´¡çŒ®ã€‚)
datetime¶
æ·»åŠ äº†æ–°çš„æ›¿ä»£æž„é€ å™¨ datetime.date.fromisocalendar() å’Œ datetime.datetime.fromisocalendar(),它们分别基于 ISO 年份ã€�周åº�å�·å’Œå‘¨å†…æ—¥åº�å�·æ�¥æž„é€ date å’Œ datetime å¯¹è±¡ï¼›è¿™ä¸¤è€…åˆ†åˆ«æ˜¯å…¶æ‰€å¯¹åº”ç±»ä¸ isocalendar 方法的逆æ“�作。 (由 Paul Ganssle 在 bpo-36004 ä¸è´¡çŒ®ã€‚)
functools¶
functools.lru_cache() 现在å�¯ç›´æŽ¥ä½œä¸ºè£…饰器而ä¸�是作为返回装饰器的函数。 å› æ¤è¿™ä¸¤ç§�写法现在都被支æŒ�:
@lru_cache
def f(x):
...
@lru_cache(maxsize=256)
def f(x):
...
(由 Raymond Hettinger 在 bpo-36772 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†æ–°çš„ functools.cached_property() 装饰器,用于在实例生命周期内缓å˜çš„已计算特å¾�属性。
import functools
import statistics
class Dataset:
def __init__(self, sequence_of_numbers):
self.data = sequence_of_numbers
@functools.cached_property
def variance(self):
return statistics.variance(self.data)
(由 Carl Meyer 在 bpo-21145 ä¸è´¡çŒ®ï¼‰
æ·»åŠ äº†æ–°çš„ functools.singledispatchmethod() 装饰器å�¯ä½¿ç”¨ single dispatch 将方法转æ�¢ä¸º 泛型函数:
from functools import singledispatchmethod
from contextlib import suppress
class TaskManager:
def __init__(self, tasks):
self.tasks = list(tasks)
@singledispatchmethod
def discard(self, value):
with suppress(ValueError):
self.tasks.remove(value)
@discard.register(list)
def _(self, tasks):
targets = set(tasks)
self.tasks = [x for x in self.tasks if x not in targets]
(由 Ethan Smith 在 bpo-32380 ä¸è´¡çŒ®ï¼‰
gc¶
get_objects() 现在能接å�—一个å�¯é€‰çš„ generation å½¢å�‚æ�¥æŒ‡å®šä¸€ä¸ªç”¨äºŽèŽ·å�–对象的生æˆ�器。 (由 Pablo Galindo 在 bpo-36016 ä¸è´¡çŒ®ã€‚)
gettext¶
æ·»åŠ äº† pgettext() å�Šå…¶å�˜åŒ–å½¢å¼�。 (由 Franz Glasner, Éric Araujo å’Œ Cheryl Sabella 在 bpo-2504 ä¸è´¡çŒ®ã€‚)
gzip¶
æ·»åŠ mtime å½¢å�‚到 gzip.compress() 用于å�¯é‡�现的输出。 (由 Guo Ci Teo 在 bpo-34898 ä¸è´¡çŒ®ã€‚)
å¯¹äºŽç‰¹å®šç±»åž‹çš„æ— æ•ˆæˆ–å·²æ�Ÿå�� gzip 文件现在将引å�‘ BadGzipFile 而ä¸�是 OSError。 (由 Filip GruszczyÅ„ski, Michele Orrù å’Œ Zackery Spytz 在 bpo-6584 ä¸è´¡çŒ®ã€‚)
IDLE 与 idlelib¶
超过 N 行(默认值为 50)的输出将被折å� 为一个按钮。 N å�¯ä»¥åœ¨ Settings 对è¯�框的 General 页的 PyShell 部分ä¸è¿›è¡Œä¿®æ”¹ã€‚ æ•°é‡�较少但是超长的行å�¯ä»¥é€šè¿‡åœ¨è¾“出上å�³å‡»æ�¥æŠ˜å� 。 被折å� 的输出å�¯é€šè¿‡å�Œå‡»æŒ‰é’®æ�¥å±•开,或是通过å�³å‡»æŒ‰é’®æ�¥æ”¾å…¥å‰ªè´´æ�¿æˆ–是å�•独的窗å�£ã€‚ (由 Tal Einat 在 bpo-1529353 ä¸è´¡çŒ®ã€‚)
在 Run è�œå�•ä¸å¢žåŠ äº† "Run Customized" 以使用自定义设置æ�¥è¿�行模å�—。 输入的任何命令行å�‚æ•°éƒ½ä¼šè¢«åŠ å…¥ sys.argv。 它们在下次自定义è¿�行时会å†�次显示在窗体ä¸ã€‚ 用户也å�¯ä»¥ç¦�用通常的 Shell 主模å�—é‡�å�¯ã€‚ (由 Cheryl Sabella, Terry Jan Reedy ç‰äººåœ¨ bpo-5680 å’Œ bpo-37627 ä¸è´¡çŒ®ã€‚)
在 IDLE 编辑器窗å�£ä¸å¢žåŠ äº†å�¯é€‰çš„行å�·ã€‚ 窗å�£æ‰“开时默认ä¸�显示行å�·ï¼Œé™¤é�žåœ¨é…�置对è¯�框的 General 选项å�¡ä¸ç‰¹åˆ«è®¾ç½®ã€‚ 已打开窗å�£ä¸çš„行å�·å�¯ä»¥åœ¨ Options è�œå�•䏿˜¾ç¤ºå’Œéš�è—�。 (由 Tal Einat å’Œ Saimadhav Heblikar 在 bpo-17535 ä¸è´¡çŒ®ã€‚)
现在会使用 OS 本机编ç �æ ¼å¼�在 Python å—符串和 Tcl 对象间进行转æ�¢ã€‚ è¿™å…�许在 IDLE ä¸å¤„ç�† emoji 和其他é�ž BMP å—符。 这些å—符将å�¯è¢«æ˜¾ç¤ºæˆ–是从剪贴æ�¿å¤�制和粘贴。 å—符串从 Tcl 到 Python çš„æ�¥å›žè½¬æ�¢çŽ°åœ¨ä¸�会å†�å�‘生失败。 (过去八年有许多人都为æ¤ä»˜å‡ºè¿‡åŠªåŠ›ï¼Œé—®é¢˜æœ€ç»ˆç”± Serhiy Storchaka 在 bpo-13153 ä¸è§£å†³ã€‚)
在 3.8.1 䏿–°å¢ž:
æ·»åŠ åˆ‡æ�¢å…‰æ ‡é—ªçƒ�å�œæ¢çš„选项。 (由 Zackery Spytz 在 bpo-4603 ä¸è´¡çŒ®ã€‚)
Esc é”®çŽ°åœ¨ä¼šå…³é— IDLE 补全æ��示窗å�£ã€‚ (由 Johnny Najera 在 bpo-38944 ä¸è´¡çŒ®ã€‚)
上述修改已被å��å�‘ç§»æ¤�到 3.7 维护å�‘行版ä¸ã€‚
æ·»åŠ å…³é”®å—到模å�—å��称补全列表。 (由 Terry J. Reedy 在 bpo-37765 ä¸è´¡çŒ®ã€‚)
inspect¶
inspect.getdoc() 函数现在å�¯ä»¥æ‰¾åˆ° __slots__ 的文档å—ç¬¦ä¸²ï¼Œå¦‚æžœè¯¥å±žæ€§æ˜¯ä¸€ä¸ªå…ƒç´ å€¼ä¸ºæ–‡æ¡£å—符串的 dict çš„è¯�。 è¿™æ��供了类似于目å‰�已有的 property(), classmethod() å’Œ staticmethod() ç‰å‡½æ•°çš„æ–‡æ¡£é€‰é¡¹:
class AudioClip:
__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
'duration': 'in seconds, rounded up to an integer'}
def __init__(self, bit_rate, duration):
self.bit_rate = round(bit_rate / 1000.0, 1)
self.duration = ceil(duration)
(由 Raymond Hettinger 在 bpo-36326 ä¸è´¡çŒ®ã€‚)
io¶
在开å�‘模å¼� (-X env) å’Œ 调试编译版 ä¸ï¼Œio.IOBase 终结器现在会在 close() 方法失败时将异常写入日志。 å�‘生的异常在å�‘布编译版ä¸ä¼šè¢«é�™é»˜åœ°å¿½ç•¥ã€‚ (由 Victor Stinner 在 bpo-18748 ä¸è´¡çŒ®ã€‚)
itertools¶
itertools.accumulate() å‡½æ•°å¢žåŠ äº†å�¯é€‰çš„ initial 关键å—å�‚数用æ�¥æŒ‡å®šä¸€ä¸ªåˆ�始值:
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
(由 Lisa Roach 在 bpo-34659 ä¸è´¡çŒ®ã€‚)
json.tool¶
æ·»åŠ é€‰é¡¹ --json-lines 用于将æ¯�个输入行解æž�为å�•独的 JSON 对象。 (由 Weipeng Hong 在 bpo-31553 ä¸è´¡çŒ®ã€‚)
logging¶
为 logging.basicConfig() æ·»åŠ äº† force 关键å—å�‚数,当设为真值时,关è�”åˆ°æ ¹æ—¥å¿—è®°å½•å™¨çš„ä»»ä½•çŽ°æœ‰å¤„ç�†ç¨‹åº�都将在执行由其他å�‚数所指定的é…�置之å‰�被移除并关é—。
这解决了一个长期å˜åœ¨çš„问题。 当一个日志处ç�†å™¨æˆ– basicConfig() 被调用时,对 basicConfig() çš„å�Žç»è°ƒç”¨ä¼šè¢«é�™é»˜åœ°å¿½ç•¥ã€‚ 这导致使用交互æ��示符或 Jupyter 笔记本更新ã€�试验或讲解å�„ç§�日志é…�置选项å�˜å¾—相当困难。
(由 Raymond Hettinger æ��议,由 Donghee Na 实现,并由 Vinay Sajip å®¡æ ¸å�Žåœ¨ bpo-33897 ä¸è´¡çŒ®ã€‚)
math¶
æ·»åŠ äº†æ–°çš„å‡½æ•° math.dist() ç”¨äºŽè®¡ç®—ä¸¤ç‚¹ä¹‹é—´çš„æ¬§å‡ é‡Œå¾—è·�离。 (由 Raymond Hettinger 在 bpo-33089 ä¸è´¡çŒ®ã€‚)
扩展了 math.hypot() 函数以便处ç�†æ›´å¤šçš„维度。 之å‰�它仅支æŒ� 2-D 的情况。 (由 Raymond Hettinger 在 bpo-33089 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†æ–°çš„å‡½æ•° math.prod() 作为的 sum() å�Œç±»ï¼Œè¯¥å‡½æ•°è¿”回 'start' 值 (默认值: 1) 乘以一个数å—å�¯è¿ä»£å¯¹è±¡çš„积:
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
(由 Pablo Galindo 在 bpo-35606 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†ä¸¤ä¸ªæ–°çš„ç»„å�ˆå‡½æ•° math.perm() å’Œ math.comb():
>>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
120
(由 Yash Aggarwal, Keller Fuchs, Serhiy Storchaka å’Œ Raymond Hettinger 在 bpo-37128, bpo-37178 å’Œ bpo-35431 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†ä¸€ä¸ªæ–°å‡½æ•° math.isqrt() ç”¨äºŽè®¡ç®—ç²¾ç¡®æ•´æ•°å¹³æ–¹æ ¹è€Œæ— éœ€è½¬æ�¢ä¸ºæµ®ç‚¹æ•°ã€‚ 该新函数支æŒ�ä»»æ„�大整数。 它的执行速度比 floor(sqrt(n)) 快但是比 math.sqrt() æ…¢:
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1) # correct
650320426
>>> floor(sqrt(s - 1)) # incorrect
650320427
(由 Mark Dickinson 在 bpo-36887 ä¸è´¡çŒ®ã€‚)
函数 math.factorial() ä¸�å†�接å�—é�žæ•´æ•°ç±»å�‚数。 (由 Pablo Galindo 在 bpo-33083 ä¸è´¡çŒ®ã€‚)
mmap¶
mmap.mmap 类现在具有一个 madvise() 方法用于访问 madvise() 系统调用。 (由 Zackery Spytz 在 bpo-32941 ä¸è´¡çŒ®ã€‚)
multiprocessing¶
æ·»åŠ äº†æ–°çš„ multiprocessing.shared_memory 模å�—。 (由 Davin Potts 在 bpo-35813 ä¸è´¡çŒ®ã€‚)
在macOS上,现在默认使用的å�¯åŠ¨æ–¹å¼�是*spawn*å�¯åŠ¨æ–¹å¼�。 (由 Victor Stinner 在 bpo-33725 ä¸è´¡çŒ®ã€‚)
os¶
在 Windows ä¸Šæ·»åŠ äº†æ–°å‡½æ•° add_dll_directory() 用于在导入扩展模å�—或使用 ctypes åŠ è½½ DLL 时为本机ä¾�èµ–æ��ä¾›é¢�外æ�œç´¢è·¯å¾„ 。 (由 Steve Dower 在 bpo-36085 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†æ–°çš„ os.memfd_create() 函数用于包装 memfd_create() 系统调用。 (由 Zackery Spytz å’Œ Christian Heimes 在 bpo-26836 ä¸è´¡çŒ®ã€‚)
在 Windows 上,大部分用于处ç�†é‡�è§£æž�点,(包括符å�·é“¾æŽ¥å’Œç›®å½•连接)的手动逻辑已被委托给æ“�作系统。 特别地,os.stat() 现在将会é��历æ“�作系统所支æŒ�的任何内容,而 os.lstat() å°†å�ªæ‰“å¼€è¢«æ ‡è¯†ä¸ºâ€œå��称代ç�†â€�çš„é‡�è§£æž�点,而其è¦�ç”± os.stat() 打开其他的é‡�è§£æž�点。 在所有情况下,stat_result.st_mode å°†å�ªä¸ºç¬¦å�·é“¾æŽ¥è€Œé�žå…¶ä»–ç§�类的é‡�è§£æž�点设置 S_IFLNK。 è¦�æ ‡è¯†å…¶ä»–ç§�类的é‡�è§£æž�点,请检查新的 stat_result.st_reparse_tag 属性。
在 Windows 上,os.readlink() 现在能够读å�–目录连接。 请注æ„� islink() 会对目录连接返回 Falseï¼Œå› æ¤é¦–先检查 islink 的代ç �å°†è¿žç»æŠŠè¿žæŽ¥è§†ä¸ºç›®å½•ï¼Œè€Œä¼šå¤„ç�† os.readlink() 所引å�‘错误的代ç �现在会把连接视为链接。
(由 Steve Dower 在 bpo-37834 ä¸è´¡çŒ®ã€‚)
os.path¶
返回布尔值结果的 os.path 函数例如 exists(), lexists(), isdir(), isfile(), islink(), 以å�Š ismount() 现在对于包å�«åœ¨ OS å±‚çº§æ— æ³•è¡¨ç¤ºçš„å—符或å—节的路径将会返回 False 而ä¸�是引å�‘ ValueError 或其å�ç±» UnicodeEncodeError å’Œ UnicodeDecodeError。 (由 Serhiy Storchaka 在 bpo-33721 ä¸è´¡çŒ®ã€‚)
expanduser() 在 Windows 上现在改用 USERPROFILE 环境å�˜é‡�而ä¸�å†�使用 HOME,å�Žè€…通常ä¸�会为一般用户账户设置。 (由 Anthony Sottile 在 bpo-36264 ä¸è´¡çŒ®ã€‚)
isdir() 在 Windows 上将ä¸�å†�为ä¸�å˜åœ¨çš„目录的链接返回 True。
realpath() 在 Windows 上现在会识别�解�点,包括符�链接和目录连接。
(由 Steve Dower 在 bpo-37834 ä¸è´¡çŒ®ã€‚)
pathlib¶
返回布尔值结果的 pathlib.Path 方法例如 exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() 现在对于包å�«åœ¨ OS å±‚çº§æ— æ³•è¡¨ç¤ºçš„å—符或å—节的路径将会返回 False 而ä¸�是引å�‘ ValueError 或其å�ç±» UnicodeEncodeError。 (由 Serhiy Storchaka 在 bpo-33721 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† pathlib.Path.link_to(),它å�¯ä»¥åˆ›å»ºæŒ‡å�‘一个路径的硬链接。 (由 Joannah Nanjekye 在 bpo-26978 ä¸è´¡çŒ®ï¼‰ 请注æ„� link_to 在 3.10 ä¸è¢«å¼ƒç”¨å¹¶åœ¨ 3.12 ä¸è¢«ç§»é™¤å¹¶æ”¹ç”¨åœ¨ 3.10 䏿·»åŠ çš„ hardlink_to 方法,它与现有 symlink_to çš„è¯æ³•相匹é…�。
pickle¶
pickle 扩展å�类化针对 C 优化的 Pickler 现在å�¯é€šè¿‡å®šä¹‰ç‰¹æ®Šçš„ reducer_override() 方法æ�¥é‡�载函数和类的å°�å˜é€»è¾‘。 (由 Pierre Glaser å’Œ Olivier Grisel 在 bpo-35900 ä¸è´¡çŒ®ã€‚)
plistlib¶
æ·»åŠ äº†æ–°çš„ plistlib.UID å¹¶å�¯åŠ¨äº†å¯¹è¯»å�–和写入ç»�过 NSKeyedArchiver ç¼–ç �的二进制 plists 的支æŒ�。 (由 Jon Janzen 在 bpo-26707 ä¸è´¡çŒ®ã€‚)
pprint¶
pprint 模å�—ä¸ºä¸€äº›å‡½æ•°æ·»åŠ äº† sort_dicts å½¢å�‚。 默认情况下,这些函数会继ç»åœ¨æ¸²æŸ“或打å�°ä¹‹å‰�对å—典进行排åº�。 但是,如果 sort_dicts 设为å�‡å€¼ï¼Œåˆ™å—典将ä¿�æŒ�é”®æ�’入时的顺åº�。 这在调试期间与 JSON 输入进行比较时会很有用。
除æ¤ä¹‹å¤–ï¼Œè¿˜å¢žåŠ äº†ä¸€ä¸ªæ–¹ä¾¿çš„æ–°å‡½æ•° pprint.pp(),它类似于 pprint.pprint() 但它的 sort_dicts 默认为 False:
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40) # Original order
{'source': 'input.txt',
'operation': 'filter',
'destination': 'output.txt'}
>>> pprint(d, width=40) # Keys sorted alphabetically
{'destination': 'output.txt',
'operation': 'filter',
'source': 'input.txt'}
(由 Rémi Lapeyre 在 bpo-30670 ä¸è´¡çŒ®ã€‚)
py_compile¶
py_compile.compile() 现在支æŒ�é�™é»˜æ¨¡å¼�。 (由 Joannah Nanjekye 在 bpo-22640 ä¸è´¡çŒ®ã€‚)
shlex¶
新增了 shlex.join() 函数作为 shlex.split() 的逆æ“�作。 (由 Bo Bayles 在 bpo-32102 ä¸è´¡çŒ®ã€‚)
shutil¶
shutil.copytree() 现在接å�—æ–°çš„ dirs_exist_ok 关键å—å�‚数。 (由 Josh Bronson 在 bpo-20849 ä¸è´¡çŒ®ã€‚)
shutil.make_archive() 现在对新的归档默认使用 modern pax (POSIX.1-2001) æ ¼å¼�以æ��å�‡å�¯ç§»æ¤�æ€§å’Œæ ‡å‡†ä¸€è‡´æ€§ï¼Œæ¤ç‰¹æ€§ç»§æ‰¿è‡ªå¯¹ tarfile 模å�—的相应更改。 (由 C.A.M. Gerlach 在 bpo-30661 ä¸è´¡çŒ®ã€‚)
shutil.rmtree() 在 Windows 上现在会移除目录连接而ä¸�会递归地先移除其ä¸çš„内容。 (由 Steve Dower 在 bpo-37834 ä¸è´¡çŒ®ã€‚)
socket¶
æ·»åŠ äº†ä¾¿æ�·çš„ create_server() å’Œ has_dualstack_ipv6() 函数以自动化在创建æœ�åŠ¡å™¨å¥—æŽ¥å—æ—¶é€šå¸¸æƒ…况下所必须的任务,包括在å�Œä¸€å¥—接å—ä¸å�Œæ—¶æŽ¥å�— IPv4 å’Œ IPv6 连接。 (由 Giampaolo Rodolà 在 bpo-17561 ä¸è´¡çŒ®ã€‚)
socket.if_nameindex(), socket.if_nametoindex() å’Œ socket.if_indextoname() 函数已ç»�在 Windows 上实现。 (由 Zackery Spytz 在 bpo-37007 ä¸è´¡çŒ®ã€‚)
ssl¶
å¢žåŠ äº† post_handshake_auth å’Œ verify_client_post_handshake() 分别å�¯ç”¨å’Œåˆ�始化 TLS 1.3 æ�¡æ‰‹å�ŽéªŒè¯�。 (由 Christian Heimes 在 bpo-34670 ä¸è´¡çŒ®ã€‚)
statistics¶
æ·»åŠ äº† statistics.fmean() 作为 statistics.mean() 的更快速的浮点数版版本。 (由 Raymond Hettinger å’Œ Steven D'Aprano 在 bpo-35904 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† statistics.geometric_mean() (由 Raymond Hettinger 在 bpo-27181 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† statistics.multimode() 用于返回最常è§�值的列表。 (由 Raymond Hettinger 在 bpo-35892 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† statistics.quantiles() 用于将数æ�®æˆ–åˆ†å¸ƒåˆ’åˆ†ä¸ºå¤šä¸ªç‰æ¦‚率区间(例如四分ä½�ã€�å��分ä½�或百分ä½�)。 (由 Raymond Hettinger 在 bpo-36546 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº† statistics.NormalDist 用于创建和æ“�纵éš�机å�˜é‡�çš„æ£æ€�分布。 (由 Raymond Hettinger 在 bpo-36018 ä¸è´¡çŒ®ã€‚)
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281
>>> temperature_feb.cdf(3) # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762
>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)
>>> temperature_feb * (9/5) + 32 # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3) # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]
sys¶
æ·»åŠ äº†æ–°çš„ sys.unraisablehook() 函数,å�¯è¢«é‡�载以便控制如何处ç�†â€œä¸�å�¯å¼•å�‘的异常â€�。 它会在å�‘生了一个异常但 Python 没有办法处ç�†æ—¶è¢«è°ƒç”¨ã€‚ 例如,当一个æž�构器在垃圾回收时 (gc.collect()) 所引å�‘的异常。 (由 Victor Stinner 在 bpo-36829 ä¸è´¡çŒ®ã€‚)
tarfile¶
tarfile 模å�—现在对新的归档默认使用 modern pax (POSIX.1-2001) æ ¼å¼�而ä¸�å†�是之å‰�çš„ GNU ä¸“å±žæ ¼å¼�。 è¿™é€šè¿‡æ ‡å‡†åŒ–å’Œå�¯æ‰©å±•æ ¼å¼�的统一编ç � (UTF-8) æ��å�‡äº†è·¨å¹³å�°å�¯ç§»æ¤�性,还æ��供了其他一些益处。 (由 C.A.M. Gerlach 在 bpo-36268 ä¸è´¡çŒ®ã€‚)
threading¶
æ·»åŠ äº†æ–°çš„ threading.excepthook() 函数用æ�¥å¤„ç�†æœªæ�•获的 threading.Thread.run() 异常。 它å�¯è¢«é‡�载以便控制如何处ç�†æœªæ�•获的 threading.Thread.run() 异常。 (由 Victor Stinner 在 bpo-1230540 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†æ–°çš„ threading.get_native_id() 函数以å�Š threading.Thread 类的 native_id 属性。 å®ƒä»¬ä¼šè¿”å›žå†…æ ¸æ‰€åˆ†é…�给当å‰�线程的原生整数线程 ID。 æ¤ç‰¹æ€§ä»…在特定平å�°ä¸Šå�¯ç”¨ï¼Œå�‚è§� get_native_id 了解详情。 (由 Jake Tesler 在 bpo-36084 ä¸è´¡çŒ®ã€‚)
tokenize¶
当æ��ä¾›ä¸�带末尾新行的输入时,tokenize 模å�—现在会éš�å¼�åœ°æ·»åŠ NEWLINE 形符。 æ¤è¡Œä¸ºçŽ°åœ¨å·²ä¸Ž C è¯�法分æž�器的内部行为相匹é…�。 (由 Ammar Askar 在 bpo-33899 ä¸è´¡çŒ®ã€‚)
tkinter¶
在 tkinter.Spinbox 䏿·»åŠ äº†æ–¹æ³• selection_from(), selection_present(), selection_range() å’Œ selection_to()。 (由 Juliette Monsel 在 bpo-34829 ä¸è´¡çŒ®ã€‚)
在 tkinter.Canvas ç±»ä¸æ·»åŠ äº†æ–¹æ³• moveto()。 (由 Juliette Monsel 在 bpo-23831 ä¸è´¡çŒ®ã€‚)
tkinter.PhotoImage 类现在具有 transparency_get() å’Œ transparency_set() 方法。 (由 Zackery Spytz 在 bpo-25451 ä¸è´¡çŒ®ã€‚)
time¶
为 macOS 10.12 æ·»åŠ äº†æ–°çš„æ—¶é’Ÿ CLOCK_UPTIME_RAW。 (由 Joannah Nanjekye 在 bpo-35702 ä¸è´¡çŒ®ã€‚)
typing¶
typing 模å�—åŠ å…¥äº†ä¸€äº›æ–°ç‰¹æ€§ï¼š
一个带有键专属类型的å—典类型。 å�‚è§� PEP 589 å’Œ
typing.TypedDict。 TypedDict å�ªä½¿ç”¨å—符串作为键。 默认情况下æ¯�个键都è¦�求æ��供。 指定 "total=False" 以å…�许键作为å�¯é€‰é¡¹:class Location(TypedDict, total=False): lat_long: tuple grid_square: str xy_coordinate: tuple
Literal 类型。 �� PEP 586 和
typing.Literal。 Literal 类型指明一个形å�‚或返回值被é™�定为一个或多个特定的å—é�¢å€¼:def get_status(port: int) -> Literal['connected', 'disconnected']: ...
"Final" ���函数�方法和类。 �� PEP 591,
typing.Finalå’Œtyping.final()。 final é™�定符会指示é�™æ€�类型检查器é™�制进行å�类化ã€�é‡�载或é‡�新赋值:pi: Final[float] = 3.1415926536
�议定义。 �� PEP 544,
typing.Protocolå’Œtyping.runtime_checkable()。 简å�•çš„ ABC 例如typing.SupportsInt现在是Protocolçš„å�类。新的å��议类
typing.SupportsIndex。新的函数
typing.get_origin()和typing.get_args()。
unicodedata¶
unicodedata 模�现在已�级为使用 Unicode 12.1.0 �布版。
新的函数 is_normalized() å�¯è¢«ç”¨æ�¥éªŒè¯�å—符串是å�¦ä¸ºç‰¹å®šæ£è§„å½¢å¼�,通常会比实际进行å—符串æ£è§„化è¦�快得多。 (由 Max Belanger, David Euresti å’Œ Greg Price 在 bpo-32285 å’Œ bpo-37966 ä¸è´¡çŒ®ã€‚)
unittest¶
æ·»åŠ äº† AsyncMock 以支æŒ�异æ¥ç‰ˆæœ¬çš„ Mock。 å�Œæ—¶ä¹Ÿæ·»åŠ äº†ç›¸åº”çš„æ–言函数用于测试。 (由 Lisa Roach 在 bpo-26467 ä¸è´¡çŒ®ã€‚)
unittest æ·»åŠ äº† addModuleCleanup() å’Œ addClassCleanup() 以支æŒ�对 setUpModule() å’Œ setUpClass() 进行清ç�†ã€‚ (由 Lisa Roach 在 bpo-24412 ä¸è´¡çŒ®ã€‚)
一些模拟æ–言函数现在也会在失败时打å�°ä¸€ä¸ªå®žé™…调用列表。 (由 Petter Strandmark 在 bpo-35047 ä¸è´¡çŒ®ã€‚)
unittest 模å�—已支æŒ�通过 unittest.IsolatedAsyncioTestCase æ�¥ä½¿ç”¨å��程作为测试用例。 (由 Andrew Svetlov 在 bpo-32972 ä¸è´¡çŒ®ã€‚)
示例:
import unittest
class TestRequest(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self):
self.connection = await AsyncConnection()
async def test_get(self):
response = await self.connection.get("https://example.com")
self.assertEqual(response.status_code, 200)
async def asyncTearDown(self):
await self.connection.close()
if __name__ == "__main__":
unittest.main()
venv¶
现在 venv 在所有平å�°ä¸Šéƒ½ä¼šåŒ…å�« Activate.ps1 脚本用于在 PowerShell Core 6.1 下激活虚拟环境。 (由 Brett Cannon 在 bpo-32718 ä¸è´¡çŒ®ã€‚)
weakref¶
ç”± weakref.proxy() 返回的代ç�†å¯¹è±¡çŽ°åœ¨é™¤å…¶ä»–ç®—æœ¯è¿�算符外也支æŒ�矩阵乘法è¿�算符 @ å’Œ @=。 (由 Mark Dickinson 在 bpo-36669 ä¸è´¡çŒ®ã€‚)
xml¶
作为对 DTD 和外部实体检索的缓解,在默认情况下 xml.dom.minidom å’Œ xml.sax 模å�—ä¸�å†�处ç�†å¤–部实体。 (由 Christian Heimes 在 bpo-17239 ä¸è´¡çŒ®ã€‚)
xml.etree.ElementTree 模å�—ä¸çš„ .find*() 方法支æŒ�通é…�符æ�œç´¢ä¾‹å¦‚ {*}tagï¼Œæ¤æ�œç´¢ä¼šå¿½ç•¥å‘½å��空间以å�Šè¿”回给定命å��ç©ºé—´ä¸æ‰€æœ‰æ ‡ç¾çš„ {namespace}*。 (由 Stefan Behnel 在 bpo-28238 ä¸è´¡çŒ®ã€‚)
xml.etree.ElementTree 模å�—æ��供了实现 C14N 2.0 的新函数 –xml.etree.ElementTree.canonicalize()。 (由 Stefan Behnel 在 bpo-13611 ä¸è´¡çŒ®ã€‚)
xml.etree.ElementTree.XMLParser çš„ç›®æ ‡å¯¹è±¡å�¯é€šè¿‡æ–°çš„回调方法 start_ns() å’Œ end_ns() æ�¥æŽ¥å�—命å��空间声明事件。 æ¤å¤–,xml.etree.ElementTree.TreeBuilder ç›®æ ‡å�¯è¢«é…�置为处ç�†æœ‰å…³æ³¨é‡Šå’Œå¤„ç�†æŒ‡ä»¤äº‹ä»¶ä»¥å°†å®ƒä»¬åŒ…å�«åœ¨æ‰€ç”Ÿæˆ�çš„æ ‘å½“ä¸ã€‚ (由 Stefan Behnel 在 bpo-36676 å’Œ bpo-36673 ä¸è´¡çŒ®ã€‚)
xmlrpc¶
xmlrpc.client.ServerProxy 现在支æŒ�å�¯é€‰çš„ headers 关键å—å�‚数作为éš�å�Œæ¯�次请求å�‘é€�çš„ HTTP æ ‡å¤´åº�列。 æ¤ç‰¹å¾�的作用之一是使得从默认的基础认è¯�å�‡çº§åˆ°æ›´å¿«é€Ÿçš„会è¯�认è¯�æˆ�为å�¯èƒ½ã€‚ (由 Cédric Krier 在 bpo-35153 ä¸è´¡çŒ®ã€‚)
性能优化¶
subprocess模�现在能在�些情况下使用os.posix_spawn()函数以获得更好的性能。 目�,它的使用仅� macOS 和 Linux(使用 glibc 2.24 或更新版本),并�求满足以下�件:close_fds 为�值;
preexec_fn, pass_fds, cwd 和 start_new_session 形�未设置;
executable 路径包�一个目录。
(由 Joannah Nanjekye å’Œ Victor Stinner 在 bpo-35537 ä¸è´¡çŒ®ã€‚)
shutil.copyfile(),shutil.copy(),shutil.copy2(),shutil.copytree()å’Œshutil.move()在 Linux å’Œ macOS 上会使用平å�°ä¸“属的 "fast-copy" 系统调用以æ��高效率。 "fast-copy" æ„�味ç�€æ‹·è´�æ“�作å�‘ç”ŸäºŽå†…æ ¸ä¸ï¼Œä»Žè€Œé�¿å…�在进行 "outfd.write(infd.read())" ç‰æ“�作时使用 Python ä¸çš„用户空间缓冲区。 在 Windows 上shutil.copyfile()会使用更大的默认缓冲区(1 MiB 而ä¸�是 16 KiB)并且使用基于memoryview()çš„shutil.copyfileobj()版本。 在å�Œä¸€åˆ†åŒºå†…æ‹·è´�一个 512 MiB 文件的速度æ��å�‡åœ¨ Linux 上约为 +26%,在 macOS 上为 +50%,在 Windows 上为 +40%。 æ¤å¤–还将消耗更少的 CPU 周期。 å�‚è§� ä¾�赖于具体平å�°çš„高效拷è´�æ“�作 一节。 (由 Giampaolo Rodolà 在 bpo-33671 ä¸è´¡çŒ®ã€‚)shutil.copytree()ä¼šæ ¹æ�®å…¶æ‰€ç”¨ç¼“å˜çš„os.stat()值使用os.scandir()函数å�Šæ‰€æœ‰æ‹·è´�函数。 æ‹·è´�一个包å�« 8000 文件的目录的速度æ��å�‡åœ¨ Linux 上约为 +9%,在 Windows 上为 +20%,对于 Windows SMB 共享目录则为 +30%。 æ¤å¤–os.stat()系统调用的次数也å‡�少了 38%,使得shutil.copytree()在网络文件系统上会特别快速。 (由Giampaolo Rodolà 在 bpo-33695 ä¸è´¡çŒ®ã€‚)pickle模å�—使用的默认å��议现在为 Protocol 4,最早在 Python 3.4 ä¸è¢«å¼•入。 它æ��供了比自 Python 3.0 èµ·å�¯ç”¨çš„ Protocol 3 更好的性能和更å°�的数æ�®å°ºå¯¸ã€‚从
PyGC_Head移除了一个Py_ssize_tæˆ�员。 所有跟踪 GC 的对象(例如 tuple, list, dict)大å°�å‡�少了 4 或 8 å—节。 (由 Inada Naoki 在 bpo-33597 ä¸è´¡çŒ®ã€‚)uuid.UUID现在会使用__slots__以å‡�少内å˜è¶³è¿¹ã€‚ (由 Wouter Bolsterlee å’Œ Tal Einat 在 bpo-30977 ä¸è´¡çŒ®ã€‚)operator.itemgetter()的性能æ��å�‡äº† 33%。 优化了å�‚数处ç�†ï¼Œå¹¶ä¸ºå¸¸è§�的在元组ä¸å�•个é�žè´Ÿæ•´æ•°ç´¢å¼•的情况新增了一æ�¡å¿«é€Ÿè·¯å¾„ï¼ˆè¿™æ˜¯æ ‡å‡†åº“ä¸çš„典型用例)。 (由 Raymond Hettinger 在 bpo-35664 ä¸è´¡çŒ®ã€‚åŠ å¿«äº†åœ¨
collections.namedtuple()ä¸çš„å—æ®µæŸ¥æ‰¾ã€‚ 它们现在的速度快了两å€�以上,æˆ�为 Python 䏿œ€å¿«çš„实例å�˜é‡�查找形å¼�。 (由 Raymond Hettinger, Pablo Galindo å’Œ Joe Jevnik, Serhiy Storchaka 在 bpo-32492 ä¸è´¡çŒ®ã€‚)如果输入的å�¯è¿ä»£å¯¹è±¡çš„长度已知 (å�³è¾“入对象实现了
__len__),listæž„é€ å™¨ä¸�会过度分é…�内部项缓冲区。 这使得所创建的列表资æº�å� 用平å�‡å‡�少了 12%。 (由 Raymond Hettinger å’Œ Pablo Galindo 在 bpo-33234 ä¸è´¡çŒ®ã€‚)类å�˜é‡�å†™å…¥é€Ÿåº¦åŠ å€�。 当一个é�žå†—余属性被更新时,之å‰�å˜åœ¨ä¸€ä¸ªæ›´æ–° slots çš„é�žå¿…è¦�调用。 (由 Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, Neil Schemenauer, å’Œ Serhiy Storchaka 在 bpo-36012 ä¸è´¡çŒ®ã€‚)
å‡�å°‘äº†ä¼ é€’ç»™è®¸å¤šå†…ç½®å‡½æ•°å’Œæ–¹æ³•çš„å�‚数转æ�¢çš„开销。 这使得æŸ�些简å�•内置函数和方法的速度æ��å�‡äº† 20--50%。 (由 Serhiy Storchaka 在 bpo-23867, bpo-35582 å’Œ bpo-36127 ä¸è´¡çŒ®ã€‚)
LOAD_GLOBAL指令现在会使用新的 "per opcode cache" 机制。 它的速度现在æ��å�‡äº†å¤§çº¦ 40%。 (由 Yury Selivanov å’Œ Inada Naoki 在 bpo-26219 ä¸è´¡çŒ®ã€‚)
构建和 C API 的改�¶
默认的
sys.abiflagsæˆ�为一个空å—符串:pymalloc çš„mæ——æ ‡ä¸�å†�有æ„�ä¹‰ï¼ˆæ— è®ºæ˜¯å�¦å�¯ç”¨ pymalloc 构建都是兼容 ABI çš„ï¼‰å› æ¤å·²è¢«ç§»é™¤ã€‚ (由 Victor Stinner 在 bpo-36707 ä¸è´¡çŒ®ã€‚)改å�˜çš„例å�:
�会安装
python3.8程�,��有python3.8m程�。�会安装
python3.8-config脚本,ä¸�å†�有python3.8m-config脚本。mæ——æ ‡å·²ç»�从动æ€�库文件å��å�Žç¼€ä¸ç§»é™¤ï¼šåŒ…æ‹¬æ ‡å‡†åº“ä¸çš„æ‰©å±•模å�—以å�Šç¬¬ä¸‰æ–¹åŒ…所产生和安装的模å�—例如从 PyPI 下载的模å�—。 以 Linux 为例,Python 3.7 çš„å�Žç¼€.cpython-37m-x86_64-linux-gnu.so在 Python 3.8 䏿”¹ä¸º.cpython-38-x86_64-linux-gnu.so。
�新组织了所有头文件以更好地区分���类的 API:
Include/*.h应为å�¯ç§»æ¤�的公有稳定版 C API。Include/cpython/*.h应为 CPython 专属的ä¸�稳定版 C API;公有 API,部分ç§�有 API 附åŠ_Pyor_PYå‰�缀。Include/internal/*.h应为 CPython 特别专属的ç§�有内部 C API。 æ¤ API ä¸�具备å�‘下兼容ä¿�è¯�并且ä¸�应在 CPython 以外被使用。 它们的公开仅适用于特别é™�定的需求例如调试器和性能分æž�ç‰å¿…须直接访问 CPython 内部数æ�®è€Œä¸�通过调用函数的应用。 æ¤ API 现在是通过make install安装的。
(由 Victor Stinner 在 bpo-35134 å’Œ bpo-35081 ä¸è´¡çŒ®ï¼Œç›¸å…³å·¥ä½œç”± Eric Snow 在 Python 3.7 ä¸å�‘起。)
�些�已被转�为��内�函数:形�类型和返回类型定义良好,它们��会有与�相关的问题,��具有局部作用域。 例如:
PyObject_INIT(),PyObject_INIT_VAR()�有函数:
_PyObject_GC_TRACK(),_PyObject_GC_UNTRACK(),_Py_Dealloc()
(由 Victor Stinner 在 bpo-35059 ä¸è´¡çŒ®ã€‚)
PyByteArray_Init()å’ŒPyByteArray_Fini()函数已被移除。 它们自 Python 2.7.4 å’Œ Python 3.2.0 起就没有任何用处,被排除在å�—é™� API (稳定 ABI) 之外,并且未被写入文档。 (由 Victor Stinner 在 bpo-35713 ä¸è´¡çŒ®ã€‚)PyExceptionClass_Name()的结果类型现在是const char *而é�žchar *。 (由 Serhiy Storchaka 在 bpo-33818 ä¸è´¡çŒ®ã€‚)Modules/Setup.dist与Modules/Setup两者的共å˜å·²è¢«ç§»é™¤ã€‚ 之å‰�在更新 CPython æº�ç �æ ‘æ—¶ï¼Œå¼€å�‘者必须手动拷è´�Modules/Setup.dist(在æº�ç �æ ‘å†…) 到Modules/Setup(åœ¨æž„å»ºæ ‘å†…) 以å��æ˜ ä¸Šæ¸¸çš„ä»»ä½•æ”¹å�˜ã€‚ 旧特性对打包者æ�¥è¯´æœ‰ä¸€ç‚¹ç›Šå¤„,但代价是对追踪 CPython å¼€å�‘进程的开å�‘è€…é€ æˆ�ç»�å¸¸æ€§çš„éº»çƒ¦ï¼Œå› ä¸ºå¿˜è®°æ‹·è´�该文件å�¯èƒ½å¯¼è‡´æž„建失败。现在构建系统总是会从æº�ç �æ ‘å†…çš„
Modules/Setup读å�–æ•°æ�®ã€‚ 建议希望定制该文件的开å�‘者在 CPython 的一个 git 分å�‰æˆ–è¡¥ä¸�文件ä¸ç»´æŠ¤ä»–们的更改,就如他们对æº�ç �æ ‘å�šä»»ä½•其他改å�˜æ—¶ä¸€æ ·ã€‚(由 Antoine Pitrou 在 bpo-32430 ä¸è´¡çŒ®ã€‚)
å°† Python æ•°å—转æ�¢ä¸º C 整型的函数例如
PyLong_AsLong()以å�Šå¸¦æœ‰'i'之类整型转æ�¢æ ¼å¼�å�•元的å�‚æ•°è§£æž�函数例如PyArg_ParseTuple()现在如果å�¯èƒ½å°†ä¼šä½¿ç”¨__index__()特殊方法而ä¸�是__int__()。 对于带有__int__()方法但没有__index__()方法的对象 (例如Decimalå’ŒFraction) 将会å�‘出弃用è¦å‘Šã€‚ 对于实现了__index__()的对象PyNumber_Check()现在将返回1。PyNumber_Long(),PyNumber_Float()å’ŒPyFloat_AsDouble()现在如果å�¯èƒ½ä¹Ÿå°†ä¼šä½¿ç”¨__index__()方法。 (由 Serhiy Storchaka 在 bpo-36048 å’Œ bpo-20092 ä¸è´¡çŒ®ã€‚ï¼‰å †åˆ†é…�ç±»åž‹å¯¹è±¡çŽ°åœ¨å°†å¢žåŠ å®ƒä»¬åœ¨
PyObject_Init()(å�Šå…¶å¯¹åº”çš„å®�PyObject_INIT) ä¸çš„引用计数而ä¸�是在PyType_GenericAlloc()ä¸ã€‚ 修改实例分é…�æˆ–ä¸æ¢åˆ†é…�的类型å�¯èƒ½éœ€è¦�进行调整。 (由 Elizondo 在 bpo-35810 ä¸è´¡çŒ®ã€‚)新增函数
PyCode_NewWithPosOnlyArgs()å…�许创建代ç �对象如PyCode_New(),但带有一个é¢�外的 posonlyargcount å½¢å�‚以指明仅é™�ä½�ç½®å�‚数的数é‡�。 (由 Pablo Galindo 在 bpo-37221 ä¸è´¡çŒ®ã€‚)Py_SetPath()现在会将sys.executable设置为程åº�完整路径 (Py_GetProgramFullPath()) 而ä¸�是程åº�å��ç§° (Py_GetProgramName())。 (由 Victor Stinner 在 bpo-38234 ä¸è´¡çŒ®ã€‚)
弃用¶
distutils çš„
bdist_wininst命令现在已弃用,请改用bdist_wheel(wheel 包)。 (由 Victor Stinner 在 bpo-37481 ä¸è´¡çŒ®ã€‚)ElementTree模å�—ä¸çš„已弃用方法getchildren()å’Œgetiterator()现在会引å�‘DeprecationWarning而ä¸�是PendingDeprecationWarning。 它们将在 Python 3.9 ä¸è¢«ç§»é™¤ã€‚ (由 Serhiy Storchaka 在 bpo-29209 ä¸è´¡çŒ®ã€‚)将ä¸�是
concurrent.futures.ThreadPoolExecutorçš„å®žä¾‹çš„å¯¹è±¡ä¼ ç»™loop.set_default_executor()已被弃用,并将在 Python 3.9 ä¸è¢«ç¦�æ¢ã€‚ (由 Elvis Pranskevichus 在 bpo-34075 ä¸è´¡çŒ®ã€‚)xml.dom.pulldom.DOMEventStream,wsgiref.util.FileWrapperå’Œfileinput.FileInputçš„__getitem__()方法已被弃用。这些方法的实现会忽略它们的 index å½¢å�‚,并改为返回下一æ�¡ç›®ã€‚ (由 Berker Peksag 在 bpo-9372 ä¸è´¡çŒ®ã€‚)
typing.NamedTuple类已弃用了_field_types属性而改用具有å�Œæ ·ä¿¡æ�¯çš„__annotations__属性。 (由 Raymond Hettinger 在 bpo-36320 ä¸è´¡çŒ®ã€‚)astç±»Num,Str,Bytes,NameConstantå’ŒEllipsis被视为已弃用并将在未æ�¥çš„ Python 版本ä¸è¢«ç§»é™¤ã€‚ 应当改用Constant。 (由 Serhiy Storchaka 在 bpo-32892 ä¸è´¡çŒ®ã€‚)ast.NodeVisitor的方法visit_Num(),visit_Str(),visit_Bytes(),visit_NameConstant()å’Œvisit_Ellipsis()现在已被弃用,并且在未æ�¥çš„ Python 版本ä¸å°†ä¸�å†�被调用。 æ·»åŠvisit_Constant()方法æ�¥å¤„ç�†æ‰€æœ‰å¸¸é‡�节点。 (由 Serhiy Storchaka 在 bpo-36917 ä¸è´¡çŒ®ã€‚)asyncio.coroutine()decorator 已弃用并将在 3.10 版ä¸è¢«ç§»é™¤ã€‚ 原有的@asyncio.coroutine请改用async defæ�¥æ›¿ä»£ã€‚ (由 Andrew Svetlov 在 bpo-36921 ä¸è´¡çŒ®ã€‚)在
asyncioä¸ï¼Œloop å�‚数的显å¼�ä¼ é€’å·²è¢«å¼ƒç”¨å¹¶ä¸”åˆ° 3.10 版时将会在以下函数ä¸è¢«ç§»é™¤:asyncio.sleep(),asyncio.gather(),asyncio.shield(),asyncio.wait_for(),asyncio.wait(),asyncio.as_completed(),asyncio.Task,asyncio.Lock,asyncio.Event,asyncio.Condition,asyncio.Semaphore,asyncio.BoundedSemaphore,asyncio.Queue,asyncio.create_subprocess_exec()以å�Šasyncio.create_subprocess_shell()。将å��程对象显å¼�ä¼ é€’ç»™
asyncio.wait()çš„å�šæ³•å·²è¢«å¼ƒç”¨å¹¶ä¸”å°†åœ¨ 3.11 版ä¸è¢«ç§»é™¤ã€‚ (由 Yury Selivanov 在 bpo-34790 ä¸è´¡çŒ®ã€‚)gettext模å�—ä¸çš„下列函数和方法已被弃用:lgettext(),ldgettext(),lngettext()å’Œldngettext()。 它们返回已编ç �çš„å—节串,如果转æ�¢å�Žçš„å—符串å˜åœ¨ç¼–ç �é—®é¢˜ä½ å°†å�¯èƒ½é�é�‡é¢„期之外的异常。 更好的å�šæ³•æ˜¯ä½¿ç”¨ Python 3 ä¸è¿”回 Unicode å—符串的æ“�作作为替代。 å‰�é�¢çš„函数都早已ä¸�宜使用。函数
bind_textdomain_codeset(),方法output_charset()å’Œset_output_charset(),以å�Šå‡½æ•°translation()å’Œinstall()çš„ codeset å½¢å�‚ä¹Ÿå·²è¢«å¼ƒç”¨ï¼Œå› ä¸ºå®ƒä»¬ä»…é€‚ç”¨äºŽl*gettext()函数。 (由 Serhiy Storchaka 在 bpo-33710 ä¸è´¡çŒ®ã€‚)threading.Threadçš„isAlive()方法已被弃用。 (由 Donghee Na 在 bpo-35283 ä¸è´¡çŒ®ã€‚)许多接å�—æ•´æ•°å�‚数的内置和扩展模å�—çš„å‡½æ•°çŽ°åœ¨å°†å¯¹ä¼ å…¥
Decimal,Fraction以å�Šä»»ä½•å…¶ä»–å�¯è¢«è½¬æ�¢ä¸ºæ•´æ•°ä½†ä¼šä¸¢å¤±ç²¾åº¦ï¼ˆå�³å…·æœ‰__int__()方法但没有__index__()方法)的对象å�‘出弃用è¦å‘Šã€‚ 在未æ�¥çš„版本ä¸åˆ™å°†æŠ¥é”™ã€‚ (由 Serhiy Storchaka 在 bpo-36048 ä¸è´¡çŒ®ã€‚)以下å�‚数作为关键å—å�‚æ•°ä¼ é€’çš„æ–¹å¼�已被弃用:
functools.partialmethod(),weakref.finalize(),profile.Profile.runcall(),cProfile.Profile.runcall(),bdb.Bdb.runcall(),trace.Trace.runfunc()与curses.wrapper()ä¸çš„ func。unittest.TestCase.addCleanup()ä¸çš„ function。concurrent.futures.ThreadPoolExecutorå’Œconcurrent.futures.ProcessPoolExecutorçš„submit()方法ä¸çš„ fn。contextlib.ExitStack.callback(),contextlib.AsyncExitStack.callback()å’Œcontextlib.AsyncExitStack.push_async_callback()ä¸çš„ callback。multiprocessing.managers.Serverå’Œmultiprocessing.managers.SharedMemoryServerçš„create()方法ä¸çš„ c å’Œ typeid。weakref.finalize()ä¸çš„ obj。
在未æ�¥ç‰ˆæœ¬çš„ Python ä¸ï¼Œå®ƒä»¬å°†æˆ�为 ä»…é™�ä½�ç½®å�‚数。 (由 Serhiy Storchaka 在 bpo-36492 ä¸è´¡çŒ®ã€‚)
API 与特性的移除¶
下列特性与 API 已从 Python 3.8 ä¸ç§»é™¤ï¼š
自 Python 3.3 起,从
collections导入 ABC çš„å�šæ³•å·²å¼ƒç”¨ï¼Œè€Œåº”å½“ä»Žcollections.abc执行导入。 从 collections 导入的æ“�作在 3.8 ä¸å·²æ ‡è®°ä¸ºè¢«ç§»é™¤ï¼Œä½†å°†æŽ¨è¿Ÿåˆ° 3.9 ä¸å®žæ–½ã€‚ (å�‚è§� bpo-36952。)macpath模å�—,在 Python 3.7 ä¸å¼ƒç”¨ï¼ŒçŽ°å·²è¢«ç§»é™¤ã€‚ (由 Victor Stinner 在 bpo-35471 ä¸è´¡çŒ®ã€‚)函数
platform.popen()已被移除,它自 Python 3.3 起就已被弃用:请改用os.popen()。 (由 Victor Stinner 在 bpo-35345 ä¸è´¡çŒ®ã€‚)函数
time.clock()已被移除,它自 Python 3.3 èµ·å°±å·²è¢«å¼ƒç”¨ï¼šè¯·æ ¹æ�®å…·ä½“需求改用time.perf_counter()或time.process_time()以获得具有良好定义的行为。 (由 Matthias Bussonnier 在 bpo-36895 ä¸è´¡çŒ®ã€‚)pyvenv脚本已被移除,推è��改用python3.8 -m venvæ�¥å¸®åŠ©æ¶ˆé™¤å®¹æ˜“æ··æ·†pyvenv脚本所关è�”çš„ Python 解释器这一问题。 (由 Brett Cannon 在 bpo-25427 ä¸è´¡çŒ®ã€‚)parse_qs,parse_qslå’Œescape已从cgi模å�—ä¸è¢«ç§»é™¤ã€‚ 这些函数自 Python 3.2 或更早就已被弃用。 它们应改为从urllib.parseå’Œhtml模å�—导入。filemode函数已从tarfile模å�—ä¸è¢«ç§»é™¤ã€‚ 该函数未被写入文档,自 Python 3.3 起就已弃用。XMLParseræž„é€ å™¨ä¸�å†�接å�— html å�‚数。 它从æ�¥æ²¡æœ‰ä»»ä½•作用并在 Python 3.4 ä¸å·²è¢«å¼ƒç”¨ã€‚ 所有其他形å�‚现在都是 ä»…é™�关键å—å�‚数。 (由 Serhiy Storchaka 在 bpo-29209 ä¸è´¡çŒ®ã€‚)XMLParserçš„doctype()方法已被移除。 (由 Serhiy Storchaka 在 bpo-29209 ä¸è´¡çŒ®ã€‚)"unicode_internal" ç¼–è§£ç �器已被移除。 (由 Inada Naoki 在 bpo-36297 ä¸è´¡çŒ®ã€‚)
sqlite3模å�—çš„Cacheå’ŒStatement对象已ä¸�å†�公开给用户。 (由 Aviv Palivoda 在 bpo-30262 ä¸è´¡çŒ®ã€‚)fileinput.input()å’Œfileinput.FileInput()ä¸è‡ª Python 3.6 起就已被忽略并弃用的bufsize关键å—å�‚数已被移除。 ç”± Matthias Bussonnier 在 bpo-36952 ä¸è´¡çŒ®ã€‚)在 Python 3.7 ä¸å¼ƒç”¨çš„函数
sys.set_coroutine_wrapper()å’Œsys.get_coroutine_wrapper()已被移除。 (由 Matthias Bussonnier 在 bpo-36933 ä¸è´¡çŒ®ã€‚)
移�到 Python 3.8¶
本节列出了先å‰�æ��述的更改以å�Šå�¯èƒ½éœ€è¦�更改代ç �的其他错误修æ£.
Python 行为的改�¶
yield 表达�(包括
yieldå’Œyield fromå�å�¥ï¼‰çŽ°åœ¨ä¸�å…�许在推导å¼�和生æˆ�器表达å¼�ä¸ä½¿ç”¨ï¼ˆä½†æœ€å·¦è¾¹çš„forå�å�¥ä¸çš„å�¯è¿ä»£å¯¹è±¡è¡¨è¾¾å¼�除外)。 (由 Serhiy Storchaka 在 bpo-10544 ä¸è´¡çŒ®ã€‚ï¼‰å½“æ ‡è¯†å�·æ£€æµ‹ (
iså’Œis not) 与特定类型的å—é�¢å€¼ (例如å—符串和数å—) 一å�Œä½¿ç”¨æ—¶ç¼–译器现在会产生SyntaxWarning。 这在 CPython ä¸é€šå¸¸æ˜¯å�¯è¡Œçš„,但并ä¸�被è¯è¨€å®šä¹‰æ‰€ä¿�è¯�。 该è¦å‘Šä¼šå»ºè®®ç”¨æˆ·æ”¹ç”¨ç›¸ç‰æ€§æ£€æµ‹ (==and!=)。 (由 Serhiy Storchaka 在 bpo-34850 ä¸è´¡çŒ®ã€‚)CPython 解释器在æŸ�些情况下å�¯ä»¥å¿½ç•¥å¼‚常。 在 Python 3.8 ä¸è¿™ç§�情况会更少å�‘生。 特别地,从类型å—典获å�–属性时引å�‘的异常ä¸�会å†�被忽略。 (由 Serhiy Storchaka 在 bpo-35459 ä¸è´¡çŒ®ã€‚)
从内置类型
bool,int,float,complexå’Œæ ‡å‡†åº“çš„ä¸€äº›ç±»ä¸ç§»é™¤äº†__str__实现。 它们现在会从object继承__str__()。 作为结果,在这些类的å�ç±»ä¸å®šä¹‰__repr__()方法将会影å“�它们的å—符串表示。 (由 Serhiy Storchaka 在 bpo-36793 ä¸è´¡çŒ®ã€‚)在 AIX 上,
sys.platformå°†ä¸�å†�包å�«ä¸»è¦�版本å�·ã€‚ 它将总是'aix',而ä¸�是'aix3'..'aix7'。 由于较旧的 Python 版本会包å�«ç‰ˆæœ¬å�·ï¼Œå› æ¤æŽ¨è��总是使用sys.platform.startswith('aix')。 (由 M. Felt 在 bpo-36588 ä¸è´¡çŒ®ã€‚)现在
PyEval_AcquireLock()å’ŒPyEval_AcquireThread()当解释器æ£åœ¨æœ€ç»ˆåŒ–时被调用将会终结当å‰�线程,以使它们与PyEval_RestoreThread(),Py_END_ALLOW_THREADS()å’ŒPyGILState_Ensure()ä¿�æŒ�一致。 如果ä¸�想è¦�æ¤ç§�行为,请通过检测_Py_IsFinalizing()或sys.is_finalizing()æ�¥ä¿�护该调用。 (由 Joannah Nanjekye 在 bpo-36475 ä¸è´¡çŒ®ã€‚)
Python API 的�化¶
在 Windows 上
os.getcwdb()函数现在会使用 UTF-8 ç¼–ç �æ ¼å¼�而ä¸�是 ANSI 代ç �页:请å�‚看 PEP 529 äº†è§£å…·ä½“åŽŸå› ã€‚ 该函数在 Windows 上ä¸�å†�被弃用。 (由 Victor Stinner 在 bpo-37412 ä¸è´¡çŒ®ã€‚)现在
subprocess.Popen在æŸ�些情况下会使用os.posix_spawn()以获得更好的性能。 在适用于 Linux çš„ Windows å�系统和 QEMU 用户模拟器上,使用os.posix_spawn()çš„Popenæž„é€ å™¨ä¸�会å†�å› ä¸ºâ€œæ‰¾ä¸�到程åº�â€�è¿™æ ·çš„é”™è¯¯å¼•å�‘异常。 而是让å�进程失败并返回一个é�žé›¶çš„returncode。 (由 Joannah Nanjekye å’Œ Victor Stinner 在 bpo-35537 ä¸è´¡çŒ®ã€‚)The preexec_fn argument of *
subprocess.Popenis no longer compatible with subinterpreters. The use of the parameter in a subinterpreter now raisesRuntimeError. (Contributed by Eric Snow in bpo-34651, modified by Christian Heimes in bpo-37951.)imap.IMAP4.logout()方法ä¸�会å†�é�™é»˜åœ°å¿½ç•¥ä»»æ„�异常。 (由 Victor Stinner 在 bpo-36348 ä¸è´¡çŒ®ã€‚)函数
platform.popen()已被移除,它自 Python 3.3 起就已被弃用:请改用os.popen()。 (由 Victor Stinner 在 bpo-35345 ä¸è´¡çŒ®ã€‚ï¼‰å½“ä¼ å…¥å¤šæ¨¡æ•°æ�®æ—¶
statistics.mode()函数ä¸�会å†�引å�‘异常。 它将改为返回在输入数æ�®ä¸é�‡åˆ°çš„第一个模å¼�。 (由 Raymond Hettinger 在 bpo-35892 ä¸è´¡çŒ®ã€‚)tkinter.ttk.Treeview类的selection()方法ä¸�å†�接å�—å�‚数。 带å�‚数调用该方法æ�¥æ”¹å�˜é€‰æ‹©åœ¨ Python 3.6 ä¸å·²å¼ƒç”¨ã€‚ 请使用专门方法例如selection_set()æ�¥æ”¹å�˜é€‰æ‹©ã€‚ (由 Serhiy Storchaka 在 bpo-31508 ä¸è´¡çŒ®ã€‚)xml.dom.minidomçš„writexml(),toxml()å’Œtoprettyxml()方法以å�Šxml.etreeçš„write()方法现在会ä¿�留用户指定的属性顺åº�。 (由 Diego Rojas å’Œ Raymond Hettinger 在 bpo-34160 ä¸è´¡çŒ®ã€‚)附带
'r'æ——æ ‡æ‰“å¼€çš„dbm.dumbæ•°æ�®åº“现在将是å�ªè¯»çš„。 如果数æ�®åº“ä¸�å˜åœ¨ï¼Œé™„带'r'å’Œ'w'æ——æ ‡çš„dbm.dumb.open()ä¸�会å†�创建数æ�®åº“。 (由 Serhiy Storchaka 在 bpo-32749 ä¸è´¡çŒ®ã€‚)在
XMLParserçš„å�ç±»ä¸å®šä¹‰çš„doctype()方法将ä¸�会å†�被调用,并将导致å�‘出RuntimeWarning而ä¸�是DeprecationWarning。 è¯·åœ¨ç›®æ ‡ä¸Šå®šä¹‰doctype()方法æ�¥å¤„ç�† XML doctype 声明。 (由 Serhiy Storchaka 在 bpo-29209 ä¸è´¡çŒ®ã€‚ï¼‰çŽ°åœ¨å½“è‡ªå®šä¹‰å…ƒç±»æœªåœ¨ä¼ ç»™
type.__new__的命å��ç©ºé—´ä¸æ��ä¾›__classcell__å…¥å�£æ—¶å°†å¼•å�‘RuntimeError。 在 Python 3.6--3.7 䏿˜¯åˆ™æ˜¯å¼•å�‘DeprecationWarning。 (由 Serhiy Storchaka 在 bpo-23722 ä¸è´¡çŒ®ã€‚)cProfile.Profile类现在å�¯è¢«ç”¨ä½œä¸Šä¸‹æ–‡ç®¡ç�†å™¨ã€‚ (由 Scott Sanderson 在 bpo-29235 ä¸è´¡çŒ®ã€‚)shutil.copyfile(),shutil.copy(),shutil.copy2(),shutil.copytree()å’Œshutil.move()会使用平å�°ä¸“属的 "fast-copy" 系统调用(å�‚è§� ä¾�赖于具体平å�°çš„高效拷è´�æ“�作 一节)。shutil.copyfile()在 Windows 上的默认缓冲区大å°�从 16 KiB 改为 1 MiB。PyGC_Head结构已被完全改å�˜ã€‚ 所有接触到该结构的代ç �都应当被é‡�写。 (å�‚è§� bpo-33597。)PyInterpreterState结构已被移入 "internal" 头文件(特别是 Include/internal/pycore_pystate.h)。 ä¸�é€�明的PyInterpreterState作为仅有 API(以å�Šç¨³å®šç‰ˆ ABI)的一部分ä»�ç„¶å�¯ç”¨ã€‚ æ–‡æ¡£æŒ‡æ˜Žè¯¥ç»“æž„çš„ä»»ä½•å—æ®µéƒ½ä¸�æ˜¯å…¬æœ‰çš„ï¼Œå› æ¤æˆ‘们希望没人在使用它们。 ä½†æ˜¯ï¼Œå¦‚æžœä½ ç¡®å®žä¾�èµ–å…¶ä¸æŸ�一个或更多个ç§�æœ‰å—æ®µå¹¶ä¸”没有其他替代选项,则请开一个 BPO 问题。 æˆ‘ä»¬å°†å°½åŠ›å¸®åŠ©ä½ è¿›è¡Œè°ƒæ•´ï¼ˆå�¯èƒ½åŒ…括å�‘公有 API æ·»åŠ è®¿é—®å™¨å‡½æ•°ï¼‰ã€‚ (å�‚è§� bpo-35886。)现在所有平å�°ä¸‹çš„
mmap.flush()方法都会在æˆ�功时返回None并在错误时引å�‘异常。 之å‰�它的行为å�–决于具体平å�°ï¼š Windows 下会在æˆ�功时返回é�žé›¶å€¼ï¼›åœ¨å¤±è´¥æ—¶è¿”回零。 Unix 下会在æˆ�功时返回零;在失败时引å�‘错误。 (由 Berker Peksag 在 bpo-2122 ä¸è´¡çŒ®ã€‚)xml.dom.minidomå’Œxml.sax模å�—默认将ä¸�å†�处ç�†å¤–部实体。 (由 Christian Heimes 在 bpo-17239 ä¸è´¡çŒ®ã€‚)从å�ªè¯»çš„
dbmæ•°æ�®åº“ (dbm.dumb,dbm.gnu或dbm.ndbm) åˆ é™¤é”®å°†ä¼šå¼•å�‘error(dbm.dumb.error,dbm.gnu.error或dbm.ndbm.error) 而ä¸�是KeyError。 (由 Xiang Zhang 在 bpo-33106 ä¸è´¡çŒ®ã€‚)简化了å—é�¢å€¼çš„ AST。 所有常é‡�将被表示为
ast.Constant的实例。 实例化旧类Num,Str,Bytes,NameConstantå’ŒEllipsis都将返回Constant的实例。 (由 Serhiy Storchaka 在 bpo-32892 ä¸è´¡çŒ®ã€‚)expanduser()在 Windows 上现在改用USERPROFILE环境å�˜é‡�而ä¸�å†�使用HOME,å�Žè€…通常ä¸�会为一般用户账户设置。 (由 Anthony Sottile 在 bpo-36264 ä¸è´¡çŒ®ã€‚)异常
asyncio.CancelledError现在继承自BaseException而ä¸�是Exception并且ä¸�å†�继承自concurrent.futures.CancelledError。 (由 Yury Selivanov 在 bpo-32528 ä¸è´¡çŒ®ã€‚)当使用
asyncio.Task的实例时,函数asyncio.wait_for()现在会æ£ç¡®åœ°ç‰å¾…撤销。 在æ¤ä¹‹å‰�当达到 timeout 时,它会被撤销并立å�³è¿”回。 (由 Elvis Pranskevichus 在 bpo-32751 ä¸è´¡çŒ®ã€‚)当将 'socket' 作为 name å½¢å�‚ä¼ å…¥æ—¶ï¼Œå‡½æ•°
asyncio.BaseTransport.get_extra_info()现在会返回一个å�¯å®‰å…¨ä½¿ç”¨çš„套接å—对象。 (由 Yury Selivanov 在 bpo-37027 ä¸è´¡çŒ®ã€‚)asyncio.BufferedProtocolå·²ç»�晋级为稳定 API。
在 Windows 上对扩展模�的 DLL �赖以�通过
ctypesåŠ è½½çš„ DLL 的解æž�现在将更为安全。 å�ªæœ‰ç³»ç»Ÿè·¯å¾„ã€�包å�«ç›¸ä¿¡ DLL 或 PYD 文件的路径以å�Šé€šè¿‡add_dll_directory()æ·»åŠ çš„ç›®å½•æ‰�ä¼šè¢«ä½œä¸ºåŠ è½½æ—¶ä¾�èµ–çš„æ�œç´¢ä½�置。 特别地,PATH和当å‰�工作目录将ä¸�å†�被使用,对它们的修改将ä¸�å†�对æ£å¸¸çš„ DLL è§£æž�产生影å“�。 å¦‚æžœä½ çš„åº”ç”¨ä¾�èµ–äºŽè¿™äº›æœºåˆ¶ï¼Œä½ åº”å½“å…ˆæ£€æŸ¥add_dll_directory(),如果它å˜åœ¨å°±ç”¨å®ƒåœ¨åŠ è½½ä½ çš„åº“æ—¶æ·»åŠ ä½ çš„ DLL 目录。 请注æ„� Windows 7 用户还需è¦�ç¡®ä¿� Windows 更新包 KB2533623 已安装(这一点也会由安装器进行验è¯�)。 (由 Steve Dower 在 bpo-36085 ä¸è´¡çŒ®ã€‚)关è�”到 pgen 的头文件和函数在其被纯 Python 实现å�–代å�Žå·²è¢«ç§»é™¤ã€‚ (由 Pablo Galindo 在 bpo-36623 ä¸è´¡çŒ®ã€‚)
types.CodeTypeåœ¨æž„é€ å™¨çš„ç¬¬äºŒä¸ªä½�置新增了一个形å�‚ (posonlyargcount) 以支æŒ�在 PEP 570 ä¸å®šä¹‰çš„ä»…é™�ä½�ç½®å�‚数。 第一个å�‚æ•° (argcount) 现在表示ä½�ç½®å�‚数的总数é‡� (包括仅é™�ä½�ç½®å�‚æ•°)。types.CodeType䏿–°å¢žçš„replace()方法å�¯ç”¨äºŽè®©ä»£ç �支æŒ� future 特性。hmac.new()çš„digestmodå½¢å�‚ä¸�å†�默认使用 MD5 摘è¦�。
C API 的�化¶
PyCompilerFlagsç»“æž„ä½“å¢žåŠ äº†ä¸€ä¸ªæ–°çš„ cf_feature_version å—æ®µã€‚ 它应当被åˆ�始化为PY_MINOR_VERSION。 è¯¥å—æ®µé»˜è®¤ä¼šè¢«å¿½ç•¥ï¼Œå½“且仅当在 cf_flags ä¸è®¾ç½®äº†PyCF_ONLY_ASTæ——æ ‡æ—¶æ‰�会被使用。 (由 Guido van Rossum 在 bpo-35766 ä¸è´¡çŒ®ã€‚)PyEval_ReInitThreads()函数已被 C API ä¸ç§»é™¤ã€‚ 它ä¸�应被显å¼�地调用:请改用PyOS_AfterFork_Child()。 (由 Victor Stinner 在 bpo-36728 ä¸è´¡çŒ®ã€‚)在 Unix 上,C 扩展ä¸�会å†�被链接到 libpython,但 Android å’Œ Cygwin 例外。 当 Python 被嵌入时,
libpythonä¸�å�¯ä½¿ç”¨RTLD_LOCALåŠ è½½ï¼Œè€Œè¦�改用RTLD_GLOBAL。 之å‰�使用RTLD_LOCALå·²ç»�ä¸�å�¯èƒ½åŠ è½½æœªé“¾æŽ¥åˆ°libpythonçš„ C 扩展了,例如通过Modules/Setupçš„*shared*éƒ¨åˆ†æž„å»ºçš„æ ‡å‡†åº“ C 扩展。 (由 Victor Stinner 在 bpo-21536 ä¸è´¡çŒ®ã€‚)在解æž�或构建值时(例如
PyArg_ParseTuple(),Py_BuildValue(),PyObject_CallFunction()ç‰ç‰ï¼‰ä½¿ç”¨å½¢å¦‚#çš„æ ¼å¼�而ä¸�定义PY_SSIZE_T_CLEAN现在将会引å�‘DeprecationWarning。 它将在 3.10 或 4.0 ä¸è¢«ç§»é™¤ã€‚ 请å�‚阅 è§£æž�å�‚数并构建值å�˜é‡� 了解详情。 (由 Inada Naoki 在 bpo-36381 ä¸è´¡çŒ®ã€‚ï¼‰å †åˆ†é…�类型的实例(例如使用
PyType_FromSpec()创建的实例)会ä¿�å˜ä¸€ä¸ªå¯¹å…¶ç±»åž‹å¯¹è±¡çš„引用。 æ��å�‡è¿™äº›ç±»åž‹å¯¹è±¡å¼•用计数的æ“�作已从PyType_GenericAlloc()移至更低层级的函数PyObject_Init()å’ŒPyObject_INIT()。 这使用通过This makes types created throughPyType_FromSpec()所创建类型的行为与管ç�†ä»£ç �ä¸çš„å…¶ä»–ç±»ä¿�æŒ�一致。é�™æ€�分é…�类型 å°†ä¸�å�—å½±å“�。
在大部分情况下,这应该都�会有附带影�。 但是,在分�实例�手动��引用计数的类型(也许是为了绕过�洞)现在�能永远�会被销�。 ���这�情况,这些类需�在实例撤销分�期间在类型对象上调用 Py_DECREF。
è¦�æ£ç¡®åœ°å°†è¿™äº›ç±»åž‹ç§»æ¤�到 3.8,请应用以下修改:
在分�实例之�在类型对象上移除
Py_INCREF—— 如果有的�。 这�能�生在调用PyObject_New,PyObject_NewVar,PyObject_GC_New(),PyObject_GC_NewVar()或任何其他使用PyObject_Init()或PyObject_INIT()的自定义分�器之�。示例:
static foo_struct * foo_new(PyObject *type) { foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type); if (foo == NULL) return NULL; #if PY_VERSION_HEX < 0x03080000 // Workaround for Python issue 35810; no longer necessary in Python 3.8 PY_INCREF(type) #endif return foo; }
ç¡®ä¿�æ‰€æœ‰å †åˆ†é…�类型的自定义
tp_dealloc函数会�少类型的引用计数。示例:
static void foo_dealloc(foo_struct *instance) { PyObject *type = Py_TYPE(instance); PyObject_GC_Del(instance); #if PY_VERSION_HEX >= 0x03080000 // This was not needed before Python 3.8 (Python issue 35810) Py_DECREF(type); #endif }
(由 Eddie Elizondo 在 bpo-35810 ä¸è´¡çŒ®ã€‚)
Py_DEPRECATED()�已�针对 MSVC 实现。 这个�现在必须放在符��称之�。示例:
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
(由 Zackery Spytz 在 bpo-33407 ä¸è´¡çŒ®ã€‚)
解释器将���装支�跨�布版本的扩展类型二进制兼容性。 由第三方扩展模�所导出的
PyTypeObject应当具有当å‰� Python 版本所è¦�求的所有槽ä½�,包括tp_finalize(Py_TPFLAGS_HAVE_FINALIZEä¸�å†�会在读å�–tp_finalize之å‰�被检查)。(由 Antoine Pitrou 在 bpo-32388 ä¸è´¡çŒ®ã€‚)
函数
PyNode_AddChild()和PyParser_AddToken()现在接�两个�外的int�数 end_lineno 和 end_col_offset。�许 MinGW 工具直接链接到
python38.dllçš„libpython38.a文件已ä¸�å†�包å�«äºŽæ ‡å‡†çš„ Windows 分å�‘包ä¸ã€‚ å¦‚æžœä½ éœ€è¦�æ¤æ–‡ä»¶ï¼Œå�¯ä½¿ç”¨gendefå’Œdlltool工具æ�¥ç”Ÿæˆ�它,这些工具是 MinGW binutils 包的一部分:gendef - python38.dll > tmp.def dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
已安装的
pythonXY.dll所在ä½�置将å�–决于安装选项以å�Š Windows 的版本和è¯è¨€ã€‚ 请å�‚阅 在Windows上使用 Python 了解更多信æ�¯ã€‚ 该结果库应当放在与pythonXY.lib相å�Œçš„ç›®å½•ä¸‹ï¼Œè¿™é€šå¸¸æ˜¯ä½ çš„ Python 安装路径下的libs目录。(由 Steve Dower 在 bpo-37351 ä¸è´¡çŒ®ã€‚)
CPython å—节ç �的改å�˜Â¶
解释器循环已通过将å�—å †æ ˆå±•å¼€é€»è¾‘ç§»å…¥ç¼–è¯‘å™¨èŽ·å¾—äº†ç®€åŒ–ã€‚ 编译器现在会å�‘出显å¼�指令æ�¥è°ƒæ•´å€¼å †æ ˆå¹¶ä¸º
break,continueå’Œreturn调用清除代ç �。移除了æ“�作ç �
BREAK_LOOP,CONTINUE_LOOP,SETUP_LOOPå’ŒSETUP_EXCEPT。 æ·»åŠ äº†æ–°çš„æ“�作ç �ROT_FOUR,BEGIN_FINALLY,CALL_FINALLYå’ŒPOP_FINALLY。 修改了END_FINALLYå’ŒWITH_CLEANUP_START的行为。(由 Mark Shannon, Antoine Pitrou å’Œ Serhiy Storchaka 在 bpo-17611 ä¸è´¡çŒ®ã€‚)
æ·»åŠ äº†æ–°çš„æ“�作ç �
END_ASYNC_FOR用于处ç�†å½“ç‰å¾…async for循环的下一项时引å�‘的异常。 (由 Serhiy Storchaka 在 bpo-33041 ä¸è´¡çŒ®ã€‚)MAP_ADDçŽ°åœ¨ä¼šé¢„æœŸå€¼ä¸ºæ ˆçš„ç¬¬ä¸€ä¸ªå…ƒç´ è€Œé”®ä¸ºç¬¬äºŒä¸ªå…ƒç´ ã€‚ ä½œå‡ºæ¤æ”¹å�˜ä»¥ä½¿å¾—å—典推导å¼�能如 PEP 572 所æ��è®®çš„é‚£æ ·ï¼Œé”®æ€»æ˜¯ä¼šåœ¨å€¼ä¹‹å‰�被求值。 (由 Jörn Heissler 在 bpo-35224 ä¸è´¡çŒ®ã€‚)
演示和工具¶
æ·»åŠ äº†ä¸€ä¸ªæ£€æµ‹è„šæœ¬ç”¨äºŽå¯¹è®¿é—®å�˜é‡�çš„ä¸�å�Œæ–¹å¼�进行计时: Tools/scripts/var_access_benchmark.py。 (由 Raymond Hettinger 在 bpo-35884 ä¸è´¡çŒ®ã€‚)
以下是自 Python 3.3 以�性能��情况的总结:
Python version 3.3 3.4 3.5 3.6 3.7 3.8
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 4.0 7.1 7.1 5.4 5.1 3.9
read_nonlocal 5.3 7.1 8.1 5.8 5.4 4.4
read_global 13.3 15.5 19.0 14.3 13.6 7.6
read_builtin 20.0 21.1 21.6 18.5 19.0 7.5
read_classvar_from_class 20.5 25.6 26.5 20.7 19.5 18.4
read_classvar_from_instance 18.5 22.8 23.5 18.8 17.1 16.4
read_instancevar 26.8 32.4 33.1 28.0 26.3 25.4
read_instancevar_slots 23.7 27.8 31.3 20.8 20.8 20.2
read_namedtuple 68.5 73.8 57.5 45.0 46.8 18.4
read_boundmethod 29.8 37.6 37.9 29.6 26.9 27.7
Variable and attribute write access:
write_local 4.6 8.7 9.3 5.5 5.3 4.3
write_nonlocal 7.3 10.5 11.1 5.6 5.5 4.7
write_global 15.9 19.7 21.2 18.0 18.0 15.8
write_classvar 81.9 92.9 96.0 104.6 102.1 39.2
write_instancevar 36.4 44.6 45.8 40.0 38.9 35.5
write_instancevar_slots 28.7 35.6 36.1 27.3 26.6 25.7
Data structure read access:
read_list 19.2 24.2 24.5 20.8 20.8 19.0
read_deque 19.9 24.7 25.5 20.2 20.6 19.8
read_dict 19.7 24.3 25.7 22.3 23.0 21.0
read_strdict 17.9 22.6 24.3 19.5 21.2 18.9
Data structure write access:
write_list 21.2 27.1 28.5 22.5 21.6 20.0
write_deque 23.8 28.7 30.1 22.7 21.8 23.5
write_dict 25.9 31.4 33.3 29.3 29.2 24.7
write_strdict 22.9 28.4 29.9 27.5 25.2 23.1
Stack (or queue) operations:
list_append_pop 144.2 93.4 112.7 75.4 74.2 50.8
deque_append_pop 30.4 43.5 57.0 49.4 49.2 42.5
deque_append_popleft 30.8 43.7 57.3 49.7 49.7 42.8
Timing loop:
loop_overhead 0.3 0.5 0.6 0.4 0.3 0.3
基准测试是在 Intel® Core™ i7-4960HQ 处�器 上�行从 python.org 获�的 macOS 64 �编译版得到的数�。 该基准测试脚本显示时间以纳秒为��。
Python 3.8.1 ä¸çš„é‡�è¦�å�˜åŒ–¶
出于é‡�è¦�的安全性考é‡�,asyncio.loop.create_datagram_endpoint() çš„ reuse_address å½¢å�‚ä¸�å†�被支æŒ�。 这是由 UDP ä¸çš„套接å—选项 SO_REUSEADDR 的行为导致的。 更多细节请å�‚阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou å’Œ Yury Selivanov 在 bpo-37228 ä¸è´¡çŒ®ã€‚。)
Python 3.8.2 ä¸çš„é‡�è¦�å�˜åŒ–¶
ä¿®å¤�了 shutil.copytree() çš„ ignore 回调ä¸çš„回归问题。 现在该å�‚数的类型已改回 str å’Œ List[str]。 (由 Manuel Barkhau å’Œ Giampaolo Rodola 在 gh-83571 ä¸è´¡çŒ®ã€‚)
Python 3.8.3 ä¸çš„é‡�è¦�å�˜åŒ–¶
__future__ 模å�—ä¸çš„ future æ——æ ‡å¸¸é‡�值已被更新以防æ¢ä¸Žç¼–è¯‘å™¨æ——æ ‡å�‘生冲çª�。 在之å‰�ç‰ˆæœ¬ä¸ PyCF_ALLOW_TOP_LEVEL_AWAIT 与 CO_FUTURE_DIVISION å˜åœ¨å†²çª�。 (由 Batuhan Taskaya 在 gh-83743 ä¸è´¡çŒ®ã€‚)
Python 3.8.8 ä¸çš„é‡�è¦�å�˜åŒ–¶
早先的 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.8.9 ä¸çš„é‡�è¦�å�˜åŒ–¶
新的安全修æ£å°† ftplib.FTP 的行为改æˆ�当设置被动数æ�®é€šé�“æ—¶ä¸�信任远程æœ�务器所å�‘é€�çš„ IPv4 地å�€ã€‚ 我们会改为é‡�用 ftp æœ�务器的 IP 地å�€ã€‚ 对于需è¦�原先的行为的ä¸�常è§�代ç �ï¼Œè¯·åœ¨ä½ çš„ FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (å�‚è§� gh-87451。)
Python 3.8.10 ä¸çš„é‡�è¦�å�˜åŒ–¶
macOS 11.0 (Big Sur) 与 Apple Silicon Mac 支�¶
对于 3.8.10,Python 现在支æŒ�在 macOS 11 (Big Sur) å’Œ Apple Silicon Mac (基于 ARM64 æž¶æž„) 上构建和è¿�行。 现在æ��供了一个新的通用构建形å¼� universal2 能够在一组å�¯æ‰§è¡Œæ–‡ä»¶ä¸Šå�Œæ—¶åŽŸç”Ÿæ”¯æŒ� ARM64 å’Œ Intel 64。 请注æ„�对 "弱链接" 的支æŒ�,å�³ä»¥è¾ƒæ–° macOS ç‰ˆæœ¬ä¸ºç›®æ ‡æž„å»ºçš„äºŒè¿›åˆ¶æ–‡ä»¶é€šè¿‡åœ¨è¿�行时测试缺失特性的方å¼�也能在较旧版本上æ£ç¡®è¿�行,尚未被包括在本次对 Python 3.9 çš„å��å�‘ç§»æ¤�ä¸ï¼›è¦�支æŒ�更多的 macOS 版本,请继ç»ä»¥è®¾å®šç‰ˆæœ¬åŒºé—´çš„æœ€æ—§ç‰ˆæœ¬ä½œä¸ºç›®æ ‡è¿›è¡Œæž„建。
(最åˆ�ç”± Ronald Oussoren å’Œ Lawrence D'Anna 在 gh-85272 ä¸è´¡çŒ®ï¼Œç”± FX Coudert å’Œ Eli Rykoff æ��供修æ£ï¼Œå¹¶ç”± Maxime Bélanger å’Œ Ned Deily å��å�‘ç§»æ¤�到 3.8)
Python 3.8.10 ä¸çš„é‡�è¦�å�˜åŒ–¶
urllib.parse¶
在 URL ä¸å˜åœ¨æ�¢è¡Œç¬¦æˆ–制表符,å�¯èƒ½ä¼šå¯¼è‡´æŸ�些形å¼�çš„æ”»å‡»ã€‚æ ¹æ�® WHATWG 的规范更新了:rfc:3986, urllib.parse ä¸çš„è§£æž�器将从 URL ä¸ç§»é™¤ ASCII æ�¢è¡Œç¬¦ \n ã€�\r å’Œ \t``å—符,以防æ¢è¿™ç§�攻击。将移除的å—符由一个新的模å�—级å�˜é‡�``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE 控制。(å�‚阅 bpo-43882 )
Python 3.8.12 ä¸çš„é‡�è¦�å�˜åŒ–¶
Python API 的�化¶
从 Python 3.8.12 开始 ipaddress 模å�—ä¸�å†�接å�— IPv4 地å�€å—ç¬¦ä¸²ä¸æœ‰ä»»ä½•å‰�缀的零。 å‰�缀的零有æ§ä¹‰ä¸”会被æŸ�些库解读为八进制数å—。 例如旧版函数 socket.inet_aton() 就将å‰�缀的零视为八进制数å—。 最新 inet_pton() çš„ glibc 实现则ä¸�接å�—任何å‰�缀的零。
(最åˆ�ç”± Christian Heimes 在 bpo-36384 ä¸è´¡çŒ®ï¼Œå¹¶ç”± Achraf Merzouki å�‘下移æ¤�到 3.8。)
3.8.14 ä¸çš„é‡�è¦�安全特性¶
使用å��进制以外的底,如 2(二进制)ã€�4ã€�8(八进制)ã€�16(å��å…进制)ã€�32 以外作为基数在 int å’Œ str 之间进行转æ�¢ï¼Œå¦‚æžœå—符串形å¼�çš„æ•°å—æ•°é‡�超过一个é™�制,会抛出 ValueError,以é�¿å…�å› ç®—æ³•å¤�æ�‚而导致的潜在拒ç»�æœ�务攻击。这是对 CVE-2020-10735 的缓解方案。这个é™�制å�¯ä»¥é€šè¿‡çŽ¯å¢ƒå�˜é‡�ã€�å‘½ä»¤è¡Œæ——æ ‡æˆ– sys API 进行é…�置或ç¦�用。å�‚è§� integer string conversion length limitation 文档。默认é™�制是å—符串形å¼�çš„ 4300 ä½�æ•°å—。
3.8.17 ä¸çš„é‡�è¦�å�˜åŒ–¶
tarfile¶
tarfileä¸çš„æ��å�–方法和shutil.unpack_archive()都新增了 filter å�‚数以å…�许é™�制å�¯èƒ½ä»¤äººæ„�外或å�±é™©çš„ tar ç‰¹æ€§ï¼Œä¾‹å¦‚åœ¨ç›®æ ‡ç›®å½•ä¹‹å¤–åˆ›å»ºæ–‡ä»¶ã€‚ 相关细节å�‚è§� 解压缩过滤器。 在 Python 3.12 ä¸ï¼Œä¸�带 filter å�‚数的用法将显示DeprecationWarning。 在 Python 3.14 ä¸ï¼Œé»˜è®¤å€¼å°†åˆ‡æ�¢ä¸º'data'。 (由 Petr Viktorin 在 PEP 706 ä¸è´¡çŒ®ã€‚)