ฉันต้องการสิ่งที่คล้ายกันเพื่อที่ฉันจะสามารถเข้าถึงส่วนใดส่วนหนึ่งของคู่ค่าจากการอ้างอิงเดียว เวอร์ชั่นวานิลลา:
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))
ความล้มเหลวทำให้เกิดข้อยกเว้นตามที่คาดไว้
รุ่นที่แข็งแกร่งยิ่งขึ้น:
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]))
เมื่อใช้ไม่ถูกต้องสิ่งนี้จะหลีกเลี่ยงการสร้างข้อยกเว้นและส่งกลับข้อบ่งชี้ข้อผิดพลาดแทน วิธีอื่นของ Pythonic ในการทำเช่นนี้คือการส่งกลับ "ไม่มี" แต่แอปพลิเคชันเฉพาะของฉันใช้ข้อความโดยตรง