Hướng dẫn should i use enum in python? - tôi có nên sử dụng enum trong python không?

Mục đích của Enums là gì? Họ tạo ra giá trị nào cho ngôn ngữ? Khi nào tôi nên sử dụng chúng và khi nào tôi nên tránh chúng?

Loại enum đã vào Python thông qua PEP 435. Lý do được đưa ra là:

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.

Khi sử dụng số và chuỗi cho mục đích này, chúng có thể được đặc trưng là "số ma thuật" hoặc "chuỗi ma thuật". Những con số hiếm khi mang theo chúng là ngữ nghĩa, và dây dễ bị nhầm lẫn [viết hoa?

Ngày trong tuần và các lớp thư của trường là ví dụ về loại bộ sưu tập giá trị này.

Đây là một ví dụ từ các tài liệu:

from enum import Enum

class Color[Enum]:
    red = 1
    green = 2
    blue = 3

Giống như lớp trần, điều này dễ đọc và thanh lịch hơn nhiều so với ví dụ được đặt tên, nó cũng không thay đổi, và nó có thêm lợi ích như chúng ta sẽ thấy dưới đây.

Thống lĩnh nghiêm ngặt: loại thành viên enum là enum

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True

Điều này cho phép bạn xác định chức năng trên các thành viên trong định nghĩa enum. Xác định chức năng trên các giá trị có thể được thực hiện bằng các phương pháp trước đó, nhưng nó sẽ rất không phù hợp.

Cải thiện: cưỡng chế chuỗi

Biểu diễn chuỗi có thể đọc được của con người, trong khi repr có thêm thông tin:

>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

Tôi thấy đây là một sự cải thiện so với các số ma thuật và thậm chí có thể tốt hơn các chuỗi từ tên gọi.

Lặp đi lặp lại [tương đương]:

Enum hỗ trợ lặp lại [như tên được đặt tên, nhưng không quá nhiều lớp trần] cũng vậy:

>>> for color in Color:
        print[color]
Color.red
Color.green
Color.blue

Thuộc tính

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
1 là một ánh xạ theo thứ tự các tên của các enum cho các đối tượng enum tương ứng của chúng [tương tự như hàm
>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
2 của tên gọi].

>>> Color.__members__
mappingproxy[OrderedDict[[['red', ], ['green', ], 
['blue', ]]]]

Được hỗ trợ bởi Pickle [Parity]

Bạn có thể tuần tự hóa và giải phóng enum [trong trường hợp bất cứ ai lo lắng về điều này]:

>>> import pickle
>>> color.red is pickle.loads[pickle.dumps[color.red]]
True

Cải thiện: Bí danh

Đây là một tính năng hay mà lớp học không có, và sẽ rất khó để nói bí danh ở đó trong

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
3.

class Color[Enum]:
    red = 1
    green = 2
    blue = 3
    really_blue = 3

Bí danh xuất hiện theo tên kinh điển, nhưng cả hai đều giống nhau:

>>> Color.blue is Color.really_blue
True

Nếu các bí danh nên bị cấm để tránh va chạm giá trị, hãy sử dụng trình trang trí

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
4 [một tính năng chiếm ưu thế].

Thống lĩnh nghiêm ngặt: So sánh được thực hiện với
>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
5

Enum được dự định sẽ được kiểm tra với

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
5, đây là một kiểm tra nhanh cho danh tính của một đối tượng trong quy trình.

>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True

Các bài kiểm tra cho bình đẳng cũng hoạt động, nhưng các bài kiểm tra về danh tính với

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
5 là tối ưu.

Các ngữ nghĩa khác nhau từ các lớp Python khác

Các lớp enum có ngữ nghĩa khác nhau từ các loại python thông thường. Các giá trị của enum là các trường hợp của enum và là những người độc thân trong bộ nhớ cho các giá trị đó - không có mục đích nào khác để khởi tạo chúng.

>>> Color.red is Color[1]

Điều này rất quan trọng để ghi nhớ, có lẽ đó là một nhược điểm, nhưng so sánh về chiều này là so sánh táo với cam.

Enums không được cho là được đặt hàng

Mặc dù lớp Enum biết những thứ tự được tạo ra, các enum không được cho là được đặt hàng. Đây là một tính năng bởi vì nhiều điều có thể được liệt kê không có trật tự tự nhiên, và do đó trật tự sẽ là tùy ý.

Tuy nhiên, bạn có thể đặt hàng Enums của bạn [xem phần tiếp theo].

Lớp con

Bạn không thể phân lớp một enum với các thành viên được tuyên bố, nhưng bạn có thể phân lớp một enum không tuyên bố các thành viên chia sẻ hành vi [xem công thức đặt hàng trong tài liệu].

Đây là một tính năng - rất ít có ý nghĩa khi phân lớp một enum với các thành viên, nhưng một lần nữa, so sánh là táo và cam.

Khi nào tôi nên sử dụng
>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
8?

Đây là sự liệt kê kinh điển mới trong Python. Các cộng tác viên sẽ hy vọng các enum của bạn sẽ hành xử như những enum này.

Sử dụng nó bất cứ nơi nào bạn có một nguồn dữ liệu được liệt kê trong mã của bạn, nơi bạn muốn được chỉ định rõ ràng để sử dụng tên chính tắc, thay vì dữ liệu tùy ý.

Ví dụ: nếu trong mã của bạn, bạn muốn người dùng nói rằng đó không phải là

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
9,
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

0, 2 hoặc
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

1, mà là
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

2 - sử dụng đối tượng enum.enum. Nó vừa rõ ràng và cụ thể.

Có rất nhiều ví dụ và công thức nấu ăn trong tài liệu.

Khi nào tôi nên tránh chúng?

Ngừng tự lăn hoặc để mọi người đoán về số ma thuật và chuỗi. Đừng tránh chúng. Nắm lấy chúng.

Tuy nhiên, nếu các thành viên enum của bạn được yêu cầu là số nguyên vì lý do lịch sử, thì có

>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

3 từ cùng một mô -đun, có cùng một hành vi, nhưng cũng là một số nguyên vì nó phân lớp
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

4 tích hợp trước khi phân lớp
>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

5. Từ ____ ____ 23 sự giúp đỡ:

>>> type[Color.red]

>>> isinstance[Color.green, Color]
True
0

Chúng ta có thể thấy rằng các giá trị intenum sẽ kiểm tra như một ví dụ của

>>> print[Color.red]
Color.red
>>> print[repr[Color.red]]

4.

Bạn có nên sử dụng Enum trong Python?

Các enum Python rất hữu ích để đại diện cho dữ liệu đại diện cho một tập hợp các trạng thái hữu hạn như ngày trong tuần, tháng trong năm, v.v. Chúng đã được thêm vào Python 3.4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2.4 thông qua pypy. Như vậy, bạn có thể mong đợi chúng là một yếu tố chính khi bạn khám phá lập trình Python. such as days of the week, months of the year, etc. They were added to Python 3.4 via PEP 435. However, it is available all the way back to 2.4 via pypy. As such, you can expect them to be a staple as you explore Python programming.

Bạn có nên sử dụng Enums không?

Bạn nên sử dụng các loại Enum bất cứ khi nào bạn cần đại diện cho một tập hợp các hằng số cố định.Điều đó bao gồm các loại enum tự nhiên như các hành tinh trong hệ mặt trời và bộ dữ liệu của chúng tôi nơi bạn biết tất cả các giá trị có thể có tại thời điểm biên dịch, ví dụ, các lựa chọn trên menu, cờ dòng lệnh, v.v.Đầu ra là: Thứ Hai là xấu.any time you need to represent a fixed set of constants. That includes natural enum types such as the planets in our solar system and data sets where you know all possible values at compile time—for example, the choices on a menu, command line flags, and so on. The output is: Mondays are bad.

Python enum có chậm không?

Nó là loại chậm.Chúng tôi đã sử dụng Enums rất nhiều trong mã của chúng tôi, cho đến khi chúng tôi nhận thấy rằng chi phí Enum chiếm tỷ lệ phần trăm số của thời gian CPU của chúng tôi!May mắn thay, chỉ mất vài giờ để viết một triển khai nhanh hơn nhiều với chức năng gần như tương tự.. We were using enums a lot in our code, until we noticed that enum overhead takes up single digit percentages of our CPU time! Luckily, it only took a few hours to write a much faster implementation with almost the same functionality.

Lợi ích của việc sử dụng Enums là gì?

Lợi ích của việc sử dụng bảng liệt kê bao gồm: giảm lỗi do chuyển hoặc nhầm.Giúp bạn dễ dàng thay đổi giá trị trong tương lai.Làm cho mã dễ đọc hơn, điều đó có nghĩa là ít có khả năng các lỗi sẽ tập trung vào nó.Reduces errors caused by transposing or mistyping numbers. Makes it easy to change values in the future. Makes code easier to read, which means it is less likely that errors will creep into it.

Bài Viết Liên Quan

Chủ Đề