Tôi muốn một cái gì đó tương tự để tôi có thể truy cập một trong hai phần của cặp giá trị từ một tham chiếu duy nhất. Phiên bản vani:
from enum import IntEnum
class EnumDemo(IntEnum):
ENUM_ZERO = 0
ENUM_ONE = 1
ENUM_TWO = 2
ENUM_THREE = 3
ENUM_INVALID = 4
print('Passes')
print('1) %d'%(EnumDemo['ENUM_TWO']))
print('2) %s'%(EnumDemo['ENUM_TWO']))
print('3) %s'%(EnumDemo.ENUM_TWO.name))
print('4) %d'%(EnumDemo.ENUM_TWO))
print()
print('Fails')
print('1) %d'%(EnumDemo.ENUM_TWOa))
Sự thất bại ném ra một ngoại lệ như mong đợi.
Một phiên bản mạnh mẽ hơn:
class EnumDemo():
enumeration = (
'ENUM_ZERO',
'ENUM_ONE',
'ENUM_TWO',
'ENUM_THREE',
'ENUM_INVALID'
)
def name(self, val):
try:
name = self.enumeration[val]
except IndexError:
name = self.enumeration[len(self.enumeration) - 1]
return name
def number(self, val):
try:
index = self.enumeration.index(val)
except (TypeError, ValueError):
index = (len(self.enumeration) - 1)
return index
print('Passes')
print('1) %d'%(EnumDemo().number('ENUM_TWO')))
print('2) %s'%(EnumDemo().number('ENUM_TWO')))
print('3) %s'%(EnumDemo().name(1)))
print('4) %s'%(EnumDemo().enumeration[1]))
print()
print('Fails')
print('1) %d'%(EnumDemo().number('ENUM_THREEa')))
print('2) %s'%(EnumDemo().number('ENUM_THREEa')))
print('3) %s'%(EnumDemo().name(11)))
print('4) %s'%(EnumDemo().enumeration[-1]))
Khi không được sử dụng đúng cách, điều này sẽ tránh tạo ra một ngoại lệ và thay vào đó, trả lại một chỉ báo lỗi. Một cách Pythonic khác để làm điều này là trả lại "Không có" nhưng ứng dụng cụ thể của tôi sử dụng trực tiếp văn bản.