Python 3.8 有什么新變化

  • 編者 Raymond Hettinger

本文解釋了 Python 3.8 相比 3.7 的新增特性睬关。 完整的詳情可參閱 更新日志

Python 3.8已于2019年10月14日發(fā)布。

新的特性?

賦值表達(dá)式

新增的語法 := 可在表達(dá)式內(nèi)部為變量賦值厢漩。 它被昵稱為“海象運(yùn)算符”因?yàn)樗芟袷?海象的眼睛和長牙待错。

在這個(gè)示例中,賦值表達(dá)式可以避免調(diào)用 len() 兩次:

if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

類似的益處還可出現(xiàn)在正則表達(dá)式匹配中需要使用兩次匹配對(duì)象的情況中会钝,一次檢測(cè)用于匹配是否發(fā)生伐蒋,另一次用于提取子分組:

discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

此運(yùn)算符也適用于配合 while 循環(huán)計(jì)算一個(gè)值來檢測(cè)循環(huán)是否終止,而同一個(gè)值又在循環(huán)體中再次被使用的情況:

# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

另一個(gè)值得介紹的用例出現(xiàn)于列表推導(dǎo)式中迁酸,在篩選條件中計(jì)算一個(gè)值先鱼,而同一個(gè)值又在表達(dá)式中需要被使用:

[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

請(qǐng)盡量將海象運(yùn)算符的使用限制在清晰的場(chǎng)合中,以降低復(fù)雜性并提升可讀性奸鬓。

請(qǐng)參閱 PEP 572 了解詳情焙畔。

(由 Morehouse 在 bpo-35224 中貢獻(xiàn)。)

僅限位置形參

新增了一個(gè)函數(shù)形參語法 / 用來指明某些函數(shù)形參必須使用僅限位置而非關(guān)鍵字參數(shù)的形式串远。 這種標(biāo)記語法與通過 help() 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標(biāo)記的 C 函數(shù)相同宏多。

在下面的例子中,形參 ab 為僅限位置形參澡罚,cd 可以是位置形參或關(guān)鍵字形參伸但,而 ef 要求為關(guān)鍵字形參:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

以下均為合法的調(diào)用:

f(10, 20, 30, d=40, e=50, f=60)

但是,以下均為不合法的調(diào)用:

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

這種標(biāo)記形式的一個(gè)用例是它允許純 Python 函數(shù)完整模擬現(xiàn)有的用 C 代碼編寫的函數(shù)的行為留搔。 例如砌烁,內(nèi)置的 pow() 函數(shù)不接受關(guān)鍵字參數(shù):

def pow(x, y, z=None, /):
    "Emulate the built in pow() function"
    r = x ** y
    return r if z is None else r%z

另一個(gè)用例是在不需要形參名稱時(shí)排除關(guān)鍵字參數(shù)。 例如催式,內(nèi)置的 len() 函數(shù)的簽名為 len(obj, /)函喉。 這可以排除如下這種笨拙的調(diào)用形式:

len(obj='hello')  # The "obj" keyword argument impairs readability

另一個(gè)益處是將形參標(biāo)記為僅限位置形參將允許在未來修改形參名而不會(huì)破壞客戶的代碼。 例如荣月,在 statistics 模塊中管呵,形參名 dist 在未來可能被修改。 這使得以下函數(shù)描述成為可能:

def quantiles(dist, /, *, n=4, method='exclusive')
    ...

由于在 / 左側(cè)的形參不會(huì)被公開為可用關(guān)鍵字哺窄,其他形參名仍可在 **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}

這極大地簡(jiǎn)化了需要接受任意關(guān)鍵字參數(shù)的函數(shù)和方法的實(shí)現(xiàn)捐下。 例如账锹,以下是一段摘自 collections 模塊的代碼:

class Counter(dict):

    def __init__(self, iterable=None, /, **kwds):
        # Note "iterable" is a possible keyword argument

用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存

新增的 PYTHONPYCACHEPREFIX 設(shè)置 (也可使用 -X pycache_prefix) 可將隱式的字節(jié)碼緩存配置為使用單獨(dú)的并行文件系統(tǒng)樹,而不是默認(rèn)的每個(gè)源代碼目錄下的 __pycache__ 子目錄坷襟。

緩存的位置會(huì)在 sys.pycache_prefix 中報(bào)告 (None 表示默認(rèn)位置即 __pycache__ 子目錄)奸柬。

(由 Carl Meyer 在 bpo-33499 中貢獻(xiàn)。)

調(diào)試構(gòu)建使用與發(fā)布構(gòu)建相同的 ABI

Python 現(xiàn)在不論是以發(fā)布模式還是調(diào)試模式進(jìn)行構(gòu)建都將使用相同的 ABI婴程。 在 Unix 上廓奕,當(dāng) Python 以調(diào)試模式構(gòu)建時(shí),現(xiàn)在將可以加載以發(fā)布模式構(gòu)建的 C 擴(kuò)展和使用穩(wěn)定版 ABI 構(gòu)建的 C 擴(kuò)展档叔。

發(fā)布構(gòu)建和調(diào)試構(gòu)建現(xiàn)在都是 ABI 兼容的:定義 Py_DEBUG 宏不會(huì)再啟用 Py_TRACE_REFS 宏桌粉,它引入了唯一的 ABI 不兼容性。 Py_TRACE_REFS 宏添加了 sys.getobjects() 函數(shù)和 PYTHONDUMPREFS 環(huán)境變量衙四,它可以使用新的 ./configure --with-trace-refs 構(gòu)建選項(xiàng)來設(shè)置铃肯。 (由 Victor Stinner 在 bpo-36465 中貢獻(xiàn)。)

在 Unix 上传蹈,C 擴(kuò)展不會(huì)再被鏈接到 libpython押逼,但 Android 和 Cygwin 例外。 現(xiàn)在靜態(tài)鏈接的 Python 將可以加載使用共享庫 Python 構(gòu)建的 C 擴(kuò)展惦界。 (由 Victor Stinner 在 bpo-21536 中貢獻(xiàn)挑格。)

在 Unix 上,當(dāng) Python 以調(diào)試模式構(gòu)建時(shí)表锻,導(dǎo)入操作現(xiàn)在也會(huì)查找在發(fā)布模式下編譯的 C 擴(kuò)展以及使用穩(wěn)定版 ABI 編譯的 C 擴(kuò)展。 (由 Victor Stinner 在 bpo-36722 中貢獻(xiàn)乞娄。)

要將 Python 嵌入到一個(gè)應(yīng)用中瞬逊,必須將新增的 --embed 選項(xiàng)傳給 python3-config --libs --embed 以獲得 -lpython3.8 (將應(yīng)用鏈接到 libpython)。 要同時(shí)支持 3.8 和舊版本仪或,請(qǐng)先嘗試 python3-config --libs --embed 并在此命令失敗時(shí)回退到 python3-config --libs (即不帶 --embed)确镊。

增加一個(gè) pkg-config python-3.8-embed 模塊用來將 Python 嵌入到一個(gè)應(yīng)用中: pkg-config python-3.8-embed --libs 包含 -lpython3.8。 要同時(shí)支持 3.8 和舊版本范删,請(qǐng)先嘗試 pkg-config python-X.Y-embed --libs 并在此命令失敗時(shí)回退到 pkg-config python-X.Y --libs (即不帶 --embed) (請(qǐng)將 X.Y 替換為 Python 版本號(hào))蕾域。

另一方面,pkg-config python3.8 --libs 不再包含 -lpython3.8到旦。 C 擴(kuò)展不可被鏈接到 libpython (但 Android 和 Cygwin 例外旨巷,這兩者的情況由腳本處理);此改變是故意被設(shè)為向下不兼容的添忘。 (由 Victor Stinner 在 bpo-36721 中貢獻(xiàn)采呐。)

f-字符串支持 = 用于自動(dòng)記錄表達(dá)式和調(diào)試文檔

增加 = 說明符用于 f-string。 形式為 f'{expr=}' 的 f-字符串將擴(kuò)展表示為表達(dá)式文本搁骑,加一個(gè)等于號(hào)斧吐,再加表達(dá)式的求值結(jié)果又固。 例如:

>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"

通常的 f-字符串格式說明符 允許更細(xì)致地控制所要顯示的表達(dá)式結(jié)果:

>>>

>>> delta = date.today() - member_since
>>> f'{user=!s}  {delta.days=:,d}'
'user=eric_idle  delta.days=16,075'

= 說明符將輸出整個(gè)表達(dá)式,以便詳細(xì)演示計(jì)算過程:

>>>

>>> print(f'{theta=}  {cos(radians(theta))=:.3f}')
theta=30  cos(radians(theta))=0.866

(由 Eric V. Smith 和 Larry Hastings 在 bpo-36817 中貢獻(xiàn)煤率。)

PEP 578: Python 運(yùn)行時(shí)審核鉤子

此 PEP 添加了審核鉤子和已驗(yàn)證開放鉤子仰冠。 兩者在 Python 與本機(jī)代碼中均可用。允許以純 Python 代碼編寫的應(yīng)用和框架利用額外的通知蝶糯,同時(shí)允許嵌入開發(fā)人員或系統(tǒng)管理員部署始終啟用審核的 Python 版本洋只。

請(qǐng)參閱 PEP 578 了解詳情。

PEP 587: Python 初始化配置

PEP 587 增加了一個(gè)新的 C API 用來配置 Python 初始化裳涛,提供對(duì)整個(gè)配置過程的更細(xì)致控制以及更好的錯(cuò)誤報(bào)告木张。

新的結(jié)構(gòu):

新的函數(shù):

此 PEP 還為這些內(nèi)部結(jié)構(gòu)添加了 _PyRuntimeState.preconfig (PyPreConfig 類型) 和 PyInterpreterState.config (PyConfig 類型) 字段。 PyInterpreterState.config 成為新的引用配置端三,替代全局配置變量和其他私有變量舷礼。

請(qǐng)參閱 Python 初始化配置 獲取詳細(xì)文檔。

請(qǐng)參閱 PEP 587 了解詳情郊闯。

(由 Victor Stinner 在 bpo-36763 中貢獻(xiàn)妻献。)

Vectorcall: 用于 CPython 的快速調(diào)用協(xié)議

添加 "vectorcall" 協(xié)議到 Python/C API。 它的目標(biāo)是對(duì)已被應(yīng)用于許多類的現(xiàn)有優(yōu)化進(jìn)行正式化团赁。 任何實(shí)現(xiàn)可調(diào)用對(duì)象的擴(kuò)展類型均可使用此協(xié)議育拨。

此特性目前為暫定狀態(tài),計(jì)劃在 Python 3.9 將其完全公開欢摄。

請(qǐng)參閱 PEP 590 了解詳情熬丧。

(由 Jeroen Demeyer 和 Mark Shannon 在 bpo-36974 中貢獻(xiàn)。)

具有外部數(shù)據(jù)緩沖區(qū)的 pickle 協(xié)議 5

當(dāng)使用 pickle 在 Python 進(jìn)程間傳輸大量數(shù)據(jù)以充分發(fā)揮多核或多機(jī)處理的優(yōu)勢(shì)時(shí)怀挠,非常重要一點(diǎn)是通過減少內(nèi)存拷貝來優(yōu)化傳輸效率析蝴,并可能應(yīng)用一些定制技巧例如針對(duì)特定數(shù)據(jù)的壓縮。

pickle 協(xié)議 5 引入了對(duì)于外部緩沖區(qū)的支持绿淋,這樣 PEP 3118 兼容的數(shù)據(jù)可以與主 pickle 流分開進(jìn)行傳輸闷畸,這是由通信層來確定的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吞滞,一起剝皮案震驚了整個(gè)濱河市佑菩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裁赠,老刑警劉巖殿漠,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異佩捞,居然都是意外死亡凸舵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門失尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啊奄,“玉大人渐苏,你說我怎么就攤上這事」娇洌” “怎么了琼富?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庄新。 經(jīng)常有香客問我鞠眉,道長,這世上最難降的妖魔是什么择诈? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任械蹋,我火速辦了婚禮,結(jié)果婚禮上羞芍,老公的妹妹穿的比我還像新娘哗戈。我一直安慰自己,他們只是感情好荷科,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布唯咬。 她就那樣靜靜地躺著,像睡著了一般畏浆。 火紅的嫁衣襯著肌膚如雪胆胰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天刻获,我揣著相機(jī)與錄音蜀涨,去河邊找鬼。 笑死蝎毡,一個(gè)胖子當(dāng)著我的面吹牛厚柳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顶掉,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼草娜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挑胸!你這毒婦竟也來了痒筒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茬贵,失蹤者是張志新(化名)和其女友劉穎簿透,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體解藻,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡老充,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螟左。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡浊。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡觅够,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巷嚣,到底是詐尸還是另有隱情喘先,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布廷粒,位于F島的核電站窘拯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坝茎。R本人自食惡果不足惜涤姊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗤放。 院中可真熱鬧思喊,春花似錦、人聲如沸斤吐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽和措。三九已至庄呈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間派阱,已是汗流浹背诬留。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贫母,地道東北人文兑。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像腺劣,于是被迫代替她去往敵國和親绿贞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Introduction This document gives coding conventions for t...
    wuutiing閱讀 4,552評(píng)論 0 9
  • 最近一直單曲循環(huán)陳奕迅的 愛情呼叫轉(zhuǎn)移橘原,粵語版 富士山下籍铁,人這一輩子最怕聽懂一首歌,那種揉碎了歌詞趾断,然后在你的生活...
    石頭_aa94閱讀 381評(píng)論 0 2
  • 昨天下午,我要去送今天孩子過周歲的餑餑脐帝。 我就屁顛屁顛的給大姐同云,打電話糖权,接過電話,大姐一臉懵圈炸站,我告訴她...
    佳佳喜餅閱讀 754評(píng)論 0 0
  • 昨天晨起流清鼻涕温兼,一個(gè)鼻眼兒不通氣,受涼要感冒武契,左側(cè)手液門透中渚募判,留針半個(gè)鐘頭,隔幾分鐘平補(bǔ)平瀉捻針一次咒唆,之后鼻子...
    6896eb4c61c2閱讀 888評(píng)論 0 0
  • 掐指數(shù)算 時(shí)日也許短暫 卻恰好是遇見在最美的時(shí)光里 是人間的四月天 春華秋實(shí) 風(fēng)花雪月 十指相扣 心心相惜...
    雅木風(fēng)閱讀 318評(píng)論 0 4