[Python] enum
+ Python에서 Enum 사용하기
C나 C++에서 편하게 쓰던 enum이 python에서는 기본으로 없고 쓰기가 좀 불편합니다.
열거형(enum)은 상수와 같이 지정된 값을 이름을 부여하여 코드내에 가독성이 좋게 사용하기 위해 씁니다.
C로 예를 들면 상수타입을 그대로 쓸수도 있지만, 아래와 같이 불편합니다.
const int APPLE=1
const int BANANA=2
const int GRAPE=3
각각 값을 지정해 줘서 써도 되지만 번거롭습니다. 그래서 enum을 쓰죠.
enum Fruit {
APPLE=0,BANANA, GRAPE } ;
각 항마다 =1, =2 이렇게 값을 지정할수도 있고, 생략하면 순차적으로 이전 항보다 1씩 증가합니다.
#include <stdio.h>
enum _fruit {
APPLE=0,
BANANA, GRAPE
};
int main()
{
enum _fruit a,b ;
a=APPLE ;
b=BANANA;
printf("a=%d\n", a) ;
printf("b=%d\n", b) ;
return 0 ;
}
C에서 보통은 좀 더 쓰기 편하기 typedef로 정의해서 사용하죠.
typedef enum _fruit {
APPLE=0,
BANANA, GRAPE
} FRUIT;
int main()
{
FRUIT a,b ;
a=APPLE ;
b=BANANA;
printf("a=%d\n", a) ;
printf("b=%d\n", b) ;
return 0 ;
}
파이썬에서는 enum을 아래와 같이 쓴다. 별도로 모듈을 임포트해줘야 한다.
import enum
class Fruit(enum.Enum):
APPLE=0
BANANA=1
GRAPE=2
print(Fruit.APPLE)
print(Fruit.BANANA.value)
print(Fruit.GRAPE.value)
실행결과
Fruit.APPLE
1
2
값을 가져오려면 별도로 .value 프로퍼티를 써야 한다.
enum 변수값을 모두 각각 지정해 주어야 한다. 불편하다.
모듈 임포트 할 필요없이 별도로 함수를 만들어 enum을 쓰는 것이 편하다. 인덱스는 0부터 시작.
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
Fruit = enum('APPLE','BANANA','GRAPE')
print(Fruit.APPLE)
print(Fruit.BANANA)
print(Fruit.GRAPE)