Hướng dẫn python match case stack overflow - tràn ngăn xếp trường hợp trận đấu python

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ố. 634

Bê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!"]
0

SUCCESS = 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!"]
1

import 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

Python có trường hợp phù hợp không?

Python 3.10 đã được phát hành vào giữa năm 2021 và đi kèm với kết hợp mô hình cấu trúc, còn được gọi là một tuyên bố trường hợp phù hợp.Đây là tính năng mới quan trọng nhất của Python 3.10;Chức năng mới cho phép bạn dễ dàng kiểm soát luồng chương trình của mình bằng cách thực hiện một số phần của mã nếu điều kiện [hoặc trường hợp] được đáp ứng.. This is Python 3.10's most important new feature; the new functionality allows you to more easily control the flow of your programs by executing certain parts of code if conditions [or cases] are met.

Có phải trường hợp trận đấu Python 3.8 không?

Trường hợp trận đấu Python tương tự như câu lệnh Case Switch, được công nhận là khớp mẫu cấu trúc trong Python.Lưu ý: Cấu trúc trường hợp khớp có sẵn cho Python phiên bản 3.10 trở đi.The match case structure is available for python version 3.10 and onwards.

Python 3. 10 có câu lệnh chuyển đổi không?

Từ phiên bản 3.10 trở lên, Python đã triển khai một tính năng trường hợp chuyển đổi có tên là Mẫu cấu trúc phù hợp với mô hình cấu trúc.Bạn có thể triển khai tính năng này với các từ khóa phù hợp và trường hợp.Python has implemented a switch case feature called “structural pattern matching”. You can implement this feature with the match and case keywords.

Bài Viết Liên Quan

Chủ Đề