열거형은 레이블 또는 상수 컬렉션으로 간주할 수 있으며 일반적으로 요일, 월, 상태 등과 같은 특정하고 제한된 컬렉션을 나타내는 데 사용됩니다. Python의 기본 유형(내장 유형)에는 특별한 열거 유형이 없지만 사전, 클래스 등 다양한 방법을 통해 구현할 수 있습니다.
WEEKDAY = { 'MON': 1, 'TUS': 2, 'WEN': 3, 'THU': 4, 'FRI': 5 } class Color: RED = 0 GREEN = 1 BLUE = 2
위 두 가지를 볼 수 있습니다. 이러한 열거형 변수가 로컬 범위에서만 사용되는 경우에는 문제가 없지만 모두 변경 가능하므로 다른 곳에서 수정될 수 있다는 문제가 있습니다. 사용:
WEEKDAY['MON'] = WEEKDAY['FRI']print(WEEKDAY) {'FRI': 5, 'TUS':
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}
클래스에 의해 정의된 열거형은 인스턴스화될 수도 있고 설명이 아닌 상태가 될 수도 있습니다.
c = Color() print(c.RED) Color.RED = 2 print(c.RED)
0 2
물론 변수 유형도 사용할 수 있습니다. (불변), 예를 들어 열거형 유형의 원래 의미를 잃고 레이블을 의미 없는 변수로 저하시킵니다.
COLOR = ('R', 'G', 'B') print(COLOR[0], COLOR[1], COLOR[2])
R G B
더 나은 솔루션을 제공하기 위해 Python은 열거형 표준 라이브러리를 추가했습니다. 버전 3.4부터 PEP 435까지. 3.4 이전 버전에서는 pip install enum을 통해 호환되고 지원되는 라이브러리를 다운로드할 수도 있습니다. enum은 Enum/IntEnum/unique라는 세 가지 도구를 제공하며 사용법은 매우 간단합니다. Enum/IntEnum을 상속하여 열거형 유형을 정의할 수 있습니다. 여기서 IntEnum은 열거형 멤버를 정수 유형으로 제한하거나 고유 유형으로 변환할 수 있습니다. 데코레이터는 열거형 멤버의 값을 반복 불가능하도록 제한합니다.
from enum import Enum, IntEnum, uniquetry: @unique class WEEKDAY(Enum): MON = 1 TUS = 2 WEN = 3 THU = 4 FRI = 1except ValueError as e: print(e)
duplicate values found in <enum 'WEEKDAY'>: FRI -> MON
try: class Color(IntEnum): RED = 0 GREEN = 1 BLUE = 'b'except ValueError as e: print(e)
invalid literal for int() with base 10: 'b'
더 흥미로운 점은 Enum의 멤버가 모두 변경:
class Color(Enum): R = 0 G = 1 B = 2
try: Color.R = 2except AttributeError as e: print(e)
Cannot reassign members.
인스턴스화할 수는 없지만 열거형 멤버를 변수에 할당할 수 있습니다:
red = Color(0) green = Color(1) blue = Color(2) print(red, green, blue)
Color.R Color.G Color.B
비교 판단도 할 수 있습니다:
print(red is Color.R) print(red == Color.R) print(red is blue) print(green != Color.B) print(red == 0) # 不等于任何非本枚举类的值
True True False True False
마지막으로 열거형 멤버 자체도 열거형이므로 다른 멤버도 열거형 멤버를 통해 찾을 수 있습니다.
print(red.B) print(red.B.G.R)
Color.B Color.R
그러나 이 기능은 멤버의 원래 네임스페이스 이름과 충돌할 수 있으므로 주의해서 사용해야 합니다.
print(red.name, ':', red.value) class Attr(Enum): name = 'NAME' value = 'VALUE' print(Attr.name.value, Attr.value.name)
R : 0 NAME value
요약
사용법 enum 모듈의 구조는 매우 간단하고 그 기능도 매우 간단하지만 구현 방법은 배울 가치가 있습니다. Python의 클래스 및 메타클래스의 마법에 대해 더 배우고 싶지만 시작하는 방법을 모른다면 enum의 소스 코드를 읽거나 다음 몇 가지 기사의 내용에 주의를 기울이는 것이 좋습니다. !