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)를 통해 윈도우 화면 미러링 방법

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

안드로이드(android) 전체 화면 시계 앱(clock app) 예제 코드

mkfs.fat Device or resource busy 에러 해결법