天天看點

Python 3.8即将釋出,這幾個變化你必須知道

作者 | 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)