Hướng dẫn should enum be plural python? - enum có nên là python số nhiều không?
Bạn sử dụng số ít hoặc số nhiều để liệt kê? Tôi nghĩ rằng nó có ý nghĩa tốt nhất với số nhiều trong Tuyên bố Show
... Nhưng tôi nghĩ rằng nó có ý nghĩa hơn với số ít khi sử dụng loại, ví dụ:
Tôi đã đọc một đề xuất ở đâu đó để sử dụng số ít trong các enum và số nhiều thông thường với cờ, nhưng tôi muốn nghe thêm một số ưu và nhược điểm. 2 Một đề xuất đến từ Hướng dẫn thiết kế .NET Framework, trang 59-60:
Trong khung .NET, hầu hết các enum "bình thường" (ví dụ: 3) có tên và enum cờ số ít (ví dụ: 4, 5) có tên số nhiều. Nó có ý nghĩa, vì một giá trị của một lá cờ có thể đại diện cho nhiều mục nhưng đối với một enum không Flag, nó chỉ có thể đại diện cho một mục duy nhất.
Đúng. Nếu bạn thực hiện trải nghiệm tinh thần khi thực hiện các enum như các lớp, thì thực tế là bạn sẽ sử dụng một tên số ít cho loại sẽ tiết lộ rằng việc sử dụng tên số ít cho các enum như vậy có ý nghĩa. Ví dụ.,
...
Đối với ai thích số nhiều trong enums, bạn sẽ đặt tên cho 8 đó?Nói chung, tôi coi một định nghĩa enum là một định nghĩa loại, với các giá trị của enum là các giá trị khác nhau mà loại có thể có; Do đó, nó có một tên số ít:
Microsoft khuyên bạn nên sử dụng tên số ít để liệt kê trừ khi nó sử dụng thuộc tính 9. Và như được lấy từ cuốn sách Hướng dẫn thiết kế khung, bạn không nên làm tăng các tên loại liệt kê với Enum, Flags, v.v. Và bạn không nên tiền tố các giá trị liệt kê với từ viết tắt hoặc từ viết tắt như phổ biến với các liệt kê VB trở lại trong ngày.1 Nó chủ quan và không quan trọng bạn sử dụng gì, miễn là bạn nhất quán (cá nhân tôi sử dụng số ít như nó mang theo từ các quy ước SQL của tôi) 3
Câu trả lời
trừu tượngTình trạng của các cuộc thảo luận Động lực Tình trạng của các cuộc thảo luậnĐộng lực Vấn đề phân chia quan trọng giữa 4 và 3 là liệu so sánh với số nguyên có ý nghĩa về mặt ngữ nghĩa hay không. Đối với hầu hết các cách sử dụng các liệt kê, nó là một tính năng để từ chối so sánh với các số nguyên; Các enum so sánh với các số nguyên dẫn, thông qua tính chuyển tiếp, để so sánh giữa các loại của các loại không liên quan, điều này không mong muốn trong hầu hết các trường hợp. Tuy nhiên, đối với một số mục đích sử dụng, khả năng tương tác lớn hơn với số nguyên là mong muốn. Chẳng hạn, đây là trường hợp thay thế các hằng số thư viện tiêu chuẩn hiện có (chẳng hạn như 7) bằng các bảng liệt kê.feature to reject comparison to integers; enums that compare to integers lead, through transitivity, to comparisons between enums of unrelated types, which isn’t desirable in most cases. For some uses, however, greater interoperability with integers is
desired. For instance, this is the case for replacing existing standard library constants (such as 7) with enumerations.Thảo luận thêm vào cuối tháng 4 năm 2013 đã dẫn đến kết luận rằng các thành viên liệt kê nên thuộc loại enum của họ: 8. Guido đã tuyên bố một quyết định về vấn đề này [5], cũng như các vấn đề liên quan là không cho phép phân lớp các enum [6], trừ khi họ xác định không có thành viên liệt kê [7].PEP đã được Guido chấp nhận vào ngày 10 tháng 5 năm 2013 [1]. Động lực[Dựa trên một phần vào động lực được nêu trong PEP 354] Các thuộc tính của một liệt kê rất hữu ích để xác định một tập hợp các giá trị không đổi liên quan, có thể có ý nghĩa ngữ nghĩa. Các ví dụ kinh điển là những ngày trong tuần (Chủ nhật đến thứ bảy) và các lớp đánh giá trường học (‘A, thông qua‘ D, và ‘F,). Các ví dụ khác bao gồm các giá trị trạng thái lỗi và trạng thái trong một quy trình được xác định. Có thể chỉ cần xác định một chuỗi các giá trị của một số loại cơ bản khác, chẳng hạn như 2 hoặc 0, để biểu thị các giá trị tùy ý riêng biệt. Tuy nhiên, một bảng liệt kê đảm bảo rằng các giá trị như vậy khác biệt với bất kỳ giá trị nào khác bao gồm, quan trọng là các giá trị trong các bảng liệt kê khác và các hoạt động mà không có ý nghĩa (Thời gian thứ tư hai lần) không được xác định cho các giá trị này. Nó cũng cung cấp một biểu diễn in có thể in thuận tiện của các giá trị enum mà không yêu cầu lặp lại tẻ nhạt trong khi xác định chúng (tức là không 1).Mô -đun và tên loạiChúng tôi đề xuất thêm một mô -đun có tên 2 vào thư viện tiêu chuẩn. Loại chính tiếp xúc với mô -đun này là 4. Do đó, để nhập mã người dùng loại 4 sẽ chạy:>>> from enum import Enum Đề xuất ngữ nghĩa cho loại liệt kê mớiTạo ra một enumCác liệt kê được tạo bằng cú pháp lớp, giúp chúng dễ đọc và viết. Một phương pháp tạo thay thế được mô tả trong API chức năng. Để xác định một liệt kê, lớp con 4 như sau:>>> from enum import Enum >>> class Color(Enum): ... red = 1 ... green = 2 ... blue = 3 Một lưu ý về danh pháp: Chúng tôi gọi 6 an enumeration (or enum) and 7, 8 are enumeration members (or enum members). Enumeration members also have values (the value of 7 is enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};0, etc.) 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 enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};1 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ề: 2Enums 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 liệt kêĐô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 đó 7 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). 4 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: 7Sao 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ệ: 8Tuy 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: 9Lặp lại các thành viên của một enum không cung cấp các bí danh: 0Thuộc tính đặc biệt enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};4 là một tên ánh xạ từ điển được đặt hàng 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: 1Thuộc tính enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};4 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: 2So sánhCác thành viên liệt kê được so sánh bằng danh tính: 3So sánh được đặt hàng giữa các giá trị liệt kê không được hỗ trợ. Enums không phải là số nguyên (nhưng xem intenum bên dưới): 4So sánh bình đẳng được xác định mặc dù: 5So 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): 6Cho phép các thành viên và thuộc tính của các liệt kêCá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: 7Then: 8Các quy tắc cho những gì được phép như sau: tất cả các thuộc tính được xác định trong một bảng liệt kê sẽ trở thành thành viên của bảng liệt kê này, ngoại trừ __dunder__ tên và mô tả [9]; Phương pháp là mô tả quá. Bị hạn chế phân lớp các bảng liệt kê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: 9Nhưng điều này được cho phép: 0Lý do cho quyết định này được đưa ra bởi Guido trong [6]. Cho phép các 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ê và phân lớp các bảng điều khiển trống cũng được sử dụng để thực hiện 3.IntenumMột biến thể của 4 được đề xuất cũng là một lớp con của 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: 1Tuy nhiên, họ vẫn có thể được so sánh với 4: 2 3 Các giá trị hoạt động như số nguyên theo những cách khác mà bạn mong đợi: 3Đối với đại đa số mã, 4 được khuyến khích mạnh mẽ, vì 3 phá vỡ một số lời hứa ngữ nghĩa về một bảng 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 liệt kê không liên quan khác). Nó chỉ nên được sử dụng trong những trường hợp đặc biệt mà không có lựa chọn nào khác; Ví dụ, khi các hằng số nguyên được thay thế bằng các bảng liệt kê và khả năng tương thích ngược là cần thiết với mã vẫn mong đợi số nguyên.Các mối liệt kê có nguồn gốc khác 3 sẽ là một phần của mô -đun 2. Tuy nhiên, sẽ rất đơn giản để thực hiện độc lập: 4Điều này cho thấy cách các liệt kê có nguồn gốc tương tự có thể được xác định, ví dụ A >>> from enum import Enum7 trộn trong 0 thay vì 2.Một số quy tắc:
NgâmTái lập có thể được ngâm và không được giải thích: 5Cá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 đó. API chức năngLớp 4 có thể gọi được, cung cấp API chức năng sau: 6Các ngữ nghĩa của API này giống với >>> from enum import Enum >>> class Color(Enum): ... red = 1 ... green = 2 ... blue = 35. Đối số đầu tiên của cuộc gọi đến 4 là tên của bảng liệt kê. Các enum pickling được tạo với API chức năng sẽ hoạt động trên CPython và Pypy, nhưng đối với IronPython và Jython, bạn có thể cần chỉ định tên mô -đun một cách rõ ràng như sau: 7Đố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. Một lớp mới có nguồn gốc từ 4 được trả về. Nói cách khác, nhiệm vụ trên cho >>> from enum import Enum >>> class Color(Enum): ... red = 1 ... green = 2 ... blue = 38 tương đương với: 8Lý do mặc định đến enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};0 là số bắt đầu chứ không phải 00 là 00 là 02 theo nghĩa boolean, nhưng tất cả các thành viên enum đều đánh giá thành 03.Biến thể đề xuấtMột số biến thể đã được đề xuất trong các cuộc thảo luận trong danh sách gửi thư. Ở đây, một số trong những cái phổ biến hơn. flufl.enum 1 là triển khai tham chiếu mà PEP này ban đầu dựa trên. Cuối cùng, nó đã được quyết định chống lại sự bao gồm của 1 vì thiết kế của nó đã tách các thành viên liệt kê khỏi các liệt kê, vì vậy cái trước không phải là trường hợp của cái sau. Thiết kế của nó cũng cho phép rõ ràng các bảng liệt kê phân lớp để mở rộng chúng với nhiều thành viên hơn (do sự phân tách thành viên/enum, loại bất biến không bị vi phạm trong 1 với sơ đồ như vậy).Không phải chỉ định các giá trị cho enumsMichael Foord đã đề xuất (và Tim Delaney đã cung cấp một triển khai bằng chứng về khái niệm) để sử dụng ma thuật Metaclass giúp điều này có thể: 9Các giá trị thực sự chỉ được gán khi lần đầu tiên nhìn lên. Ưu điểm: Cú pháp Cleaner yêu cầu gõ ít hơn cho một nhiệm vụ rất phổ biến (chỉ liệt kê các tên liệt kê mà không quan tâm đến các giá trị). Nhược điểm: Liên quan đến nhiều phép thuật trong việc thực hiện, điều này làm cho ngay cả định nghĩa của các enum như vậy khi lần đầu tiên nhìn thấy. Bên cạnh đó, rõ ràng là tốt hơn tiềm ẩn. Sử dụng các tên hoặc biểu mẫu đặc biệt để tự động tham gia các giá trị enumMột cách tiếp cận khác để tránh chỉ định các giá trị enum là sử dụng tên hoặc biểu mẫu đặc biệt để tự động gán chúng. Ví dụ: 0Linh hoạt hơn: 1Một số biến thể về chủ đề này:
Ưu điểm: Không cần phải nhập thủ công các giá trị. Làm cho nó dễ dàng hơn để thay đổi enum và mở rộng nó, đặc biệt là đối với các liệt kê lớn. Nhược điểm: thực sự dài hơn để gõ trong nhiều trường hợp đơn giản. Đối số của rõ ràng so với ngầm áp dụng ở đây là tốt. Sử dụng trường hợp trong thư viện tiêu chuẩnThư viện tiêu chuẩn Python có nhiều nơi sử dụng các enum sẽ có lợi để thay thế các thành ngữ khác hiện đang được sử dụng để đại diện cho chúng. Các cách sử dụng như vậy có thể được chia thành hai loại: các hằng số đối diện với mã người dùng và hằng số bên trong. Các hằng số đối mặt với mã người dùng như hằng số mô-đun 10, 11, chế độ làm tròn thập phân và mã lỗi HTML có thể yêu cầu tương thích ngược vì mã người dùng có thể mong đợi số nguyên. 3 Như được mô tả ở trên cung cấp các ngữ nghĩa cần thiết; Là một lớp con của 2, nó không ảnh hưởng đến mã người dùng mong đợi số nguyên, trong khi mặt khác cho phép các biểu diễn có thể in được cho các giá trị liệt kê: 2Các hằng số bên trong không được nhìn thấy bởi mã người dùng nhưng được sử dụng bên trong các mô -đun stdlib. Chúng có thể được thực hiện với 4. Một số ví dụ được phát hiện bởi một phần rất nhỏ thông qua stdlib: 15, 16, 17, 18, 19, 20, 21.Ngoài ra, nhìn vào mã của thư viện xoắn, có nhiều trường hợp sử dụng để thay thế các hằng số trạng thái bên trong bằng enums. Điều tương tự cũng có thể nói về rất nhiều mã kết nối mạng (đặc biệt là triển khai các giao thức) và cũng có thể thấy trong các giao thức thử nghiệm được viết với thư viện tulip. Sự nhìn nhậnPEP này ban đầu được đề xuất bao gồm gói 1 [8] bởi Barry Warsaw vào stdlib, và được lấy cảm hứng từ những phần lớn của nó. Ben Finney là tác giả của PEP 354 trước đó.Người giới thiệuBản quyềnTài liệu này đã được đặt trong phạm vi công cộng. Nên được đặt tên là số nhiều?Enums trong Java (và có lẽ là enum nói chung) nên là số ít.Suy nghĩ là bạn không chọn nhiều giao thức, mà là một giao thức của các lựa chọn có thể trong danh sách các giá trị.should be singular. The thinking is that you're not selecting multiple Protocols, but rather one Protocol of the possible choices in the list of values.
Enum nên là số ít hay số nhiều?Chi tiết quy tắc.Quy tắc này thực thi tất cả các enum TypeScript là số ít.Một lỗi sẽ xảy ra nếu enum được xác định với một tên số nhiều.This rule enforces all TypeScript enums to be singular. An error will occur if the enum is defined with a pluralized name.
Làm thế nào nên đặt tên cho enum?Enums là các loại, vì vậy chúng nên được đặt tên bằng cách sử dụng các lớp Uppercamelcase.Các giá trị enum là hằng số, vì vậy chúng nên được đặt tên bằng cách sử dụng LowerCamelCase như hằng số hoặc all_caps nếu mã của bạn sử dụng kiểu đặt tên kế thừa đó.using UpperCamelCase like classes. The enum values are constants, so they should be named using lowerCamelCase like constants, or ALL_CAPS if your code uses that legacy naming style.
Có nên Enums được viết hoa Python?Theo quy ước, tên liệt kê bắt đầu bằng một chữ cái viết hoa và là số ít.Mô -đun Enum được sử dụng để tạo các liệt kê trong Python.. The enum module is used for creating enumerations in Python. |