어떻게 최고의 에뮬레이션 및/또는 피 enum 의에서는 파이썬?[중복]
문제
이 질문은 이미 있는 대답을 여기:
내가 사용했던 작은 클래스를 겨루에서 열거형을 일부 프로젝트 파이썬.더 좋은 방법이 있거나는 이들에게 대부분의 감각한 상황?
클래스 코드는 여기:
class Enum(object):
'''Simple Enum Class
Example Usage:
>>> codes = Enum('FOO BAR BAZ') # codes.BAZ will be 2 and so on ...'''
def __init__(self, names):
for number, name in enumerate(names.split()):
setattr(self, name, number)
해결책
의 많은 좋은 토론 기.
다른 팁
열거되었다 제안에 포함시키기 위해 언어가기 전에,그러나 거부되었다(참조 http://www.python.org/dev/peps/pep-0354/),가 있지만 기존의 패키지를 사용할 수 있습 쓰는 대신에 자신의 구현:
- enum: http://pypi.python.org/pypi/enum
- SymbolType(완전히 동일하지 않습니다 왜냐하면,하지만 여전히 유용합): http://pypi.python.org/pypi/SymbolType
- 다시 검색
가장 일반적인 경우 열거는 열거된 값의 일부 상태나 전략을 디자인 패턴입니다.에 열거형은 특정국 또는 특정 선택적 전략을 사용할 수 있습니다.이 경우에,그들은 거의 항상 부분의 일부는 클래스 정의
class DoTheNeedful( object ):
ONE_CHOICE = 1
ANOTHER_CHOICE = 2
YET_ANOTHER = 99
def __init__( self, aSelection ):
assert aSelection in ( self.ONE_CHOICE, self.ANOTHER_CHOICE, self.YET_ANOTHER )
self.selection= aSelection
그런 다음에 클라이언트의 이 클래스입니다.
dtn = DoTheNeeful( DoTheNeeful.ONE_CHOICE )
무엇을 보고 더 자주 이것은,최상위 모듈 context:
FOO_BAR = 'FOO_BAR'
FOO_BAZ = 'FOO_BAZ'
FOO_QUX = 'FOO_QUX'
...그리고 나중에...
if something is FOO_BAR: pass # do something here
elif something is FOO_BAZ: pass # do something else
elif something is FOO_QUX: pass # do something else
else: raise Exception('Invalid value for something')
주의 사용 is
보 ==
은 위험을 여기에서-그것은에서는 사람들이 사용하는 your_module.FOO_BAR
가 아닌 문자열 'FOO_BAR'
(는 것입니다 일반적으로 수감되는 is
일치합니다,그러나 확실히 될 수 없습니에 계산),그리고 그렇게 적절하지 않을 수 있습 상황에 따라.
의 장점 중 하나 그것은 이 방법으로 보면 어디서든 대한 참조는 문자열이 저장되는,그것은 즉시 그것이 어디에서 왔; FOO_BAZ
다 훨씬 적은 모호한다 2
.
그 외에,다른 것은 나쁘다 내 Pythonic 감각을 다시 클래스는 당신이 제안의 사용 split()
.왜 그냥 통과하는 tuple,목록 또는 기타 열거을 시작으로?
내장 방식을 사용하여 열거입니다:
(FOO, BAR, BAZ) = range(3)
진을 위해 작은,하지만 몇 가지 단점이 있다:
- 필요할 수를 계산하는 요소에 의해 손으로
- 할 수 없습니다 건너뛰기 값
- 를 추가하는 경우 하나의 이름을,당신은 또한 업데이트할 필요가 범위의 번호
에 대한 완전한 enum 구현 라이브러리는 모두 지원되며,참조하십시오:http://code.activestate.com/recipes/67107/
기 시작했으로 보이는 것 같은 로트의 대답 하지만 나는 과부'str'과'eq'(신의 전체 개체 클래스)그래서 나는 인쇄할 수 있었고 비교 enum 의 값입니다.
class enumSeason():
Spring = 0
Summer = 1
Fall = 2
Winter = 3
def __init__(self, Type):
self.value = Type
def __str__(self):
if self.value == enumSeason.Spring:
return 'Spring'
if self.value == enumSeason.Summer:
return 'Summer'
if self.value == enumSeason.Fall:
return 'Fall'
if self.value == enumSeason.Winter:
return 'Winter'
def __eq__(self,y):
return self.value==y.value
인쇄(x)얻을 것입니다 당신의 가치와 두 값을 들고 봄이 될 것 같습니다.
>>> x = enumSeason(enumSeason.Spring)
>>> print(x)
Spring
>>> y = enumSeason(enumSeason.Spring)
>>> x == y
True