Python 3.10 新增功能

banq發表於2021-10-08

本文解釋了 Python 3.10 中與 3.9 相比的新特性。
帶括號的上下文管理器:
現在支援使用括號在上下文管理器中跨多行繼續。這允許以類似於以前使用 import 語句可能的方式在多行中格式化一長串上下文管理器。例如,所有這些示例現在都有效:

with (CtxManager() as example):
    ...

with (
    CtxManager1(),
    CtxManager2()
):
    ...

with (CtxManager1() as example,
      CtxManager2()):
    ...

with (CtxManager1(),
      CtxManager2() as example):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2
):
    ...

with (
    CtxManager1() as example1,
    CtxManager2() as example2,
    CtxManager3() as example3,
):


這種新語法使用了新解析器的非 LL(1) 能力。檢視PEP 617瞭解更多詳情。
 

結構模式匹配
增加match和case語句實現結構模式匹配,模式匹配使程式能夠從複雜的資料型別中提取資訊,在資料結構上進行分支,並根據不同形式的資料應用特定的操作。
模式匹配的通用語法是:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>


match 語句採用表示式並將其值與作為一個或多個 case 塊給出的連續模式進行比較。具體來說,模式匹配透過以下方式運作:
  1. 使用具有型別和形狀的資料 (the subject)
  2. 評估subject的match宣告
  3. case從上到下將主題與語句中的每個模式進行比較,直到確認匹配為止。
  4. 執行與確認匹配的模式相關聯的操作
  5. 如果未確認完全匹配,則最後一種情況,萬用字元_(如果提供)將用作匹配情況。如果未確認完全匹配且不存在萬用字元大小寫,則整個匹配塊為空操作。

簡單模式:匹配文字
讓我們把這個例子看作是最簡單形式的模式匹配:一個值,主題,與幾個文字匹配,模式。在下面的示例中,status是 match 語句的主題。模式是每個 case 語句,其中文字表示請求狀態程式碼。匹配後執行與案例相關的操作:

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the internet"


如果上述函式傳遞了status418 的a ,則返回“我是茶壺”。如果上面的函式傳遞了status500 的 a,則 case 語句 with _將作為萬用字元匹配,並返回“網際網路出現問題”。請注意最後一個塊:變數名稱 "_" 充當萬用字元並確保始終匹配。
您可以使用|(“or”)在單個模式中組合多個文字:

case 401 | 403 | 404:
    return "Not allowed"

結合類使用:

class Point:
    x: int
    y: int

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")


可以在模式中新增一個if子句,稱為“守衛Guard”。如果守衛為假,match則繼續嘗試下一個案例塊。

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")



更多點選標題

相關文章