2016-08-04 3 views
5

열거 형에 '없음'이라는 값을 추가 할 수 있습니까? 예를 이 질문이 내 앞의 질문 물론 How to set a variable's subproperty?열거 형에 '없음'이라는 값을 추가 할 수 있습니까?

관련이

from enum import Enum 
class Color(Enum): 
    None=0 #represent no color at all 
    red = 1 
    green = 2 
    blue = 3 

color=Color.None 

if (color==Color.None): 
    #don't fill the rect 
else: 
    #fill the rect with the color 

에 대한 , 나는 enum 위의 None이 작동하지 않습니다 이해합니다. 하지만 공급 업체의 코드에서,이 같은 것을 볼 수 있습니까 : bird.eye.Color=bird.eye.Color.enum.None 는 나는 그렇게 flufl.enum가 사용되는 <class 'flufl.enum._enum.IntEnumValue'>type(bird.eye.Color) 를 확인했습니다. flufl.enum 또는 Enum을 사용하는 것이 매우 다르지 않아야한다고 생각합니다. 감사합니다.

+0

위의 코드를 시도했을 때 어떤 현상이 발생 했습니까? 오류 메시지가 나타 났습니까? –

+2

키워드에 지정할 수 없습니다. 'None = *'는'SyntaxError'를 던지 겠지만'none = *'을 사용할 수 있습니다. – Pythonista

+0

@Pythonista는 None 대 None입니다. – sawreals

답변

1

당신은 Enum 생성자를 사용하는 대신 하위 클래스를 만들어이 작업을 수행 할 수 있습니다

>>> from enum import Enum 
>>> 
>>> Color = Enum('Color', {'None': 0, 'Red': 1, 'Green': 2, 'Blue': 3}) 
>>> Color.None 
<Color.None: 0 

편집 : 이것은 파이썬 3에서 파이썬 2의 enum34 백 포트를 사용하여 작동합니다, 당신은 함께 Enum을 만들 수 있습니다 None 속성이지만 점 표기법을 사용하여 액세스 할 수는 없습니다. 이 None에 할당 할 구문 오류가 있기 때문에

>>> Color.None 
SyntaxError: invalid syntax 

이상하게도, 당신은 여전히 ​​당신은 직접이 작업을 수행 할 수 없습니다 getattr

>>> getattr(Color, 'None') 
<Color.None: 0> 
+0

이것은 '없음'이름으로 더 용서했기 때문에 파이썬 2에서만 가능합니다 ('keyword.kwlist'에는 없습니다). python3에서 깨졌습니다. – wim

+0

@wim 예, 저는 enum34 백 포트를 사용했습니다. Python3에서는'None'을 사용하여 Enum을 생성 할 수 있기 때문에 조금 이상하지만,'Color.None'을 사용하여 열거하려고하면 오류가납니다. 그래도'getattr (Color, 'None')'을 할 수 있습니다. –

+0

정말 이상하지 않습니다 - 비슷한 동작이 파이썬 2에서도 존재합니다. 예를 들어'setattr (my_obj, 'import', 123)'을 할 수 있습니다. 하지만 일반적인 속성 액세스로 얻을 수없는 속성을 설정하려는 이유는 무엇입니까? 이렇게하면 단점이 있습니다. – wim

-2

그렇진 방법은 시도,하지만 당신은이 작업을 수행 할 수 있습니다

# After defining the class Color as normal, but excluding the part for None... 
setattr(Color, 'None', 0) 

color = Color.None 
if color == Color.None: 
    ... 

참고 : 당신은 지정하지 않았기 때문에 파이썬이이 원하는 또는 3 경우 확실하지 파이썬 2에 이런 짓을 , 그리고이 머신에 Python 3을 설치하지 않아도 테스트 할 수 있습니다.

+2

할 수 있지만 할 수는 없습니다. – SuperSaiyan

+1

정교하게하기 위해 Enum 클래스가 수행하는 메타 클래스 매직을 회피합니다. 따라서 열거 형의 적절한 구성원이 아닙니다.그건 불행한 부작용이 많습니다. 예를 들어'list (Color)'에 나타나지 않고 콜리 전 방지 나 앨리어싱이 불가능합니다. – wim

+0

@wim - 파이썬 3의 표준 모듈입니까? 나는 OP가'pip'를 사용하여'enum'이라는 이름의 것을 설치했다고 생각했습니다. 어쨌든, 나는 모든 마법 작업을 할 수있는 방법이 있다고 확신합니다. – ArtOfWarfare

1

에 액세스 할 수 있습니다.

Enum이 클래스를 준비하는 데 사용하는 메타 클래스 논리를 방해하므로 enum 클래스의 특성을 동적으로 설정하면 안됩니다.

파이썬의 None 싱글 톤과 이름 충돌을 피하려면 소문자 이름 none 만 사용해야합니다. 설명 된 유스 케이스의 경우이 접근법에는 단점이 없습니다.

+0

Brendan Abel의 대답은 아마도 내 것과 같은 부작용없이 작동 할 것 같습니다. – ArtOfWarfare

+0

아니요. 부작용은 python3에서 작동하지 않는다는 것입니다. – wim

관련 문제