Python 3.12 正式發(fā)布了!
更靈活的 f-string 解析 (PEP 701)
支持 buffer 協(xié)議 (PEP 688)
引入新的 debugging/profiling API (PEP 669)
支持具有單獨全局解釋器鎖的獨立子解釋器 (PEP 684)
優(yōu)化性能,例如 PEP 709 和對 BOLT 二進制優(yōu)化器的支持,預計總體性能提高 5%
改進錯誤信息
支持 Linux perf 分析器在跟蹤過程中報告 Python 函數(shù)名稱
為泛型類引入新的類型注釋語法 (PEP 695)
為方法引入新的 override 裝飾器 (PEP 698)
在表達式部分中,無法使用引號字符來界定 f-strings
>>> f'Magic wand: { bag['wand'] }'
^
SyntaxError: invalid syntax之前考慮過的一種解決方法會導致在執(zhí)行的代碼中出現(xiàn)轉義序列,這在 f-strings 中是被禁止的:
>>> f'Magic wand { bag[\'wand\'] } string'
SyntaxError: f-string expression portion cannot include a backslashf-strings 中無法使用注釋語法:
>>> f'''A complex trick: {
... bag['bag'] # recursive bags!
... }'''
SyntaxError: f-string expression part cannot include '#'許多其它語言表達式字符串插值都支持不擴展轉義序列的任意嵌套。比如:
# Ruby
"#{ "#{1+2}" }"
# JavaScript
`${`${1+2}`}`
# Swift
"\("\(1+2)")"
# C#
$"{$"{1+2}"}"
它給 CPython 解析器增加了相當大的維護成本。這是因為解析代碼需要手動編寫,這在歷史上導致了大量的不一致性和錯誤。在 C 中手動編寫和維護解析代碼一直被認為是容易出錯和危險的,因為它需要處理大量的原始詞法分析器緩沖區(qū)上的手動內存管理。
f-strings 解析代碼無法使用新的 PEG 解析器所允許的新錯誤消息機制,這些錯誤消息帶來的改進已經受到了熱烈歡迎,但因為 f-strings 用的是獨立解析器,所以無法使用上新改進的錯誤消息機制。另外,因為 f-strings 有幾個語法特性可能會因為在表達式部分內部發(fā)生的不同隱式標記化而令人困惑(例如
f"{y:=3}"并不是一個賦值表達式)。其它 Python 實現(xiàn)無法知道它們是否正確實現(xiàn)了 f-strings,因為它們并不是官方 Python 語法的一部分。這一點很重要,因為有幾個知名的替代實現(xiàn)正在使用 CPython 的 PEG 解析器,如 PyPy。f-strings 使用一個獨立的解析器,阻止了這些替代實現(xiàn)利用官方語法,以及從改進的錯誤消息機制中受益。
