Hướng dẫn convert enum to dictionary python - chuyển đổi enum sang python từ điển

Làm thế nào về một phương pháp thuần túy để chuyển đổi thành Enum? Chỉ cần cất cái này trong một lib Util. Hoặc bạn có thể đặt nó trên một lớp enum cơ sở và có mặc định Target_enum cho bản thân.

Cũng có thể điều chỉnh điều này để tăng một ngoại lệ thay vì sử dụng giá trị mặc định, nhưng mặc định hoạt động tốt hơn cho trường hợp cụ thể của tôi.

from enum import Enum
def to_enum(v,target_enum,default = None):
    '''
    if v is given enum, return it
    if v is an int, convert to enum via int convert
    if v is str convert to enum via string convert
    '''
    ret = default

    if v is None:
        return ret

    if v in target_enum:
        return v

    try:
        return target_enum(int(v))
    except Exception:
        pass

    try:
        return target_enum[str(v)]
    except Exception:
        pass

    return ret

Đây là lớp học nhất quán cho nó.

import unittest
from enum import Enum,unique
class EnumTest(Enum):
    T0 = 0
    T1 = 1

class EnumTest2(Enum):
    T0 = 0
    T1 = 1

class EnumUtilTest(unittest.TestCase):
    def test_to_enum(self):
        '''str, int, and Enum should be convertable '''
        r = Util.to_enum(1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('T1',EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum(EnumTest.T1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('1',EnumTest)
        self.assertEqual(r,EnumTest.T1)

    def test_to_enum_fail(self): 
        '''Return None if convert fails'''       
        self.assertIsNone(Util.to_enum( None,EnumTest ))
        self.assertIsNone(Util.to_enum( 'abd',EnumTest ))
        self.assertIsNone(Util.to_enum( 123,EnumTest ))
        self.assertIsNone(Util.to_enum( EnumTest2.T1,EnumTest ))

    def test_to_enum_default(self):
        '''test default param'''
        r = Util.to_enum(EnumTest2.T1,EnumTest,EnumTest.T0)
        self.assertEqual(r,EnumTest.T0)

if __name__ == '__main__':
    unittest.main()

Xây dựng một enum từ một từ điển trong Python #

Sử dụng API chức năng để xây dựng một enum từ từ điển, ví dụ: Sizes = Enum('Sizes', my_dict). Đối số đầu tiên chúng tôi chuyển đến lớp Enum là tên của bảng liệt kê và thứ hai - nguồn gốc của tên và giá trị thành viên liệt kê.

Copied!

from enum import Enum my_dict = { 'SMALL': 1, 'MEDIUM': 2, 'LARGE': 3 } Sizes = Enum('Sizes', my_dict) print(Sizes) # 👉️ print(Sizes.SMALL.name) # 👉️ SMALL print(Sizes.SMALL.value) # 👉️ 1

Chúng tôi đã sử dụng API chức năng để tạo enum.

Lớp Enum có thể gọi được và lấy tên của bảng liệt kê làm đối số đầu tiên và nguồn gốc của tên liệt kê là thứ hai.

Đối số thứ hai có thể là:

  • ánh xạ (ví dụ: từ điển)
  • một chuỗi các bộ dữ liệu với 2 phần tử (khóa và giá trị)
  • chuỗi tên được phân tách bằng khoảng trắng
  • một chuỗi tên

Enum Sizes mà chúng tôi đã tạo bằng API chức năng tương đương với enum sau.

Copied!

from enum import Enum class Sizes(Enum): SMALL = 1 MEDIUM = 2 LARGE = 3 print(Sizes.SMALL.name) # 👉️ SMALL print(Sizes.SMALL.value) # 👉️ 1

Nếu chúng ta chuyển từ điển cho API chức năng, chúng ta gán các giá trị của từ điển làm giá trị cho các khóa tương ứng.

Nếu chúng ta sử dụng một chuỗi tên được phân tách bằng khoảng trắng hoặc một chuỗi tên, các giá trị enum sẽ tự động được chỉ định các số nguyên tăng bắt đầu bằng

import unittest
from enum import Enum,unique
class EnumTest(Enum):
    T0 = 0
    T1 = 1

class EnumTest2(Enum):
    T0 = 0
    T1 = 1

class EnumUtilTest(unittest.TestCase):
    def test_to_enum(self):
        '''str, int, and Enum should be convertable '''
        r = Util.to_enum(1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('T1',EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum(EnumTest.T1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('1',EnumTest)
        self.assertEqual(r,EnumTest.T1)

    def test_to_enum_fail(self): 
        '''Return None if convert fails'''       
        self.assertIsNone(Util.to_enum( None,EnumTest ))
        self.assertIsNone(Util.to_enum( 'abd',EnumTest ))
        self.assertIsNone(Util.to_enum( 123,EnumTest ))
        self.assertIsNone(Util.to_enum( EnumTest2.T1,EnumTest ))

    def test_to_enum_default(self):
        '''test default param'''
        r = Util.to_enum(EnumTest2.T1,EnumTest,EnumTest.T0)
        self.assertEqual(r,EnumTest.T0)

if __name__ == '__main__':
    unittest.main()
0.

Copied!

from enum import Enum Sizes = Enum('Sizes', 'SMALL MEDIUM LARGE') print(Sizes) # 👉️ print(Sizes.SMALL.name) # 👉️ SMALL print(Sizes.SMALL.value) # 👉️ 1 print(Sizes.MEDIUM.name) # 👉️ MEDIUM print(Sizes.MEDIUM.value) # 👉️ 2

Mẫu mã tạo ra cùng một enum như trong các ví dụ trước.

Bạn có thể tùy chọn chuyển đối số

import unittest
from enum import Enum,unique
class EnumTest(Enum):
    T0 = 0
    T1 = 1

class EnumTest2(Enum):
    T0 = 0
    T1 = 1

class EnumUtilTest(unittest.TestCase):
    def test_to_enum(self):
        '''str, int, and Enum should be convertable '''
        r = Util.to_enum(1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('T1',EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum(EnumTest.T1,EnumTest)
        self.assertEqual(r,EnumTest.T1)
        r = Util.to_enum('1',EnumTest)
        self.assertEqual(r,EnumTest.T1)

    def test_to_enum_fail(self): 
        '''Return None if convert fails'''       
        self.assertIsNone(Util.to_enum( None,EnumTest ))
        self.assertIsNone(Util.to_enum( 'abd',EnumTest ))
        self.assertIsNone(Util.to_enum( 123,EnumTest ))
        self.assertIsNone(Util.to_enum( EnumTest2.T1,EnumTest ))

    def test_to_enum_default(self):
        '''test default param'''
        r = Util.to_enum(EnumTest2.T1,EnumTest,EnumTest.T0)
        self.assertEqual(r,EnumTest.T0)

if __name__ == '__main__':
    unittest.main()
1 cho API chức năng nếu bạn cần chỉ định một giá trị bắt đầu khác.

Copied!

from enum import Enum Sizes = Enum('Sizes', 'SMALL MEDIUM LARGE', start=10) print(Sizes) # 👉️ print(Sizes.SMALL.name) # 👉️ SMALL print(Sizes.SMALL.value) # 👉️ 10 print(Sizes.MEDIUM.name) # 👉️ MEDIUM print(Sizes.MEDIUM.value) # 👉️ 11

Một enum có thể là một con trăn từ điển?

Người dùng cũng có thể sử dụng Enums trong từ điển và bộ vì các thành viên của họ có thể băm..

Enum có thể là một con trăn Key Dict?

Các thành viên liệt kê có thể băm và điều đó có nghĩa là chúng tôi có thể sử dụng chúng làm khóa từ điển hợp lệ..

Enum có phải là từ điển không?

Từ điển lưu trữ các bộ sưu tập các giá trị không có thứ tự cùng loại, có thể được tham chiếu và tìm kiếm thông qua một định danh duy nhất (còn được gọi là khóa).Một liệt kê xác định một loại chung cho một nhóm các giá trị liên quan và cho phép bạn làm việc với các giá trị đó theo cách an toàn loại trong mã của bạn.An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code.

Ưu điểm của việc sử dụng Enum trong Python là gì?

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 quapypy.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.useful to represent data that represent a finite set of states 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.