Python's
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
1 không chỉ là một câu lệnh chuyển đổi đơn giản. Nếu bạn sử dụng trần mà bạn coi là "tên biến", chúng thực sự sẽ được chụp các mẫu. Theo định nghĩa trong PEP số. 634Bên cạnh thực tế là bạn có thể không nên sử dụng
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
1 cho trường hợp sử dụng của mình, bạn phải sử dụng tên đủ điều kiện [chấm] theo một trong các cách sau:#1 Đối tượng phẳng
statuses = object[]
statuses.success = 200
status.not_found = 404
def handle[retcode]:
match retcode:
case statuses.success: print["Success"]
case statuses.not_found: print["Not found"]
#2 Lập trình hướng đối tượng
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
#3 Truy cập địa phương đủ điều kiện đơn giản []/Globals []
Tôi đã phát triển thư viện Match-Ref cho phép bạn truy cập bất kỳ biến cục bộ hoặc toàn cầu nào trong hoặc ngoài bất kỳ chức năng nào, chỉ cần sử dụng tiền tố
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
3.from matchref import ref
import random
SUCCESS = 200
NOT_FOUND = 404
def handle[retcode]:
random_code = random.randint[600,699]
match retcode:
case ref.SUCCESS: print["Success"]
case ref.NOT_FOUND: print["Not found"]
case ref.random_code: print["OK, you win!"]
Như bạn có thể thấy,
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
4 tự động giải quyết các biến từ các không gian tên địa phương và toàn cầu của bạn [theo thứ tự này]. Không có thiết lập bổ sung cần thiết.Nếu bạn không muốn sử dụng thư viện của bên thứ 3, bạn có thể thấy phiên bản không có thư viện tương tự một chút bên dưới.
#4 Truy cập địa phương []/Globals [] đủ điều kiện mà không có LIBS bên thứ 3
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
5 và class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
6 là các hàm tích hợp trong Python trả về class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
7 chứa tất cả các tên biến của bạn được ánh xạ tới các giá trị tương ứng của chúng. Bạn cần có khả năng truy cập các giá trị của Dict bằng cú pháp chấm, vì class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
1 cũng không hỗ trợ cú pháp truy cập từ điển. Do đó, bạn có thể viết lớp trợ giúp đơn giản này:class GetAttributeDict[dict]:
def __getattr__[self, name]:
return self[name]
và sử dụng nó như vậy:
import random
SUCCESS = 200
NOT_FOUND = 404
def handle[retcode]:
random_code = random.randint[600, 699]
globs = GetAttributeDict[globals[]]
locs = GetAttributeDict[locals[]]
match retcode:
case globs.SUCCESS: print["Success"]
case globs.NOT_FOUND: print["Not found"]
case locs.random_code: print["OK , you win!"]
#5 Truy cập mô -đun
Cho rằng bạn dường như có ý định sử dụng lại mã trạng thái của mình [vì nếu không, bạn có thể sắp xếp chúng trong
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
9 s của bạn], bạn có thể xem xét sử dụng các mô-đun riêng cho việc này.from matchref import ref
import random
SUCCESS = 200
NOT_FOUND = 404
def handle[retcode]:
random_code = random.randint[600,699]
match retcode:
case ref.SUCCESS: print["Success"]
case ref.NOT_FOUND: print["Not found"]
case ref.random_code: print["OK, you win!"]
0SUCCESS = 200
NOT_FOUND = 404
from matchref import ref
import random
SUCCESS = 200
NOT_FOUND = 404
def handle[retcode]:
random_code = random.randint[600,699]
match retcode:
case ref.SUCCESS: print["Success"]
case ref.NOT_FOUND: print["Not found"]
case ref.random_code: print["OK, you win!"]
1import constants
match retcode:
case constants.SUCCESS: ...
...
Một lần nữa, bạn có thể muốn xem xét lại nếu bạn muốn sử dụng
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
1. Python 3.10 đang thêm một tính năng mới có tên là khớp mẫu cấu trúc, được định nghĩa trong PEP 634 và có hướng dẫn về chủ đề trong PEP 636. Mẫu cấu trúc khớp với câu lệnh CASE / SWITE cho Python. Cú pháp mới vượt xa những gì một số ngôn ngữ sử dụng cho các câu lệnh trường hợp của họ. is adding a new feature called Structural Pattern Matching, which is defined in PEP 634 and has a tutorial on the topic in PEP 636. Structural Pattern Matching brings the case / switch statement to Python. The new syntax goes beyond what some languages use for their case statements.
Mục đích của hướng dẫn này là giúp bạn làm quen với cú pháp mới mà bạn có thể sử dụng trong Python 3.10. Nhưng trước khi bạn đi sâu vào hóa thân mới nhất của Python, hãy xem lại những gì bạn có thể sử dụng trước khi 3.10 xuất hiện
Python trước 3.10
Python luôn có một số giải pháp mà bạn có thể sử dụng thay vì câu lệnh trường hợp hoặc chuyển đổi. Một ví dụ phổ biến là sử dụng Python's ____ 23 -________ 24 -________ 25As được đề cập trong câu trả lời Stackoverflow này. Trong câu trả lời đó, nó hiển thị ví dụ sau:
if x == 'a': # Do the thing elif x == 'b': # Do the other thing if x in 'bc': # Fall-through by not using elif, but now the default case includes case 'a'! elif x in 'xyz': # Do yet another thing else: # Do the default
Đây là một thay thế khá hợp lý để sử dụng một câu lệnh trường hợp.
Một giải pháp phổ biến khác mà bạn sẽ tìm thấy trên StackOverflow và các trang web khác là sử dụng từ điển của Python để làm điều gì đó như thế này:
choices = {'a': 1, 'b': 2} result = choices.get[key, 'default']
Có những giải pháp khác sử dụng lambdas bên trong từ điển hoặc các chức năng bên trong từ điển. Đây cũng là những giải pháp hợp lệ.
Sử dụng ________ 23 -____ ____ 24 -____ 25 có thể là phổ biến nhất và thường là giải pháp dễ đọc nhất trước khi phát hành Python 3.10.
Bắt đầu với kết hợp mô hình cấu trúc phù hợp
Phù hợp với mô hình cấu trúc mới của Python sử dụng hai từ khóa mới:
- khớp [không chuyển đổi!] [not switch!]
- case
Để xem cách sử dụng mã này, hãy xem ví dụ sau dựa trên hướng dẫn của Guido:
>>> status_code = 400 >>> match status_code: ... case 400: ... print["bad request"] ... case 200: ... print["good"] ... case _: print["Something else bad happened"] bad request
Mã này lấy status_code và bảo Python khớp với nó với một trong các trường hợp. Nếu trường hợp là _ [nhấn mạnh], thì trường hợp này không được tìm thấy và đó là trường hợp mặc định. Đó là tuyên bố trường hợp cuối cùng đôi khi được gọi là trường hợp "rơi xuống".
Kết hợp các chữ
Bạn có thể đơn giản hóa các tuyên bố trường hợp của bạn một chút bằng cách kết hợp các chữ cái mà bạn đang so sánh với. Ví dụ: bạn có thể muốn kiểm tra xem mẫu, status_code, phù hợp với nhiều chữ. Để làm điều đó, bạn sẽ sửa đổi mã của mình như thế này:
from matchref import ref
import random
SUCCESS = 200
NOT_FOUND = 404
def handle[retcode]:
random_code = random.randint[600,699]
match retcode:
case ref.SUCCESS: print["Success"]
case ref.NOT_FOUND: print["Not found"]
case ref.random_code: print["OK, you win!"]
9Đây là một ví dụ đầy đủ:
class StatusValues:
success = 200
not_found = 404
def handle[retcode]:
match retcode:
case StatusValues.success: print["Success"]
case StatusValues.not_found: print["Not found"]
0Đó không phải là tuyệt vời?
Gói lên
Kết hợp mô hình cấu trúc là một tính năng mới thú vị chỉ có sẵn trong Python 3.10 và mới hơn. Đó là một tính năng mới mạnh mẽ có nhiều cách sử dụng thú vị. Những trường hợp sử dụng đó có thể được giải quyết bằng các tính năng hiện có của Python không? Có lẽ, nhưng điều này làm cho nó thậm chí còn dễ dàng hơn!
Những bài viết liên quan
- Hướng dẫn phù hợp với mẫu của Guido
Người dùng Stack Overflow vui mừng khi kết hợp mẫu được thêm vào Python 3.10