Python enum vs từ điển

Bài đăng này sẽ khám phá mô-đun Python enum, một công cụ mạnh mẽ để xử lý các tập dữ liệu không thay đổi

Đây không chỉ là phần không thể thiếu để phát triển phần mềm tổng quát mà còn là thứ bạn sẽ thấy thường thấy trong các trò chơi – biến nó thành một kỹ năng và nền tảng quan trọng để học bất kể mục tiêu mã hóa cá nhân của bạn là gì.

Hãy đi sâu vào và khám phá chủ đề hấp dẫn này về cách sử dụng enum trong Python

Điều kiện tiên quyết. Người đọc phải có kiến ​​thức làm việc về ngôn ngữ lập trình Python. Làm quen với cách viết các lớp cũng sẽ hữu ích vì các enum Python được triển khai dưới dạng các lớp Python.

Mục lục

  • Python Enum là gì?
  • Ví dụ đơn giản
    • In ra các thành viên của Python enum
    • Đảm bảo tính duy nhất
    • Cách khác để tạo Enum
  • Lặp lại các phần tử
    • cho vòng lặp
    • Thuộc tính __members__
  • băm
  • Giá trị tự động
  • Bảng liệt kê có nguồn gốc
    • Lá cờ
    • IntEnum
    • cờ quốc tế
  • Đặt hàng tùy chỉnh
  • Tài liệu tham khảo / Đọc thêm
  • Sự kết luận

Python Enum là gì?

Hãy thảo luận về Python enum là gì. Viết tắt của kiểu liệt kê, tính năng ngôn ngữ này xác định một tập hợp các tên được liên kết với các giá trị không đổi như số, chuỗi, v.v. Các enum Python rất hữu ích để biểu diễn dữ liệu đại diện cho một tập hợp trạng thái hữu hạn, chẳng 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 qua pypy. Như vậy, bạn có thể mong đợi chúng trở thành một yếu tố chính khi bạn khám phá lập trình Python

Ví dụ đơn giản

Chúng tôi định nghĩa một lớp enum đơn giản (i. e. một lớp bắt nguồn từ Enum) chứa các tháng trong năm. Mỗi tháng (tôi. e. thành viên enum) được gán một hằng số duy nhất

from enum import Enum, unique, Flag class Months(Enum) : JANUARY=1 FEBRUARY=2 MARCH = 3 APRIL=4 MAY=5 JUNE=6 JULY=7 AUGUST=8 SEPTEMBER=9 OCTOBER=10 NOVEMBER=11 DECEMBER=12

In ra các thành viên của Python enum

Có một số cách chúng ta có thể làm điều này

# by numerical index print (Months(7) Months.JULY # item index print (Months['JULY']) Months.JULY # by name print (Months.JULY) Months.JULY # by name print (Months.JULY.name) JULY # by value print (Months.JULY.value) JULY

Đảm bảo tính duy nhất

Thêm một trình trang trí @unique vào lớp, đảm bảo rằng các phần tử trùng lặp không tồn tại trong Python enum

from enum import Enum, unique, Flag >> @unique .. class Months(Enum) : .. JANUARY=1 .. JANUARY=1 .. FEBRUARY=2 .. MARCH = 3 .. APRIL=4 .. MAY=5 .. JUNE=6 .. JULY=7 .. AUGUST=8 .. SEPTEMBER=9 .. OCTOBER=10 .. NOVEMBER=11 .. DECEMBER=12 .. Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 4, in Months File "/home/raghavan/anaconda3/lib/python3.8/enum.py", line 112, in __setitem__ raise TypeError('Attempted to reuse key: %r' % key) TypeError: Attempted to reuse key: 'JANUARY'

TypeError xảy ra khi trình thông dịch Python cố tạo Python enum này

Cách khác để tạo Enum

Lớp Python Enum có thể gọi được và API chức năng sau có thể được gọi để tạo nó

>> quarter1= Enum('Q1', [('January', 1), ('February', 2), ('March', 3)]) >> print (quarter1(3)) Q1.March # can also be written as >> quarter1= Enum('Q1', ('January February March')) >> print (quarter1) <enum 'Q1'> # item access >>> quarter1['January'] <Q1.January: 1> >>> Quarter1.March <Q1.March: 3> >>> Quarter1.March.value 3

Lặp lại các phần tử

cho vòng lặp

Có thể sử dụng vòng lặp for đơn giản để in ra các phần tử.

# simple for loop for month in (Months) : print (month) Months.JANUARY Months.FEBRUARY Months.MARCH Months.APRIL Months.MAY Months.JUNE Months.JULY Months.AUGUST Months.SEPTEMBER Months.OCTOBER Months.NOVEMBER Months.DECEMBER

Thuộc tính __members__ attribute

__members__ là thuộc tính cấp lớp chỉ đọc cung cấp ánh xạ từ tên đến thành viên. Nó có thể được lặp đi lặp lại để tạo ra một đầu ra tương tự như trên

# iteration over elements for name, member in Months.__members__.items(): print (name, member) JANUARY Months.JANUARY FEBRUARY Months.FEBRUARY MARCH Months.MARCH APRIL Months.APRIL MAY Months.MAY JUNE Months.JUNE JULY Months.JULY AUGUST Months.AUGUST SEPTEMBER Months.SEPTEMBER OCTOBER Months.OCTOBER NOVEMBER Months.NOVEMBER DECEMBER Months.DECEMBER

băm

Python enums có thể được sử dụng làm khóa từ điển như sau

>> months = {} >> months[Months.JULY] = 'Many Birthdays' >> months[Months.JANUARY] = 'First Month of the Year' >> print (months[Months(7)]) Many Birthdays

Giá trị tự động

Các giá trị tương ứng với tên có thể được điền tự động bằng cách sử dụng auto() như minh họa bên dưới.

# member values using auto from enum import auto class Quarter(Enum): Q1 = auto() Q2 = auto() Q3 = auto() Q4 = auto() for qtr in Quarter: print (qtr.value) # Output 1 2 3 4

Các giá trị, theo mặc định, là số. Tuy nhiên, chúng có thể được chuyển đổi thành các giá trị chuỗi bằng cách ghi đè _generate_next_value_ trong lớp

________số 8

Bảng liệt kê có nguồn gốc

Lá cờ

Flag khá giống với Enum ngoại trừ nó có hỗ trợ cho các hoạt động bitwise (. , &, ^, ~). Các toán tử này có thể được sử dụng để kết hợp nhiều phần tử enum Python thành một mặt nạ

Lớp Hành tinh có nguồn gốc từ Flag và chứa 8 hành tinh hiện được Liên minh Thiên văn Quốc tế công nhận. Các giá trị của các phần tử được yêu cầu là bội số của hai trong khi các kết hợp không cần tuân theo hạn chế đó

class Planets(Flag): MERCURY = 1 VENUS = 2 EARTH = 4 MARS = 8 SATURN = 10 URANUS = 12 NEPTUNE = 14 my_planet = { Planets.MERCURY: "Red Planet", Planets.EARTH: "People !!!!!", Planets.MARS: "Martians !!!!" } # bitwise OR mask => Mercury / Earth. mercury_earth = Planets.MERCURY|Planets.EARTH # we check which planets in the given dictionary are # MARS or EARTH by doing a Bitwise AND with the mask above. for planet_name in myplanet.keys() : found = bool(planet_name & mercury_earth) print ("Found:" + str(planet_name) + ":" + str(found)) # Output Found:Planets.MERCURY:True Found:Planets.EARTH:True Found:Planets.MARS:False
  1. Lớp Hành tinh bắt nguồn từ Cờ . Nó chứa tên và giá trị của 8 hành tinh.
  2. Từ điển my_planet chứa tên liệt kê của Sao Thủy, Trái đất và Sao Hỏa làm khóa.
  3. Tạo mặt nạ bit bằng cách HOẶC -ing Các hành tinh. MERCURY và các hành tinh. TRÁI ĐẤT .
  4. Lặp lại các tên hành tinh trong từ điển và thực hiện Hiểu một chút VÀ giữa tên hành tinh và mặt nạ được tạo ở Bước 3. Chuyển đổi giá trị kết quả thành giá trị boolean .
  5. Thao tác bit & sẽ trả về True khi khóa phần tử khớp với Planet. THỦY NGÂN hoặc các hành tinh. TRÁI ĐẤTSai đối với bất kỳ hành tinh nào khác. Đầu ra phản ánh điều này.

IntEnum

IntEnum là một Python enum dẫn xuất cũng bắt nguồn từ int. Do đó, nó hỗ trợ các hoạt động int. Nó cung cấp các phép so sánh có thứ tự mà lớp Python Enum không cung cấp

# by numerical index print (Months(7) Months.JULY # item index print (Months['JULY']) Months.JULY # by name print (Months.JULY) Months.JULY # by name print (Months.JULY.name) JULY # by value print (Months.JULY.value) JULY0
  1. Kế thừa quý từ Enum
  2. Hãy thử so sánh số “

Chủ đề