Hướng dẫn install enum python - cài đặt enum python
Các enum đã được thêm vào Python 3,4 như được mô tả trong PEP 435. Nó cũng đã được đặt lại thành 3,3, 3.2, 3.1, 2.7, 2.6, 2.5 và 2.4 trên PYPI. Show
Đối với các kỹ thuật enum nâng cao hơn, hãy thử thư viện AENUM (2.7, 3.3+, cùng tác giả với 3. Mã không hoàn toàn tương thích giữa PY2 và PY3, ví dụ: bạn sẽ cần 4 trong Python 2).
Cài đặt 9 (không có số) sẽ cài đặt phiên bản hoàn toàn khác và không tương thích.
hoặc tương đương:
Trong các phiên bản trước, một cách hoàn thành enums là:
được sử dụng như vậy:
Bạn cũng có thể dễ dàng hỗ trợ liệt kê tự động với một cái gì đó như thế này:
và được sử dụng như vậy:
Hỗ trợ chuyển đổi các giá trị trở lại tên có thể được thêm vào theo cách này:
Điều này ghi đè bất cứ điều gì với tên đó, nhưng nó rất hữu ích cho việc hiển thị các enum của bạn trong đầu ra. Nó sẽ ném 0 nếu ánh xạ ngược không tồn tại. Với ví dụ đầu tiên:
Nếu bạn đang sử dụng MyPy một cách khác để thể hiện "Enums" là với 1.Ví dụ: _Private__names¶ Tên riêng sẽ là các thuộc tính bình thường trong Python 3.11 thay vì lỗi hoặc thành viên (tùy thuộc vào việc tên kết thúc bằng dấu gạch dưới). Sử dụng các tên này trong 3.10 sẽ phát hành 2 Kiểu thành viênGhi chú Trong mã Python 2, thuộc tính 87 là cần thiết vì thứ tự định nghĩa bị mất trước khi có thể ghi lại._Private__names¶ Tên riêng sẽ là các thuộc tính bình thường trong Python 3.11 thay vì lỗi hoặc thành viên (tùy thuộc vào việc tên kết thúc bằng dấu gạch dưới). Sử dụng các tên này trong 3.10 sẽ phát hành def enum(**enums): return type('Enum', (), enums) 96. 2 Kiểu thành viên 2 Thành viên là trường hợp của lớp 2 của họ và thường được truy cập là 00. Trong một số trường hợp nhất định, chúng cũng có thể được truy cập là 01, nhưng bạn không bao giờ nên làm điều này vì tra cứu đó có thể thất bại hoặc tệ hơn, trả lại một cái gì đó bên cạnh thành viên 2 mà bạn đang tìm ):Hành vi này không được chấp nhận và sẽ bị xóa trong 3.11. Thay đổi trong phiên bản 3.5.Giá trị boolean của các lớp 2 và thành viên 2 Các thành viên được trộn với các loại không phải là -____ 82 (chẳng hạn như >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2, 11, v.v.) được đánh giá theo các quy tắc loại hỗn hợp; Mặt khác, tất cả các thành viên đánh giá là 59. Để làm cho đánh giá boolean của riêng bạn phụ thuộc vào giá trị thành viên, cộng thêm giá trị sau vào lớp của bạn: 2 Các lớp luôn đánh giá là 59. 2 Các lớp với Phương thức lorNếu bạn cung cấp các phương thức phụ 2 của bạn, như lớp Planet ở trên, các phương thức đó sẽ hiển thị trong một 13 của thành viên, nhưng không phải của lớp:Kết hợp các thành viên của ________ 84¶()Nếu một kết hợp các thành viên cờ không được đặt tên, 40 sẽ bao gồm tất cả các cờ được đặt tên và tất cả các kết hợp các cờ có tên trong giá trị:Trong 3.11, các kết hợp cờ không được đặt tên sẽ chỉ tạo ra các thành viên cờ chính tắc (còn gọi là cờ có giá trị đơn). Vì vậy, 16 sẽ tạo ra một cái gì đó như 17.Mới trong phiên bản 3.4. Mã nguồn: lib/enum.py 4, 5, 7Một liệt kê là một tập hợp các tên biểu tượng (thành viên) bị ràng buộc với các giá trị duy nhất, không đổi. Trong một bảng liệt kê, các thành viên có thể được so sánh bằng danh tính và bản thân việc liệt kê có thể được lặp lại.Trường hợp của các thành viên enum >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ... Ghi chú Giá trị thành viên enum Giá trị thành viên có thể là bất cứ điều gì: >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2, 11, v.v. Phải cẩn thận nếu bạn trộn 7 với các giá trị khác.
Ghi chú Danh pháp
Các thành viên liệt kê có các biểu diễn chuỗi có thể đọc được của con người: 0Trong khi 21 của họ có thêm thông tin: 1Loại thành viên liệt kê là bảng liệt kê mà nó thuộc về: 2Các thành viên của Enum cũng có một tài sản chỉ chứa tên mặt hàng của họ: 3Tái liệt trình hỗ trợ lặp lại, theo thứ tự định nghĩa: 4Các thành viên liệt kê có thể băm, vì vậy chúng có thể được sử dụng trong từ điển và bộ: 5Truy cập chương trình vào các thành viên bảng liệt kê và các thuộc tính của họ JoĐôi khi, nó rất hữu ích để truy cập các thành viên trong các lập trình theo chương trình (nghĩa là các tình huống trong đó 15 won đã làm vì màu chính xác không được biết đến trong thời gian viết chương trình). 2 cho phép truy cập như vậy: 6Nếu bạn muốn truy cập các thành viên Enum theo tên, hãy sử dụng quyền truy cập mục: 7Nếu bạn có thành viên Enum và cần 24 hoặc 25: 8Sao chép các thành viên và giá trị enumCó hai thành viên enum có cùng tên là không hợp lệ: 9Tuy nhiên, hai thành viên ENUM được phép có cùng giá trị. Cho hai thành viên A và B có cùng giá trị (và đầu tiên được xác định), B là bí danh đối với A. Tra cứu giá trị của giá trị của A và B sẽ trả về A. Tra cứu tên B của B cũng sẽ trả về A: 0Ghi chú Cố gắng tạo một thành viên có cùng tên với thuộc tính đã được xác định (một thành viên khác, một phương thức, v.v.) hoặc cố gắng tạo một thuộc tính có cùng tên với thành viên không được phép. Đảm bảo các giá trị liệt kê duy nhấtTheo mặc định, việc liệt kê cho phép nhiều tên là bí danh cho cùng một giá trị. Khi hành vi này không được mong muốn, bộ trang trí sau đây có thể được sử dụng để đảm bảo mỗi giá trị chỉ được sử dụng một lần trong bảng liệt kê: ________ 126 ________ 88 ________ 102¶Một nhà trang trí 08 dành riêng cho các liệt kê. Nó tìm kiếm một bảng liệt kê từ 30 thu thập bất kỳ bí danh nào mà nó tìm thấy; Nếu bất kỳ tìm thấy 31 được nêu ra với các chi tiết: 1Sử dụng các giá trị tự độngNếu giá trị chính xác là không quan trọng, bạn có thể sử dụng 7: 2Các giá trị được chọn bởi 33, có thể bị ghi đè: 3Ghi chú Mục tiêu của phương pháp 33 mặc định là cung cấp trình tự >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2 tiếp theo với trình tự >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2 cuối cùng được cung cấp, nhưng cách nó thực hiện đây là một chi tiết triển khai và có thể thay đổi. Ghi chú Phương pháp 33 phải được xác định trước bất kỳ thành viên nào.Sự lặp lạiLặp lại các thành viên của một enum không cung cấp các bí danh: 4Thuộc tính đặc biệt 30 là một bản đồ tên chỉ được đọc cho các thành viên. Nó bao gồm tất cả các tên được xác định trong bảng liệt kê, bao gồm các bí danh: 5Thuộc tính 30 có thể được sử dụng để truy cập chương trình chi tiết cho các thành viên liệt kê. Ví dụ: tìm tất cả các bí danh: 6So sánh lorCác thành viên liệt kê được so sánh bằng danh tính: 7So sánh được đặt hàng giữa các giá trị liệt kê không được hỗ trợ. Các thành viên enum không phải là số nguyên (nhưng xem intenum bên dưới): 8So sánh bình đẳng được xác định mặc dù: 9So sánh với các giá trị không kích thích sẽ luôn so sánh không bằng nhau (một lần nữa, 3 được thiết kế rõ ràng để hoạt động khác nhau, xem bên dưới): 0Các thành viên được phép và các thuộc tính của bảng liệt kê JoCác ví dụ trên sử dụng số nguyên cho các giá trị liệt kê. Sử dụng số nguyên ngắn và tiện dụng (và được cung cấp theo mặc định bởi API chức năng), nhưng không được thực thi nghiêm ngặt. Trong phần lớn các trường hợp sử dụng, người ta không quan tâm đến giá trị thực tế của một liệt kê là gì. Nhưng nếu giá trị là quan trọng, bảng liệt kê có thể có các giá trị tùy ý. Các bảng liệt kê là các lớp Python, và có thể có các phương pháp và phương pháp đặc biệt như bình thường. Nếu chúng ta có sự liệt kê này: 1Then: 2Các quy tắc cho những gì được cho phép như sau: các tên bắt đầu và kết thúc với một dấu gạch dưới được bảo lưu bởi enum và không thể được sử dụng; Tất cả các thuộc tính khác được xác định trong một bảng liệt kê sẽ trở thành thành viên của liệt kê này, ngoại trừ các phương pháp đặc biệt ( 41, 42, v.v.), các mô tả (Phương pháp cũng là mô tả) và tên biến được liệt kê trong 43.Lưu ý: Nếu liệt kê của bạn định nghĩa 44 và/hoặc 45 thì bất kỳ giá trị nào được trao cho thành viên ENUM sẽ được chuyển vào các phương thức đó. Xem hành tinh để biết một ví dụ.Các lớp con enum bị hạn chếMột lớp 2 mới phải có một lớp enum cơ sở, tối đa một loại dữ liệu cụ thể và nhiều lớp mixin dựa trên ____ 147 khi cần thiết. Thứ tự của các lớp cơ sở này là: 3Ngoài ra, phân lớp một liệt kê chỉ được phép nếu việc liệt kê không xác định bất kỳ thành viên nào. Vì vậy, điều này bị cấm: 4Nhưng điều này được cho phép: 5Cho phép phân lớp các enum xác định các thành viên sẽ dẫn đến vi phạm một số bất biến quan trọng của các loại và trường hợp. Mặt khác, thật hợp lý khi cho phép chia sẻ một số hành vi phổ biến giữa một nhóm các liệt kê. (Xem đặt hàng cho một ví dụ.) Nước ngâmTái lập có thể được ngâm và không được giải thích: 6Các hạn chế thông thường đối với Pickling áp dụng: Các enum có thể chọn phải được xác định ở cấp cao nhất của một mô -đun, vì việc không bị ràng buộc đòi hỏi chúng phải được nhập từ mô -đun đó. Ghi chú Với giao thức Pickle Phiên bản 4, có thể dễ dàng pickle enum lồng nhau trong các lớp khác. Có thể sửa đổi cách các thành viên enum được ngâm/không được giải thích bằng cách xác định 48 trong lớp liệt kê.API chức năngLớp 2 có thể gọi được, cung cấp API chức năng sau: 7Các ngữ nghĩa của API này giống với 50. Đối số đầu tiên của cuộc gọi đến 2 là tên của bảng liệt kê.Đối số thứ hai là nguồn gốc của tên thành viên liệt kê. Nó có thể là một chuỗi các tên được phân tách bằng khoảng trắng, một chuỗi các tên, một chuỗi các bộ 2 với các cặp khóa/giá trị hoặc ánh xạ (ví dụ: từ điển) của các tên thành các giá trị. Hai tùy chọn cuối cùng cho phép gán các giá trị tùy ý cho các bảng điều khiển; Các số nguyên tăng tự động khác bắt đầu với 1 (sử dụng tham số 52 để chỉ định giá trị bắt đầu khác). Một lớp mới có nguồn gốc từ 2 được trả về. Nói cách khác, nhiệm vụ trên cho 54 tương đương với: 8Lý do mặc định đến 55 là số khởi đầu chứ không phải 56 là 56 là 58 theo nghĩa boolean, nhưng tất cả các thành viên enum đều đánh giá thành 59.Các enum pickling được tạo bằng API chức năng có thể khó khăn vì các chi tiết triển khai ngăn xếp khung được sử dụng để thử và tìm ra mô -đun nào mà liệt kê được tạo trong (ví dụ: nó sẽ thất bại nếu bạn sử dụng chức năng tiện ích trong mô -đun riêng biệt và cũng có thể không hoạt động trên Ironpython hoặc Jython). Giải pháp là chỉ định tên mô -đun một cách rõ ràng như sau: 9Cảnh báo Nếu 60 không được cung cấp và enum không thể xác định nó là gì, các thành viên enum mới sẽ không thể không được biết đến; Để giữ lỗi gần hơn với nguồn, Pickling sẽ bị tắt.Trong một số trường hợp, giao thức Pickle 4 mới, dựa vào 61 được đặt đến vị trí nơi Pickle sẽ có thể tìm thấy lớp. Ví dụ: nếu lớp học được cung cấp trong lớp một ngày nào đó trong phạm vi toàn cầu:
0Chữ ký hoàn chỉnh là: 1giá trịNhững gì lớp enum mới sẽ ghi lại như tên của nó. TênCác thành viên enum. Đây có thể là một chuỗi khoảng trắng hoặc dấu phẩy (giá trị sẽ bắt đầu ở mức 1 trừ khi có quy định khác): 2hoặc một người lặp của tên: hoặc một trình lặp của các cặp (tên, giá trị): 3hoặc một bản đồ: 4Mô -đunTên của mô -đun nơi có thể tìm thấy lớp Enum mới. tên gọinơi có thể tìm thấy lớp enum mới. loại hìnhNhập để trộn vào lớp Enum mới. bắt đầuSố để bắt đầu đếm tại nếu chỉ có tên được truyền vào. Thay đổi trong phiên bản 3.5: Tham số bắt đầu đã được thêm vào.The start parameter was added. Có nguồn gốc từIntenum¶Biến thể đầu tiên của 2 được cung cấp cũng là một lớp con của >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2. Các thành viên của 3 có thể được so sánh với các số nguyên; Bằng cách mở rộng, các loại thuốc của các loại khác nhau cũng có thể được so sánh với nhau: 5Tuy nhiên, họ vẫn có thể được so sánh với các liệt kê 2 tiêu chuẩn: 6 3 Các giá trị hoạt động như số nguyên theo những cách khác mà bạn mong đợi: 7Intflag¶Biến thể tiếp theo của 2 được cung cấp, 5, cũng dựa trên >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2. Sự khác biệt là 5 Các thành viên có thể được kết hợp bằng cách sử dụng các toán tử bitwise (&, |, ^, ~) và kết quả vẫn là thành viên 5. Tuy nhiên, như tên gọi, 5 Các thành viên cũng phân lớp >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2 và có thể được sử dụng bất cứ nơi nào sử dụng >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2. Bất kỳ hoạt động nào trên một thành viên 5 bên cạnh các hoạt động bit khôn ngoan sẽ mất tư cách thành viên 5.Mới trong phiên bản 3.6. Mẫu 5 Lớp: 8Cũng có thể đặt tên cho các kết hợp: 9Một sự khác biệt quan trọng khác giữa 5 và 2 là nếu không có cờ được đặt (giá trị là 0), đánh giá boolean của nó là 58: 0Bởi vì các thành viên 5 cũng là các lớp con của >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2, họ có thể được kết hợp với họ: 1Lá cờ¶Biến thể cuối cùng là 4. Giống như 5, 4 Thành viên có thể được kết hợp bằng cách sử dụng các toán tử bitwise (&, |, ^, ~). Không giống như 5, chúng không thể được kết hợp với, cũng như không so sánh với bất kỳ liệt kê 4 nào khác, cũng như >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2. Mặc dù có thể chỉ định các giá trị trực tiếp nhưng nó được khuyến nghị sử dụng 7 làm giá trị và để 4 chọn một giá trị thích hợp.Mới trong phiên bản 3.6. Giống như 5, nếu sự kết hợp của 4 Các thành viên dẫn đến không có cờ nào được thiết lập, thì đánh giá Boolean là 58: 2Cờ riêng lẻ nên có các giá trị là sức mạnh của hai (1, 2, 4, 8, phạm), trong khi các kết hợp cờ giành được: 3Đặt tên cho điều kiện của No No Flags Set không thay đổi giá trị boolean của nó: 4Ghi chú Đối với phần lớn mã mới, 2 và 4 được khuyến nghị mạnh mẽ, vì 3 và 5 phá vỡ một số lời hứa ngữ nghĩa về một liệt kê (bằng cách so sánh với các số nguyên, và do đó bằng cách chuyển tiếp đến các bảng điều khiển không liên quan khác). 3 và 5 chỉ nên được sử dụng trong trường hợp 2 và 4 sẽ không làm; Ví dụ, khi các hằng số nguyên được thay thế bằng các liệt kê hoặc cho khả năng tương tác với các hệ thống khác.Khác¶Mặc dù 3 là một phần của mô -đun 03, nhưng sẽ rất đơn giản để thực hiện độc lập: 5Điều này cho thấy làm thế nào các liệt kê có nguồn gốc tương tự có thể được xác định; Ví dụ, 04 trộn trong 11 thay vì >>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...2. Một số quy tắc:
Khi nào nên sử dụng class Animal(Enum): ant = 1 bee = 2 cat = 3 dog = 4 44 so với ________ 145¶ 44 phải được sử dụng bất cứ khi nào bạn muốn tùy chỉnh giá trị thực của thành viên 2. Bất kỳ sửa đổi nào khác có thể đi trong 44 hoặc 45, với 45 được ưu tiên.Ví dụ: nếu bạn muốn chuyển một số mục cho hàm tạo, nhưng chỉ muốn một trong số chúng là giá trị: 6Ví dụ thú vịTrong khi 2, 3, 5 và 4 dự kiến sẽ bao gồm phần lớn các trường hợp sử dụng, họ không thể bao gồm tất cả. Dưới đây là các công thức nấu ăn cho một số loại bảng liệt kê khác nhau có thể được sử dụng trực tiếp hoặc làm ví dụ để tạo một bản thân riêng.Bỏ qua các giá trịTrong nhiều trường hợp sử dụng, người ta không quan tâm đến giá trị thực tế của một bảng liệt kê là gì. Có một số cách để xác định loại liệt kê đơn giản này:
Sử dụng bất kỳ phương pháp nào trong số này biểu thị cho người dùng rằng các giá trị này không quan trọng và cũng cho phép người ta thêm, xóa hoặc sắp xếp lại các thành viên mà không phải đánh số lại các thành viên còn lại. Bất cứ phương pháp nào bạn chọn, bạn nên cung cấp một 40 cũng che giấu giá trị (không quan trọng): 7Sử dụng ________ 87¶Sử dụng 7 sẽ giống như: 8Sử dụng ________ 147¶Sử dụng 47 sẽ giống như: 9Sử dụng chuỗi mô tảSử dụng một chuỗi như giá trị sẽ trông như thế nào: 0Sử dụng tùy chỉnh ____ 144¶Sử dụng tự động đánh số 44 sẽ giống như: 1Để tạo mục đích chung hơn 47, hãy thêm 48 vào chữ ký: 2Sau đó, khi bạn kế thừa từ 47, bạn có thể viết 50 của riêng mình để xử lý bất kỳ đối số bổ sung nào: 3Ghi chú Phương pháp 44, nếu được xác định, được sử dụng trong quá trình tạo ra các thành viên ENUM; Sau đó, nó được thay thế bằng Enum từ 44 được sử dụng sau khi tạo lớp để tra cứu các thành viên hiện tại.Đặt hàngMột liệt kê được đặt hàng không dựa trên 3 và do đó duy trì các bất biến 2 bình thường (chẳng hạn như không thể so sánh với các bảng điều khiển khác): 4Trùng lặpfreeenum¶Bị lỗi nếu tìm thấy tên thành viên trùng lặp thay vì tạo bí danh: 5Ghi chú Phương pháp 44, nếu được xác định, được sử dụng trong quá trình tạo ra các thành viên ENUM; Sau đó, nó được thay thế bằng Enum từ 44 được sử dụng sau khi tạo lớp để tra cứu các thành viên hiện tại.Đặt hàngMột liệt kê được đặt hàng không dựa trên 3 và do đó duy trì các bất biến 2 bình thường (chẳng hạn như không thể so sánh với các bảng điều khiển khác): 6Trùng lặpfreeenum¶Bị lỗi nếu tìm thấy tên thành viên trùng lặp thay vì tạo bí danh: 7Đây là một ví dụ hữu ích để phân lớp enum để thêm hoặc thay đổi các hành vi khác cũng như không cho phép bí danh. Nếu sự thay đổi mong muốn duy nhất là không cho phép bí danh, người trang trí from typing import Literal #python >=3.8 from typing_extensions import Literal #python 2.7, 3.4-3.7 Animal = Literal['ant', 'bee', 'cat', 'dog'] def hello_animal(animal: Animal): print(f"hello {animal}") hello_animal('rock') # error hello_animal('bee') # passes 6 có thể được sử dụng thay thế.Hành tinh¶ Nếu class Animal(Enum): ant = 1 bee = 2 cat = 3 dog = 4 44 hoặc class Animal(Enum): ant = 1 bee = 2 cat = 3 dog = 4 45 được xác định, giá trị của thành viên enum sẽ được chuyển sang các phương pháp đó:Thời gian Một ví dụ để hiển thị thuộc tính class Animal(Enum): ant = 1 bee = 2 cat = 3 dog = 4 43 đang sử dụng:Enums khác nhau như thế nào? ¶ Enums có một metaclass tùy chỉnh ảnh hưởng đến nhiều khía cạnh của cả hai lớp Enum có nguồn gốc và các trường hợp (thành viên) của chúng.Các lớp học EnumMetaclass 59 chịu trách nhiệm cung cấp 60, 61, 62 và các phương pháp khác cho phép người ta làm mọi việc với lớp 2 không thành công trên một lớp điển hình, chẳng hạn như danh sách (màu) hoặc some_enum_var có màu. 59 chịu trách nhiệm đảm bảo rằng nhiều phương pháp khác trong lớp 2 cuối cùng là chính xác (chẳng hạn như 44, 67, 41 và 15).Các thành viên enum (còn gọi là các trường hợp) ¶ Điều thú vị nhất về các thành viên Enum là họ là những người độc thân. def enum(**enums):
return type('Enum', (), enums)
from typing import Literal #python >=3.8
from typing_extensions import Literal #python 2.7, 3.4-3.7
Animal = Literal['ant', 'bee', 'cat', 'dog']
def hello_animal(animal: Animal):
print(f"hello {animal}")
hello_animal('rock') # error
hello_animal('bee') # passes
class Animal(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
|