반응형


+ 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)


실행결과
0
1
2


+ Recent posts