은 python3에서 이것은 단지python2에서 정의 순서를 사용할 수없는 이유는 무엇입니까?
>>> from enum import Enum
>>> class Animal(Enum):
... cat = [0]
... dog = {1}
작동하지만 메타 클래스 기지 값에 분류 호출하려고 할 때 처리되지 않은 예외가 있기 때문에 파이썬 v2.7.6에 그것은 TypeError
를 발생시킵니다.
우리는이 같은 문제를 해결할 수 있습니다
>>> class Animal(Enum):
... __order__ = 'cat dog'
... cat = [0]
... dog = {1}
내 질문을 왜 정의 순서가 python2에서 사용할 수 없습니다? 나는 그것이 왜 python2 버전이 작동하지 않는지 추측하고 있는데, 내가 틀렸다면 나를 바로 잡는다.
우리는이 같은 열거를 한 경우 : 안전하고 잘 정의 된
>>> class Animal(Enum):
... cat = {0, 1}
... dog = {1, 2}
... fish = {2, 0}
순서가됩니까? 아니면 dict
또는 set
반복처럼 신뢰할 수 없습니까?
편집 : 메타 클래스는 __prepare__
후크와와 대안 공간 구현을 지정할 수 preparing the class namespace : 역 추적
In [1]: from enum import Enum
In [2]: class Animal(Enum):
dog = [0]
cat = {1}
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-d14b1041d5bc> in <module>()
----> 1 class Animal(Enum):
2 dog = [0]
3 cat = {1}
4
/usr/local/lib/python2.7/dist-packages/enum/__init__.pyc in __new__(metacls, cls, bases, classdict)
164 if __order__ is None:
165 if pyver < 3.0:
--> 166 __order__ = [name for (name, value) in sorted(members.items(), key=lambda item: item[1])]
167 else:
168 __order__ = classdict._member_names
TypeError: Error when calling the metaclass bases
can only compare to a set
파이썬 2에서 사용하는'enum' 구현은 무엇입니까? ['enum34' 백 포트 패키지 (https://pypi.python.org/pypi/enum34/)는 첫 번째 예제에서'TypeError'를 발생시키지 않습니다. 여기에 뭔가 빠졌습니까? –
정확하게 pip freeze에 따라 enum34 백 포트, 버전'enum34 == 1.0 '입니다. 그리고 네, 파이썬 2.7.6에서 예외를 발생시키고 있습니다, 당신이 말하는 것이 아닙니다! – wim
아마도 다른 구현 인 Martijn을 사용하고 있습니다. – wim