Hầu hết các câu trả lời ở đây đều khá cũ và đặc biệt là những câu được chấp nhận, vì vậy nó có vẻ đáng để cập nhật.
Đầu tiên, Câu hỏi thường gặp về Python chính thức bao gồm điều này và khuyến nghị elif
chuỗi cho các trường hợp đơn giản và cho các trường hợp dict
lớn hơn hoặc phức tạp hơn. Nó cũng gợi ý một bộvisit_
phương thức (một kiểu được sử dụng bởi nhiều khung máy chủ) cho một số trường hợp:
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
Câu hỏi thường gặp cũng đề cập đến PEP 275 , được viết để có được quyết định chính thức một lần và tất cả về việc thêm các câu lệnh chuyển đổi kiểu C. Nhưng PEP đó thực sự đã được hoãn lại với Python 3 và nó chỉ bị từ chối chính thức dưới dạng một đề xuất riêng, PEP 3103 . Tất nhiên, câu trả lời là không có phần mềm nhưng hai PEP có liên kết đến thông tin bổ sung nếu bạn quan tâm đến lý do hoặc lịch sử.
Một điều xuất hiện nhiều lần (và có thể thấy trong PEP 275, mặc dù nó đã bị cắt ra như một đề xuất thực tế) là nếu bạn thực sự bận tâm khi có 8 dòng mã để xử lý 4 trường hợp, so với 6 trường hợp các dòng bạn có trong C hoặc Bash, bạn luôn có thể viết này:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Điều này không được PEP 8 khuyến khích chính xác, nhưng nó có thể đọc được và không quá khác thường.
Trong hơn một thập kỷ kể từ khi PEP 3103 bị từ chối, vấn đề về các tuyên bố trường hợp kiểu C, hoặc thậm chí phiên bản mạnh hơn một chút trong Go, đã bị coi là đã chết; Bất cứ khi nào bất cứ ai đưa ra ý tưởng về python hoặc -dev, họ đều đề cập đến quyết định cũ.
Tuy nhiên, ý tưởng về việc khớp mẫu theo kiểu ML đầy đủ xuất hiện cứ sau vài năm, đặc biệt là khi các ngôn ngữ như Swift và Rust đã áp dụng nó. Vấn đề là thật khó để sử dụng nhiều từ khớp mẫu mà không có các kiểu dữ liệu đại số. Trong khi Guido tỏ ra thông cảm với ý tưởng này, không ai đưa ra một đề xuất phù hợp với Python lắm. (Bạn có thể đọc 2014 strawman của tôi cho một ví dụ.) Điều này có thể thay đổi theo dataclass
trong 3,7 và một số đề xuất lẻ tẻ cho một mạnh hơn enum
để xử lý các loại Tóm lại, hoặc với các đề xuất khác nhau cho các loại khác nhau của các ràng buộc tuyên bố địa phương (như PEP 3150 , hoặc tập hợp các đề xuất hiện đang được thảo luận trên -ideas). Nhưng cho đến nay, nó đã không.
Thỉnh thoảng cũng có những đề xuất cho kết hợp kiểu Perl 6, về cơ bản là một sự nhầm lẫn của tất cả mọi thứ, từ elif
regex đến chuyển đổi loại một lần gửi.