37. Khớp mẫu

Khớp mẫu là hệ thống khớp cấu trúc của Python. Nó được thực hiện bởimatchtuyên bố vàcasekhoản.```python match value: case 0: result = "zero" case [x, y]: result = x + y case {"name": name}: result = name case _: result = None


 cp độ CPython, vic so khp mu được biên dch thành mã byte thông thường cng vi các hướng dn so khp chuyên bit. Trình thông dch đánh giá ch đề, th tng trường hp theo th t, liên kết các tên để khp thành công và chuyn đến ni dung đã chn.

## 37.1`match`Tuyên bố

A`match`câu lnh có mt biu thc ch ng và mt hoc nhiu trường hp.```python
match subject:
    case pattern:
        body
    case pattern if guard:
        body
    case _:
        body
```Biu thc ch đề được đánh giá mt ln.```python
match compute():
    case 1:
        ...
    case 2:
        ...

compute()chạy một lần. Kết quả sau đó được kiểm tra đối với các trường hợp từ trên xuống dưới.

Về mặt khái niệm:```text subject = compute()

try case 1 if match succeeds: execute case 1 body else: try case 2


## 37.2 Mẫu và Biểu thức

Các mu trông ging như các biu thc nhưng chúng tuân theo các quy tc khác nhau.```python
match value:
    case x:
        ...
```Điu này không so sánh`value`vi mt biến hin có`x`. Nó bt ch đề vào mt tên mi`x`.

Mt mô hình chp luôn thành công.```python
case x:
```có nghĩa:```text
bind x = subject
match succeeds
```Để so sánh vi mt hng s được đặt tên, hãy s dng tên có du chm:```python
case Color.RED:
```hoc s dng mt người bo v:```python
case x if x == expected:
```S khác bit này rt quan trng vì vic khp mu có cú pháp và quy tc ràng buc riêng.

## 37.3 Lệnh trường hợp

Các v án được xét x theo th t.```python
match value:
    case int():
        result = "integer"
    case bool():
        result = "boolean"
```Đây là mt mnh lnh ti vì`bool`là mt lp con ca`int`.

```python
isinstance(True, int)
```là đúng.

Vì thế`True`trn đấu`int()`trước khi đạt được`bool()`.

Tt hơn:```python
match value:
    case bool():
        result = "boolean"
    case int():
        result = "integer"
```Khp mu s dng loi và cu trúc thi gian chy. Các trường hp c th hơn thường xut hin trước các trường hp tng quát hơn.

## 37.4 Mẫu ký tự đại diện

Mu ký t đại din`_`phù hp vi bt c điu gì và không ràng buc gì.```python
match value:
    case 0:
        result = "zero"
    case _:
        result = "other"
```các`_`mu thường được s dng làm d phòng cui cùng.

Nó khác vi tên chp thông thường:```python
case name:
```Điu này ràng buc`name`.

```python
case _:
```Điu này không ràng buc`_`vi tư cách là người địa phương mi cho kết qu trn đấu.

## 37.5 Mẫu chữ

Các mu ch khp vi các giá tr như s, chui, byte, boolean và`None`.

```python
match value:
    case 0:
        result = "zero"
    case "ok":
        result = "success"
    case None:
        result = "missing"
```Đối vi hu hết các nghĩa đen, vic so khp s dng ng nghĩa bình đẳng.```text
subject == literal
```Đối vi các hng s đơn như`None`, `True`, Và`False`, vic so khp s dng ng nghĩa đơn l theo kiu nhn dng.

Các mu ch rt hu ích cho các th, trng thái nh và đánh du giao thc.

## 37.6 Mẫu chụp

Mt mu chp liên kết mt tên.```python
match value:
    case x:
        result = x
```Điu này luôn phù hp.

Các mu chp rt hu ích bên trong các mu ln hơn:```python
match point:
    case [x, y]:
        result = x + y
```Đây,`[x, y]`là mt mu tun t. Nhng cái tên`x`Và`y`nm bt các yếu t.

Sau khi khp thành công, các tên b ràng buc s có sn trong ni dung trường hp.```python
match value:
    case [x, y]:
        print(x, y)
```Nếu khp không thành công, các ràng buc t mu không thành công đó không được rò r theo cách mà mã người dùng có th da vào.

## 37.7 Mẫu giá trị

Mu giá tr so sánh ch đề vi giá tr được tham chiếu bng tên có du chm.```python
match color:
    case Color.RED:
        handle_red()
    case Color.BLUE:
        handle_blue()
```Tên có du chm được đánh giá và so sánh vi ch đề.

Điu này khác vi:```python
case RED:
```mà nm bt được mt cái tên gi là`RED`.

Đối vi các hng s, hãy s dng tên có du chm, enum hoc b bo v.```python
class Status:
    OK = "ok"
    ERROR = "error"

match status:
    case Status.OK:
        ...
```## 37.8 HOẶC Mẫu

Mu OR khp nếu có bt k mu thay thế nào khp.```python
match value:
    case 0 | 1 | 2:
        result = "small"
```Tt c các la chn thay thế phi liên kết cùng mt b tên.

Có hiu lc:```python
match value:
    case [x] | (x,):
        result = x
```V nguyên tc không hp l:```python
case [x] | [x, y]:
```bi vì s thay thế đầu tiên liên kết`x`, trong khi th hai liên kết`x`Và`y`.

Trình biên dch kim tra tính nht quán liên kết tên cho các mu OR.

## 37.9 NHƯ mẫu

Mu AS liên kết toàn b giá tr khp trong khi cũng khp vi mu con.```python
match value:
    case [x, y] as pair:
        print(x, y, pair)
```Nếu ch đề phù hp`[x, y]`, sau đó:```text
x = first element
y = second element
pair = whole subject
```Điu này hu ích khi bn cn c trường b hy cu trúc và giá tr ban đầu.

## 37.10 Vệ binh

Người bo v là mt`if`điu kin gn lin vi mt trường hp.```python
match value:
    case [x, y] if x < y:
        result = "ascending"
```Mu này được khp đầu tiên. Nếu thành công, người bo v s được đánh giá.

V mt khái nim:```text
if subject matches [x, y]:
    if x < y:
        execute body
    else:
        try next case
```Các v sĩ có th chy mã Python tùy ý. H có th đưa ra các ngoi l, gi hàm, thay đổi trng thái hoc ph thuc vào tên đã ghi.

Nếu người bo v đánh giá là sai, trường hp đó được coi là không được chn và vic so khp s tiếp tc vi trường hp tiếp theo.

## 37.11 Mẫu trình tự

Mu trình t khp vi các đối tượng ging trình t.```python
match value:
    case [x, y]:
        result = x + y
```Điu này phù hp vi chui có độ dài hai.

Ví d có th phù hp:```python
[1, 2]
(1, 2)
```Chui và byte không được coi là chui cho mc đích này, mc dù chúng ging chui trong các ng cnh khác.

So khp trình t cn kim tra:```text
is the subject a sequence pattern candidate
does it have the required length
extract elements
match nested subpatterns
bind names
```## 37.12 Mẫu trình tự được gắn dấu sao

Mu được gn du sao s ghi li phn gia có độ dài thay đổi.```python
match value:
    case [first, *middle, last]:
        ...
```Vì:```python
value = [1, 2, 3, 4]
```các ràng buc là:```text
first = 1
middle = [2, 3]
last = 4
```nh chp được gn du sao nhn được mt danh sách.

Mu yêu cu ít nht đủ phn t cho các v trí không được gn du sao.```python
case [first, *middle, last]:
```cn ít nht hai phn t.

## 37.13 Mẫu ánh xạ

Mu ánh x khp vi các đối tượng ging như ánh x.```python
match value:
    case {"name": name, "age": age}:
        ...
```Điu này kim tra xem ch đề có các khóa cn thiết hay không.

Vì:```python
value = {"name": "Ada", "age": 37, "city": "London"}
```mu khp và liên kết:```text
name = "Ada"
age = 37
```Các khóa b sung được cho phép tr khi mu s dng logic cht ch hơn bên ngoài mu, chng hn như b bo v.

Các mu ánh x cũng có th chp các mc còn li:```python
match value:
    case {"name": name, **rest}:
        ...
```Sau đó`rest`nhn được mt t đin các khóa chưa khp.

## 37.14 Mẫu lớp

Các mu lp khp vi các đối tượng theo loi và thuc tính.```python
match value:
    case Point(x, y):
        ...
```Điu này kim tra xem`value`là mt ví d ca`Point`, sau đó trích xut các trường.

Ý nghĩa ca các trường v trí được kim soát bi`Point.__match_args__`.

Ví d:```python
class Point:
    __match_args__ = ("x", "y")

    def __init__(self, x, y):
        self.x = x
        self.y = y
```Sau đó:```python
match p:
    case Point(x, y):
        ...
```v mt khái nim tương t như:```text
isinstance(p, Point)
x = p.x
y = p.y
```vi ng nghĩa khp mu và hành vi li.

## 37.15 Mẫu lớp từ khóa

Các mu lp có th đặt tên các thuc tính mt cách rõ ràng.```python
match value:
    case Point(x=0, y=y):
        ...
```Điu này phù hp vi mt`Point`ca ai`x`thuc tính phù hp`0`, và ràng buc`y`thuc tính.

Các mu lp t khóa không ph thuc vào`__match_args__`cho nhng thuc tính đó.

V mt khái nim:```text
check isinstance(value, Point)
get value.x and match against 0
get value.y and bind y
```Tra cu thuc tính có th thc thi mã, vì vy các mu lp có th có tác dng ph nếu liên quan đến các thuc tính hoc quyn truy cp thuc tính tùy chnh.

## 37,16`__match_args__`

`__match_args__`ánh x các trường mu lp v trí vào tên thuc tính.```python
class Point:
    __match_args__ = ("x", "y")
```Điu này cho phép:```python
case Point(a, b):
```có nghĩa là:```python
case Point(x=a, y=b):
```Đối vi các lp d liu và các b d liu được đặt tên, Python thường cung cp các`__match_args__`t động.

Nếu như`__match_args__`b thiếu, trng hoc không tương thích, các mu lp v trí có th b li hoc phát sinh li tùy thuc vào dng mu.

## 37.17 Mẫu lồng nhau

Các mu có th lng nhau.```python
match value:
    case {"point": Point(x, y), "label": label}:
        ...
```Điu này kim tra:```text
subject is a mapping
subject has key "point"
subject has key "label"
subject["point"] is a Point
extract Point.x and Point.y
bind label
```Các mu lng nhau được biên dch thành mt chui các hot động kim tra và trích xut.

Nếu bt k phn lng nhau nào b li thì toàn b trường hp s không thành công và vic so khp s tiếp tc vi trường hp tiếp theo.

## 37.18 Ràng buộc tên

Tên b ràng buc trong trường hp thành công s tr thành các biến cc b trong phm vi xung quanh.```python
def f(value):
    match value:
        case [x, y]:
            return x + y
        case _:
            return 0
```Trình biên dch x lý`x`Và`y`như tên địa phương trong`f`.

Điu này có th nh hưởng đến vic phân tích phm vi. Tên được mt mu ghi li là mt s xut hin ràng buc, tương t như s gán.

Ví d:```python
def f(value):
    match value:
        case x:
            return x
```Đây,`x`là địa phương để`f`.

## 37.19 Liên kết khớp không thành công

Không nên s dng mu b li làm ngun liên kết n định.

Ví d:```python
match value:
    case [x, 0]:
        ...
    case _:
        ...
```Nếu trường hp đầu tiên không thành công sau khi liên kết mt phn ca cu trúc, CPython phi tránh để l các liên kết mt phn là kết qu thành công.

Ng nghĩa ngôn ng không cho phép bn da vào tên b ràng buc trong các trn đấu tht bi.

Mã trình biên dch và trình thông dch phi tuân theo quy tc này.

## 37.20 Mã byte khớp mẫu

So khp mu s biên dch thành mã byte.

Mt ví d đơn gin:```python
def f(value):
    match value:
        case [x, y]:
            return x + y
        case _:
            return 0
```Cu trúc mã byte khái nim:```text
load subject

try sequence case:
    check sequence
    check length 2
    unpack into x, y
    execute body
    return

fallback:
    return 0
```CPython bao gm các mã opcode dành riêng cho mu để kim tra thông thường, chng hn như khp trình t, khp ánh x, trích xut khóa và khp lp. Tên và b cc opcode chính xác có th thay đổi gia các phiên bn.

## 37.21 Sao chép chủ đề

Ch đề thường phi có sn trong khi th nhiu trường hp.```python
match value:
    case [x]:
        ...
    case {"x": x}:
        ...
    case _:
        ...
```Nếu trường hp đầu tiên tht bi, trường hp th hai vn cn ch đề ban đầu.

Trình biên dch phát ra các thao tác ngăn xếp để sao chép, bo toàn hoc loi b ch đề nếu cn.

V mt khái nim:```text
subject on stack
try case 1
    if fail, restore subject
try case 2
    if fail, restore subject
fallback
```K lut ngăn xếp chính xác rt quan trng vì vic khp mu có nhiu đường dn li.

## 37.22 Đường dẫn Thất bại

Mt trường hp có th tht bi  nhiu đim:```text
wrong type
wrong sequence length
missing mapping key
class check fails
attribute extraction fails with AttributeError
nested subpattern fails
OR alternative fails
guard is false
```Mt s li là không khp bình thường. Nhng người khác là ngoi l thc s.

Vic so khp mu phi phân bit:```text
normal pattern failure
real runtime exception
```Ví d: khóa ánh x b thiếu có nghĩa là mu ánh x không khp.

Nhưng mt người nhn tài sn làm tăng`RuntimeError`trong mt mu lp s tuyên truyn ngoi l.

## 37.23 Bảo vệ và Ngoại lệ

Guard là mã Python thông thường.```python
match value:
    case x if check(x):
        ...
```Nếu như`check(x)`tăng lên, ngoi l lan truyn. Trình thông dch không coi đó là mt kết qu khp không thành công.

V mt khái nim:```text
pattern succeeds
evaluate guard
    returns true: select case
    returns false: try next case
    raises: propagate exception
```Điu này làm cho lính canh mnh m nhưng cũng hiu qu.

## 37.24 Tra cứu khóa ánh xạ

Các mu ánh x s dng tra cu khóa. Mt mu như:```python
case {"name": name}:
```kim tra xem ch đề có cha khóa không`"name"`và rút ra giá tr ca nó.

Vic trin khai phi tránh vô tình gi ra hành vi làm thay đổi ng nghĩa so vi các quy tc mu ánh x.

Hành vi cp ngun quan trng là:```text
required keys must exist
their values must match subpatterns
extra keys are allowed
```Nếu như`**rest`hin din, các cp khóa-giá tr chưa khp s được sao chép vào t đin mi.

## 37.25 Tra cứu thuộc tính mẫu lớp

Các mu lp có th thc hin tra cu thuc tính.```python
case Point(x=x, y=y):
```Điu này có th gi:```text
Point-related descriptors
properties
__getattribute__
__getattr__
```Nếu quyn truy cp thuc tính tăng lên`AttributeError`, mu lp có th b li do không khp vi thuc tính đó. Các trường hp ngoi l khác lan truyn.

Ví d:```python
class C:
    @property
    def x(self):
        raise RuntimeError("bad")

match C():
    case C(x=x):
        ...
```Điu này lan truyn`RuntimeError`.

## 37.26 Kết hợp mẫu và mô tả

Vì các mu lp s dng quyn truy cp thuc tính nên các b mô t có th tham gia.```python
class C:
    @property
    def x(self):
        return 10

match C():
    case C(x=10):
        result = "matched"
```Trình ly thuc tính chy trong quá trình khp.

Điu này có nghĩa là vic khp mu có th kích hot mã người dùng. Nó không phi lúc nào cũng là mt cuc kim tra kết cu th động.

## 37.27 So khớp mẫu và các lớp dữ liệu

Các lp d liu hot động t nhiên vi các mu lp.```python
from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

def f(p):
    match p:
        case Point(0, y):
            return y
        case Point(x, y):
            return x + y
```Các lp d liu thường cung cp`__match_args__`da trên các trường, do đó các mu lp v trí s hot động.

V mt khái nim:```text
Point(0, y)
    matches Point instance
    checks x == 0
    binds y from p.y
```## 37.28 So khớp mẫu và Enum

Enums thường được s dng vi các mu giá tr.```python
from enum import Enum

class TokenKind(Enum):
    NAME = 1
    NUMBER = 2

match kind:
    case TokenKind.NAME:
        ...
    case TokenKind.NUMBER:
        ...
```Các tên có du chm là các mu giá tr nên chúng so sánh vi các thành viên enum hin có.

Đừng viết:```python
case NAME:
```tr khi bn có ý định nm bt mt biến mi.

## 37.29 So khớp mẫu và AST

Đối sánh mu rt hu ích cho các cu trúc dng cây.```python
match node:
    case BinOp(left, "+", right):
        ...
    case Literal(value):
        ...
```Trình biên dch hoc trình thông dch có th s dng các mu lp để kim tra các loi nút.

Ví d:```python
@dataclass
class Literal:
    value: object

@dataclass
class BinOp:
    left: object
    op: str
    right: object
```Sau đó:```python
match node:
    case BinOp(Literal(a), "+", Literal(b)):
        return Literal(a + b)
```Điu này th hin s phân hy cu trúc mt cách trc tiếp.

## 37.30 So khớp mẫu và ngăn xếp mã byte

So khp mu s dng ngăn xếp giá tr khung ging như các mã byte khác.

Ch đề, giá tr được trích xut trung gian, kết qu so sánh và giá tr d phòng được bo toàn có th nm trong ngăn xếp.

Mt mu trình t:```python
case [x, y]:
```v mt khái nim thì:```text
subject
check sequence
check length
unpack two elements
store x
store y
execute body
```Nếu tht bi, các giá tr tm thi s được bt lên và trường hp tiếp theo bt đầu t hình dng ngăn xếp sch.

## 37.31 Trách nhiệm của trình biên dịch

Trình biên dch phi to mã byte để bo toàn mt s bt biến:```text
subject evaluated once
cases tried in order
successful pattern bindings visible in body
failed pattern bindings not relied on
guards evaluated after binding
guards can access bound names
stack shape valid at every jump
exceptions propagate correctly
only first successful case runs
```Do đó, khp mu va là tính năng ngôn ng va là tính năng trình biên dch.

## 37.32 Trách nhiệm trong thời gian chạy

Khi chy, CPython phi thc hin:```text
type checks
sequence checks
mapping checks
class checks
attribute extraction
key extraction
equality checks
binding
guard evaluation
failure jumps
exception propagation
```Mt s thao tác này là các thao tác chung ca Python và có th gi mã người dùng.

Ví d:```python
case SomeClass(x=x):
```có th thc thi logic mô t cho`x`.

```python
case 10:
```có th s dng so sánh bình đẳng.

Vic khp mu phi chính xác theo mô hình đối tượng động ca Python.

## 37.33 Khớp mẫu và bình đẳng

Các mu ch và giá tr có th s dng s bình đẳng.```python
case 10:
```phù hp nếu ch đề bng`10`.

Đối vi các đối tượng do người dùng định nghĩa, đẳng thc có th gi`__eq__`.

```python
class C:
    def __eq__(self, other):
        print("compare")
        return True

match C():
    case 10:
        print("matched")
```Điu này có th thc thi mã người dùng.

Nếu đẳng thc to ra mt ngoi l, ngoi l đó s lan truyn.

## 37.34 Kết hợp mẫu và hiệu suất

Vic kết hp mu có th rõ ràng nhưng nó không phi là phép thut. Nó vn thc hin kim tra thi gian chy.

Chi phí có th bao gm:```text
type checks
length checks
mapping lookups
attribute lookups
equality comparisons
temporary allocations
guard execution
bytecode branches
```Mt cách đơn gin`if`chui có th nhanh hơn đối vi các trường hp vô hướng rt nh.

Khp mu hu ích nht khi cu trúc có vn đề:```text
nested data
AST nodes
protocol messages
token streams
configuration shapes
command parsing
event dispatch
```S dng nó  nơi nó ci thin s rõ ràng.

## 37.35 So khớp mẫu so với`if/elif`Cái này:```python
match value:
    case 0:
        ...
    case 1:
        ...
```có th tương t như:```python
if value == 0:
    ...
elif value == 1:
    ...
```Nhưng vic khp mu còn đi xa hơn:```python
match value:
    case {"type": "user", "name": name}:
        ...
    case ["move", x, y]:
        ...
    case Point(x=0, y=y):
        ...
```Nó kết hp các bài kim tra kiu, kim tra hình dng, gii nén và ràng buc.

## 37.36 So khớp mẫu và phân tích cấu trúc

Nhim v hy cu trúc yêu cu hình dng phi khp hoc tăng lên.```python
x, y = value
```Nếu như`value`không có chính xác hai mc, nó s tăng lên.

Các bài kim tra khp mu có hình dng và có th vượt qua.```python
match value:
    case [x, y]:
        ...
    case _:
        ...
```Không khp`[x, y]`ch cn th trường hp tiếp theo.

Vì vy, khp mu là phá hy có điu kin.

## 37.37 Đối sánh mẫu và phạm vi

Tên được ghi li trong các mu là các ràng buc cc b.```python
def f(value):
    match value:
        case x:
            return x
```Trình biên dch x lý`x`như địa phương để`f`.

Điu này có th gây ngc nhiên cho người dùng khi mong đợi s so sánh vi mt biến bên ngoài.```python
expected = 10

def f(value):
    match value:
        case expected:
            return True
```Điu này ghi li thành mt tên địa phương`expected`. Nó không so sánh vi bên ngoài`expected`.

S dng:```python
def f(value):
    match value:
        case x if x == expected:
            return True
```hoc s dng hng s chm.

## 37.38 Các trường hợp khớp mẫu và không thể truy cập

Mt kiu chp nm bt mi th.```python
match value:
    case x:
        ...
    case 0:
        ...
```Trường hp th hai là không th truy cp được.

Tương t:```python
case _:
```vì trường hp chưa phi là trường hp cui cùng khiến các trường hp sau này không th truy cp được.

Trình biên dch phát hin mt s mu không th bác b  các v trí không hp l.

Mt mu không th bác b là mt mu luôn phù hp, chng hn như:```text
_
x
object()
```trong nhiu bi cnh.

## 37.39 Khớp mẫu và`object()`Một mẫu lớp không có đối số có thể khớp với bất kỳ phiên bản nào của lớp đó.```python
case object():
```Vì gn như tt c các đối tượng bình thường đều là nhng th hin ca`object`, điu này hoàn toàn phù hp.

Nó khác vi:```python
case object:
```đó là mt mu chp có tên`object`, tr khi cú pháp được gii quyết khác nhau thông qua ng cnh. Tránh đặt tên mơ h trong các mu.

## 37.40 Khớp mẫu và`None`Để phù hợp`None`, sử dụng:```python
case None:
```Đây là mt mu đơn theo nghĩa đen.

Không s dng:```python
case x:
```và mong đợi nó so sánh vi bên ngoài`x`.

Mu đơn cho`None`, `True`, Và`False`là ph biến và rõ ràng.

## 37.41 So khớp mẫu và bảo mật

Khp mu có th thc thi mã người dùng.

Các đim thc hin tim năng bao gm:```text
equality comparison
attribute access
descriptor access
mapping methods
sequence methods
guard expressions
```Đối vi các đối tượng trong b nh đáng tin cy, điu này là bình thường.

Đối vi các đối tượng không đáng tin cy có phương thc thù địch, vic khp mu phi được x lý ging như thc thi Python thông thường, không phi là truy vn khai báo an toàn.

## 37.42 Kiểm tra việc khớp mẫu

s dng`dis`để kim tra mã byte phù hp.```python
import dis

def f(value):
    match value:
        case [x, y]:
            return x + y
        case {"x": x}:
            return x
        case _:
            return 0

dis.dis(f)
```Hãy tìm:```text
subject handling
pattern-specific checks
unpack operations
mapping operations
jumps between cases
stores for captured names
guard evaluation
return paths
```Mã byte chính xác thay đổi trên các phiên bn Python.

## 37.43 Công cụ so khớp mẫu tối thiểu

Mt công c so khp cu trúc nh cho danh sách có th th hin ý tưởng.```python
def match_pair(value):
    if isinstance(value, (list, tuple)) and len(value) == 2:
        x, y = value
        return True, {"x": x, "y": y}
    return False, {}
```S dng:```python
ok, binds = match_pair([1, 2])
if ok:
    print(binds["x"] + binds["y"])
```Điu này phn ánh mt phn nh ca:```python
match value:
    case [x, y]:
        print(x + y)
```CPython thc hin điu này thông qua mã byte được biên dch và trình tr giúp thi gian chy thay vì t đin các ràng buc.

## 37.44 Những hiểu lầm phổ biến

| Hiu lm | Đúng mu |
|---|---|
|`match`ch là mt câu lnh switch | Nó thc hin khp cu trúc và liên kết |
|`case x`so sánh vi biến`x`| Nó nm bt ch đề vào`x` |
| `_`là chp bình thường |`_`là ký t đại din trong mu |
| Ch đề được đánh giá cho mi trường hp | Nó được đánh giá mt ln |
| Vic khp mu không có tác dng ph | Nó có th gi đẳng thc, b mô t, b bo v và móc thuc tính |
| Trn đấu tht bi là ngoi l | Li mu thông thường s chuyn sang trường hp tiếp theo |
| Các mu lp kim tra các trường trc tiếp | H s dng quyn truy cp thuc tính và`__match_args__`|
| Khp mu luôn nhanh hơn`if`| Nó vn thc hin kim tra thi gian chy |

## 37,45 Chiến lược đọc

Bt đầu vi trường hp vô hướng:```python
def f(x):
    match x:
        case 0:
            return "zero"
        case _:
            return "other"
```Sau đó thêm cu trúc:```python
def f(x):
    match x:
        case [a, b]:
            return a + b
        case {"name": name}:
            return name
```Sau đó thêm các lp:```python
class Point:
    __match_args__ = ("x", "y")

def f(p):
    match p:
        case Point(0, y):
            return y
        case Point(x, y):
            return x + y
```Đối vi mi phiên bn:```python
import dis
dis.dis(f)
```Theo dõi:```text
where the subject is stored
where each case begins
which checks can fail normally
which operations can raise
where names are bound
where guards run
where fallback jumps go
```## 37.46 Tóm tắt chương

Khp mu là h thng điu phi có điu kin cu trúc ca CPython. Nó đánh giá mt ch đề mt ln, th các trường hp theo th t, kim tra các mu, liên kết tên, đánh giá các lính canh và thc thi phn thân phù hp đầu tiên.

Mô hình ct lõi là:

```văn bn
đánh giá ch đề mt ln
    
th mu trường hp
    
nếu mu không thành công: dn dp và th trường hp tiếp theo
    
nếu mu thành công: liên kết tên
    
nếu bo v tn ti: đánh giá bo v
    
nếu bo v đúng hoc vng mt: thc thi phn thân