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
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 đangfrom 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ụcfrom 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àofrom 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ỗifrom 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ếnfrom 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ự chofrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
06from 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ếnfrom 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ốifrom 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ấtfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
24from 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ậpfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
26from 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ụpfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
28from 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ữ trongfrom 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ốifrom 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ớifrom 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ặcfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
17from 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ếnfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
19from 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ếufrom 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ụngfrom 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ạifrom 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ậpfrom enum import Enum class Command[Enum]: QUIT = 0 RESET = 1 match command: case Command.QUIT: quit[] case Command.RESET: reset[]
45from 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ằngfrom 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ỳ