python enum example과 c enum 비교

 python에서 enum을 사용하는 방법과 c에서의 enum을 비교해 보았다.


c enum 선언

c 언어에서는 보통 아래와 같이 enum을 사용한다. 정수의 값을 가진 고유한 상수를 열거하여 사용한다. 

typedef enum
{
fruit_watermelon = 0,
fruit_apple,
fruit_peach,
fruit_melon,
fruit_banana,
fruit_grape,
fruit_strawberry,
fruit_max,
}fruit_e;


python enum 선언

python에서는 enum 모듈의 Enum을 사용하여 열거형 변수를 선언할 수 있다.

import enum
class fruit(enum.Enum):
    watermelon = 1
    apple = 2
    peach = 3
    melon = 4
    banana = 5
    grape = 6
    strawberry = 7

list(fruit)
[<fruit.watermelon: 1>, <fruit.apple: 2>, <fruit.peach: 3>, <fruit.melon: 4>, <fruit.banana: 5>, <fruit.grape: 6>, <fruit.strawberry: 7>]


enum.auto()를 사용면 자동으로 상수의 값을 할당할 수 있다.

class fruit_auto(enum.Enum):
    watermelon = enum.auto()
    apple = enum.auto()
    peach = enum.auto()
    melon = enum.auto()
    banana = enum.auto()
    grape = enum.auto()
    strawberry = enum.auto()

list(fruit_auto)
[<fruit_auto.watermelon: 1>, <fruit_auto.apple: 2>, <fruit_auto.peach: 3>, <fruit_auto.melon: 4>, <fruit_auto.banana: 5>, <fruit_auto.grape: 6>, <fruit_auto.strawberry: 7>]


pythone에서는 상수의 값을 문자열로도 할당할 수 있다.

class fruit_str(enum.Enum):
    watermelon = 'watermelon'
    apple = 'apple'
    peach = 'peach'
    melon = 'melon'
    banana = 'banana'
    grape = 'grape'
    strawberry = 'strawberry'

list(fruit_str)
[<fruit_str.watermelon: 'watermelon'>, <fruit_str.apple: 'apple'>, <fruit_str.peach: 'peach'>, <fruit_str.melon: 'melon'>, <fruit_str.banana: 'banana'>, <fruit_str.grape: 'grape'>, <fruit_str.strawberry: 'strawberry'>]


enum.Flag를 사용하여 선언하면 enum 상수의 값들이 비트 연산에 적합한 값으로 할당된다.

class fruit_flag(enum.Flag):
    watermelon = enum.auto()
    apple = enum.auto()
    peach = enum.auto()
    melon = enum.auto()
    banana = enum.auto()
    grape = enum.auto()
    strawberry = enum.auto()

list(fruit_flag)
[<fruit_flag.watermelon: 1>, <fruit_flag.apple: 2>, <fruit_flag.peach: 4>, <fruit_flag.melon: 8>, <fruit_flag.banana: 16>, <fruit_flag.grape: 32>, <fruit_flag.strawberry: 64>]


python enum 사용

enum class는 일반 class와 달리 별도의 변수 선언 없이 아래 예제 코드 처럼 바로 사용할 수 있다.

    price_tag = {}
    price_tag[fruit.watermelon] = 10000
    price_tag[fruit.apple] = 1000
    price_tag[fruit.peach] = 1500
    price_tag[fruit.melon] = 8000
    price_tag[fruit.banana] = 2000
    price_tag[fruit.grape] = 5000
    price_tag[fruit.strawberry] = 3000
    print(price_tag)

{<fruit.watermelon: 1>: 10000, <fruit.apple: 2>: 1000, <fruit.peach: 3>: 1500, <fruit.melon: 4>: 8000, <fruit.banana: 5>: 2000, <fruit.grape: 6>: 5000, <fruit.strawberry: 7>: 3000}

댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

base64 인코딩 디코딩 예제 c 소스

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제