Tôi có thể tìm ví dụ về các mẫu trong hệ sinh thái python ở đâu?

Cú pháp khớp mẫu được giới thiệu trong Python 3. 10 cho phép các kỹ thuật lập trình mới mạnh mẽ để ra quyết định trong ứng dụng

Bởi Serdar Yegulalp

Nhà văn cao cấp, InfoWorld.

hình ảnh robynmac / Getty

Mục lục

  • Giới thiệu khớp mẫu cấu trúc Python
  • Khớp với các biến bằng khớp mẫu cấu trúc Python
  • So khớp với nhiều phần tử bằng khớp mẫu cấu trúc Python
  • Các mẫu trong khớp mẫu cấu trúc Python
  • Khớp với các đối tượng bằng khớp mẫu cấu trúc Python
  • Sử dụng khớp mẫu cấu trúc Python hiệu quả

Cho xem nhiều hơn

Python, với tất cả sức mạnh và sự phổ biến của nó, từ lâu đã thiếu một dạng kiểm soát luồng có trong các ngôn ngữ khác—một cách để lấy một giá trị và so khớp nó một cách tao nhã với một trong số các điều kiện có thể xảy ra. Trong C và C++, đó là cấu trúc

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
4; . ”

Các cách truyền thống để làm điều này trong Python không đẹp. Một là viết một chuỗi

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
5 biểu thức. Cách khác là lưu trữ các giá trị để khớp dưới dạng các khóa trong từ điển, sau đó sử dụng các giá trị đó để thực hiện một hành động—e. g. , lưu trữ một hàm dưới dạng giá trị và sử dụng khóa hoặc một số biến khác làm đầu vào. Trong nhiều trường hợp, điều này hoạt động tốt, nhưng có thể cồng kềnh để xây dựng và bảo trì

[ Theo dõi các video hướng dẫn về Python thông minh của Serdar Yegulalp để tìm hiểu các thủ thuật Python thông minh trong 5 phút hoặc ít hơn ]

Sau khi nhiều đề xuất thêm một cú pháp giống như

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
4 vào Python không thành công, một đề xuất gần đây của nhà sáng tạo ngôn ngữ Python, Guido van Rossum và một số cộng tác viên khác đã được chấp nhận cho Python 3. 10. kết hợp mô hình cấu trúc. So khớp mẫu cấu trúc không chỉ giúp thực hiện khớp kiểu
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
4 đơn giản mà còn hỗ trợ nhiều trường hợp sử dụng hơn

Giới thiệu khớp mẫu cấu trúc Python

Khớp mẫu cấu trúc giới thiệu câu lệnh

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
8 và cú pháp mẫu cho Python. Tuyên bố
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
8 tuân theo cùng một phác thảo cơ bản như
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
4. Nó nhận một đối tượng, kiểm tra đối tượng dựa trên một hoặc nhiều mẫu khớp và thực hiện hành động nếu tìm thấy khớp

match command:
    case "quit":
        quit[]
    case "reset":
        reset[]
    case unknown_command:
        print [f"Unknown command '{unknown_command}']

Mỗi câu lệnh

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2 được theo sau bởi một mẫu để khớp với. Trong ví dụ trên, chúng tôi đang sử dụng các chuỗi đơn giản làm mục tiêu đối sánh của mình, nhưng có thể đối sánh phức tạp hơn

Python thực hiện so khớp bằng cách đi qua danh sách các trường hợp từ trên xuống dưới. Trong lần khớp đầu tiên, Python thực thi các câu lệnh trong khối

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2 tương ứng, sau đó bỏ qua đến cuối khối
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
4 và tiếp tục với phần còn lại của chương trình. Không có "sự thất bại" giữa các trường hợp, nhưng có thể thiết kế logic của bạn để xử lý nhiều trường hợp có thể xảy ra trong một khối
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2. [Thêm về điều này sau. ]

Cũng có thể chụp toàn bộ hoặc một phần trận đấu và sử dụng lại. Trong

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
6 trong ví dụ của chúng tôi ở trên, giá trị được "bắt giữ" trong biến
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
7 để chúng tôi có thể sử dụng lại nó

Khớp với các biến bằng khớp mẫu cấu trúc Python

Một lưu ý quan trọng đáng được đưa lên đây. Nếu bạn liệt kê các tên biến trong một câu lệnh

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2, điều đó không có nghĩa là phải so khớp nội dung của biến đã đặt tên. Các biến trong
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2 được sử dụng để nắm bắt giá trị đang được so khớp

Nếu bạn muốn khớp với nội dung của một biến, thì biến đó phải được thể hiện dưới dạng tên có dấu chấm, giống như một enum. Đây là một ví dụ

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]

Người ta không cần phải sử dụng enum; . Điều đó nói rằng, enums có xu hướng là cách quen thuộc và thành ngữ nhất để làm điều này trong Python

So khớp với nhiều phần tử bằng khớp mẫu cấu trúc Python

Chìa khóa để làm việc hiệu quả nhất với khớp mẫu không chỉ là sử dụng nó thay thế cho việc tra cứu từ điển. Đó là để mô tả cấu trúc của những gì bạn muốn khớp. Bằng cách này, bạn có thể thực hiện so khớp dựa trên số phần tử mà bạn đang so khớp hoặc sự kết hợp của chúng

Đây là một ví dụ phức tạp hơn một chút. Tại đây, người dùng nhập lệnh, tùy chọn theo sau là tên tệp

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
0

Hãy xem xét các trường hợp này theo thứ tự

  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    00 kiểm tra xem những gì chúng tôi đang
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    4 chống lại có phải là một danh sách chỉ có mục
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    02 hay không, xuất phát từ việc tách đầu vào
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    03 kiểm tra xem phần tử tách đầu tiên có phải là chuỗi
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    04 không và nếu có chuỗi thứ hai theo sau. Nếu vậy, chúng tôi lưu trữ chuỗi thứ hai trong biến
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    05 và sử dụng nó cho công việc tiếp theo. Tương tự cho
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    06
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    07 là một trận đấu ký tự đại diện. Nó phù hợp nếu không có trận đấu nào khác được thực hiện cho đến thời điểm này. Lưu ý rằng biến gạch dưới, 
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    08, không thực sự liên kết với bất kỳ thứ gì; . [Đó là lý do tại sao chúng tôi đề cập đến biến
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    21 trong phần thân của khối
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    2; không có gì được ghi lại. ]

Các mẫu trong khớp mẫu cấu trúc Python

Các mẫu có thể là các giá trị đơn giản hoặc chúng có thể chứa logic khớp phức tạp hơn. Vài ví dụ

  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    23. So khớp với giá trị duy nhất
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    24
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    25. Phù hợp với bộ sưu tập
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    26
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    27. Khớp với một bộ sưu tập có hai giá trị và đặt giá trị thứ hai vào biến chụp
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    28
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    29. So khớp với bộ sưu tập có ít nhất một giá trị. Các giá trị khác, nếu có, được lưu trữ trong
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    10. Lưu ý rằng bạn chỉ có thể bao gồm một mục được gắn dấu sao cho mỗi bộ sưu tập [giống như đối số dấu sao trong hàm Python]
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    11. Toán tử ________ 312 [________ 313] có thể được sử dụng để cho phép xử lý nhiều trường hợp trong một khối
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    2. Ở đây, chúng tôi khớp với
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    24,
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    16 hoặc
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    17
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    18. Tương tự như trên, ngoại trừ bây giờ chúng tôi đặt mục phù hợp vào biến
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    19
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    40. Chỉ khớp với ảnh chụp nếu
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    41 là đúng. Các biến chụp có thể được sử dụng trong biểu thức. Chẳng hạn, nếu chúng tôi sử dụng
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    42, thì
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    2 sẽ chỉ hợp lệ nếu giá trị được ghi lại
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    44 thực tế nằm trong bộ sưu tập
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    45
  • from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    46. Mọi tập hợp các mục bắt đầu bằng
    from enum import Enum
    class Command[Enum]:
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit[]
        case Command.RESET:
            reset[]
    
    47 sẽ khớp với

Khớp với các đối tượng bằng khớp mẫu cấu trúc Python

Tính năng tiên tiến nhất của hệ thống khớp mẫu cấu trúc của Python là khả năng khớp với các đối tượng có thuộc tính cụ thể. Hãy xem xét một ứng dụng mà chúng tôi đang làm việc với một đối tượng có tên là

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
48, mà chúng tôi muốn chuyển đổi thành tệp
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
49 và trả về từ hàm

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
2

Trong mỗi trường hợp trên, chúng tôi đang tìm kiếm một loại đối tượng cụ thể, đôi khi có các thuộc tính cụ thể. Trường hợp đầu tiên khớp với đối tượng

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
50 với thuộc tính
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
51 được đặt thành
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
52. Trường hợp thứ hai phù hợp nếu
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
51 là
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
54 hoặc
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
55. Trường hợp thứ ba khớp với bất kỳ đối tượng nào thuộc loại
from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
56, bất kể thuộc tính của nó. Và trường hợp cuối cùng là tất cả của chúng tôi nếu mọi thứ khác không thành công

Bạn cũng có thể thực hiện chụp với đối tượng phù hợp

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
1

Sử dụng khớp mẫu cấu trúc Python hiệu quả

Chìa khóa với khớp mẫu cấu trúc Python là viết các kết quả phù hợp bao gồm các trường hợp cấu trúc mà bạn đang cố gắng so khớp. Các thử nghiệm đơn giản đối với các hằng số là tốt, nhưng nếu đó là tất cả những gì bạn đang làm, thì một tra cứu từ điển đơn giản có thể là một lựa chọn tốt hơn. Giá trị thực của việc so khớp mẫu cấu trúc là có thể so khớp với một mẫu đối tượng, không chỉ một đối tượng cụ thể hoặc thậm chí là một lựa chọn trong số chúng

[ Cũng trên InfoWorld. 8 dấu hiệu bạn đang làm Python đúng]

Một điều quan trọng khác cần ghi nhớ là thứ tự của các trận đấu. Những kết quả khớp nào bạn kiểm tra trước sẽ có tác động đến hiệu quả và độ chính xác của kết quả khớp của bạn nói chung. Hầu hết những người đã xây dựng chuỗi

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
5 dài sẽ nhận ra điều này, nhưng khớp mẫu yêu cầu bạn phải suy nghĩ về thứ tự cẩn thận hơn do sự phức tạp tiềm ẩn. Đặt các kết quả khớp cụ thể nhất của bạn trước và các kết quả khớp chung nhất cuối cùng

Cuối cùng, nếu bạn gặp vấn đề có thể giải quyết bằng một chuỗi

from enum import Enum
class Command[Enum]:
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit[]
    case Command.RESET:
        reset[]
5 đơn giản hoặc tra cứu từ điển — hãy sử dụng cách đó để thay thế. Kết hợp mẫu là mạnh mẽ, nhưng không phổ biến. Sử dụng nó khi nó có ý nghĩa nhất cho một vấn đề

Có liên quan

  • con trăn
  • Ngôn ngữ lập trình
  • Phát triển phần mềm

Serdar Yegulalp là một nhà văn cao cấp tại InfoWorld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ

Những mẫu nào được sử dụng trong Python?

Theo nguyên tắc GOF, có tổng cộng 11 mẫu hành vi trong Python. Chuỗi trách nhiệm, Chỉ huy, Thông dịch viên, Người lặp lại, Người hòa giải, Vật kỷ niệm, Người quan sát, Trạng thái, Chiến lược, Bản mẫu, Khách truy cập .

Có các mẫu thiết kế trong Python không?

Có, Python có các mẫu thiết kế . Trên thực tế, các mẫu thiết kế chỉ đơn giản là cách để giải quyết vấn đề; . Bạn có thể triển khai hầu hết các mẫu thiết kế bằng nhiều ngôn ngữ lập trình.

Có bao nhiêu loại mẫu trong Python?

18 Ví dụ về Chương trình Mẫu trong Python.

Biểu diễn mẫu trong Python là gì?

Mẫu cho phép bạn tạo các loại và cách thể hiện khác nhau của một đối tượng bằng cách sử dụng cùng một mã cấu trúc . Bài chi tiết. Cách sử dụng trong Python.

Chủ Đề