作者 | Jake Edge
譯者 | Rachel
出品 | Python大學營(ID:pythonnews)
【導讀】近日, Python 3.8.0b1 版本和 beta 版相繼釋出, Python 3.8 版的新特征已經基本成型。盡管最終版本的官方釋出時間為 10 月,但實際上,使用者現在已經可以開始體驗新版本的特性了。
海象運算符
這是 Python 3.8 中最重要的特性,也是最可能引起争議的特性。這一特性針對 Python 中指派語句的文法進行了豐富。
海象運算符指形如“:=”的運算符,一般和 while 及 if 語句搭配使用,可以在對變量進行判斷的同時對其指派。該文法的主要目的為降低多模式比對及循環語句的複雜性。例如對于下列多模式比對代碼:
1m = re.match(p1, line)
2if m:
3 return m.group(1)
4else:
5 m = re.match(p2, line)
6 if m:
7 return m.group(2)
8 else:
9 m = re.match(p3, line)
10 ...
可被簡化為:
複制
1if m := re.match(p1, line):
2 return m.group(1)
3elif m := re.match(p2, line):
4 return m.group(2)
5elif m := re.match(p3, line):
6 ...
不可疊代對象的循環語句也可使用海象運算符簡化,例如:
複制
1ent = obj.next_entry()
2while ent:
3 ... # process ent
4ent = obj.next_entry()
複制
可被簡化為:
1while ent := obj.next_entry():
2 ... # process ent
複制
使用海象運算符能夠使得代碼的内容更佳明晰,這一特性在其他程式設計語言中實際同樣存在。
調試中支援使用 f-string
Python 3.6 中加入了 f-string ,盡管該文法帶來了很多友善的特性,但在調試中不能使用。是以在本次更新中, Python 加入了一些針對 f-string 的附加文法,以便于調試中對輸出進行優化。
在以往版本中,f-string 的文法為:
1print(f'foo={foo} bar={bar}')
複制
Python 3.8 中則變為:
1print(f'{foo=} {bar=}')
複制
兩者的輸出結果相同,均為:
1>>> foo = 42
2>>> bar = 'answer ...'
3>>> print(f'{foo=} {bar=}')
4foo=42 bar=answer ...
複制
另外,還可使用修飾器對輸出進行調整。例如,"!s"使結果以字元串形式輸出,以替代預設的 repr() 類型。“!f” 則能夠對輸出的格式進行調整。示例如下:
1>>> import datetime
2>>> now = datetime.datetime.now()
3>>> print(f'{now=} {now=!s}')
4now=datetime.datetime(2019, 7, 16, 16, 58, 0, 680222) now=2019-07-16 16:58:00.680222
5
6
7>>> import math
8>>> print(f'{math.pi=!f:.2f}')
9math.pi=3.14
複制
f-string 中空格的使用方式也值得注意。示例如下:
1>>> a = 37
2>>> print(f'{a = }, {a = }')
3a = 37, a = 37
複制
這一新特性能夠幫助使用者更好地輸出其調試資訊和日志資訊。
positional-only 參數
PEP 570 中提出了一種表示 positional-only 參數的新文法,用于表示不能作為關鍵字參數進行傳遞的參數。例如,對于 Python 自帶的 pow() 函數,調用方式如下:
1>>> pow(2, 3)
28
3>>> pow(x=2, y=3)
4...
5TypeError: pow() takes no keyword arguments
複制
這一文法限制了函數中參數的使用,而在新版本中,可将函數重寫如下:
1def pow(x, y, z=None, /):
2 r = x**y
3 if z is not None:
4 r %= z
5 return r
複制
其中,“/”表示函數參數清單中 positional-only 參數的結束。其使用類似于“*”,“*”在 Python 中用于表示關鍵字參數。舉例來說,對于下述語句:
1def fun(a, b, /, c, d, *, e, f):
2 ...
複制
該語句表示, a 和 b 為 positional-only 參數,e 和 f 必須使用關鍵詞進行傳遞,c 和 d 的傳遞方式則不受限制,即:
1fun(1, 2, 3, 4, e=5, f=6) # legal
2fun(1, 2, 3, d=4, e=5, f=6) # legal
3fun(a=1, b=2, c=3, d=4, e=5, f=6) # illegal
複制
可移動的 __pycache__
__pycache__ 檔案夾是 Python 解釋器自創的檔案目錄,用于儲存生成的 .pyc 檔案,用于記錄解釋器處理 .py 檔案後生成的二進制碼。
這一檔案主要用于支援處理多個版本的 Python 代碼,以及使用 CPython 以外編寫的代碼(例如 PyPy)。被處理的代碼均自動生成格式為“name.interp-version.pyc”的代碼并儲存到 __pycache__ 檔案夾中。
為了提供更多可選性,Python 的新版本中提供了一個新的環境變量 PYTHONPYCACHEPREFIX ,用于指定解釋器存放和查找 .pyc 檔案的位置,該環境變量也可使用如下指令行語句來進行設定:
1-X pycache_prefix=PATH
複制
其他特性
Python 的新版本還會為 C 語言拓展加入更快的調用方式,該方式在之前僅支援 CPython 。這一調用方式将在 3.8 版本中試運作,并預計在 3.9 版本中正式推出。另外,編譯器中的初始化配置将被清空,以便于将 Python 程式嵌入其他環境,減少環境變量及其他設定對代碼的影響。
另外, Python 标準庫的一些子產品也得到了更新。例如,用于處理 Python 抽象文法樹的 ast 模型中新增了 statistics 和 typing 方法。更多調整可參閱“What's New In Python 3.8”文檔。
原文連結:
https://lwn.net/SubscriberLink/793818/0c6f9dd271021cd4/
(*本文為 AI科技大學營原創文章,轉載請聯系 1092722531)