単一の参照から値のペアのいずれかの部分にアクセスできるように、同様の何かが必要でした。バニラバージョン:
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な方法は、「なし」を返すことですが、私の特定のアプリケーションはテキストを直接使用します。