파이썬, Enum 유형은 무엇에 유용합니까?
3인 Python 3.4에서 .에서는 표준 라이브러리에 Enum lib가 있습니다.enum우리는 백포트를 구할 수 있습니다.enumPython 2.4 ~ 2.7(및 3.1 ~ 3.3), enum34 in pypi에서 작동합니다.
하지만 우리는 이 새로운 모듈 없이도 꽤 오랫동안 잘 지낼 수 있었습니다. 그런데 왜 이제 우리는 그것을 가지고 있는 것일까요?
저는 다른 언어의 열거의 목적에 대해 대략적인 생각이 있습니다.Python에서는 다음과 같이 베어 클래스를 사용하는 것이 일반적이며 이를 열거형이라고 합니다.
class Colors:
blue = 1
green = 2
red = 3
이것은 API에서 값의 표준 표현을 만드는 데 사용될 수 있습니다. 예를 들어 다음과 같습니다.
function_of_color(Colors.green)
어떤 이고, 수 알 수 있을까요, 만이어쉽고있면그당, 그이없적고수반복할다, 있은을어것정수알의까니습를미의, 수게떻게그우리는고리신약변것가것판에?2?
그렇다면 이름이 붙은 튜플 같은 것을 사용할 수 있을 것 같은데, 그것은 불변의 것일까요?
>>> Colors = namedtuple('Colors', 'blue green red')
>>> colors = Colors('blue', 'green', 'red')
>>> colors
Colors(blue='blue', green='green', red='red')
>>> list(colors)
['blue', 'green', 'red']
>>> len(colors)
3
>>> colors.blue
'blue'
>>> colors.index(colors.blue)
0
이름이 붙은 튜플을 만드는 것은 약간 중복적이고(각 이름을 두 번씩 써야 함), 다소 우아하지 않습니다.색상의 "번호"를 얻는 것도 약간 우아하지 않습니다(우리는 써야 합니다).colors문자열로 약간 .값 검사는 문자열로 수행해야 하므로 효율성이 약간 떨어집니다.
그럼 다시 열거해 보겠습니다.
열거의 목적은 무엇입니까?그들은 언어에 어떤 가치를 창출합니까?언제 사용해야 하고 언제 피해야 합니까?
열거의 목적은 무엇입니까?그들은 언어에 어떤 가치를 창출합니까?언제 사용해야 하고 언제 피해야 합니까?
Enum 유형은 PEP 435를 통해 Python에 들어갔습니다.그 이유는 다음과 같습니다.
열거형 속성은 의미적 의미를 가질 수도 있고 가지지 않을 수도 있는 불변의 관련 상수 값 집합을 정의하는 데 유용합니다.
이러한 목적으로 숫자와 문자열을 사용하는 경우 "마법의 숫자" 또는 "마법의 문자열"로 특성화할 수 있습니다.숫자는 의미론을 거의 수반하지 않으며 문자열은 쉽게 혼동됩니다(대문자? 철자? 뱀 또는 낙타 대소문자?).
요일과 학교 편지 성적은 이런 종류의 가치 모음의 예입니다.
다음은 문서의 예입니다.
from enum import Enum
class Color(Enum):
red = 1
green = 2
blue = 3
맨 클래스와 마찬가지로, 이것은 명명된 튜플 예제보다 훨씬 더 읽기 쉽고 우아하며, 또한 불변이며, 아래에서 볼 수 있듯이 추가적인 이점이 있습니다.
절대적으로 우세함:열거형 멤버의 유형은 열거형입니다.
>>> type(Color.red)
<enum 'Color'>
>>> isinstance(Color.green, Color)
True
그러면 Enum 정의의 멤버에 대한 기능을 정의할 수 있습니다.값에 대한 기능 정의는 다른 이전 방법으로 수행할 수 있지만 매우 부적절합니다.
개선: 문자열 강제
문자열 표현은 사람이 읽을 수 있는 반면, repr은 더 많은 정보를 가지고 있습니다.
>>> print(Color.red)
Color.red
>>> print(repr(Color.red))
<Color.red: 1>
저는 이것이 마법의 숫자보다 향상되었고 심지어 이름이 붙은 튜플의 문자열보다 더 나을 수도 있다는 것을 발견했습니다.
반복(패리티):
열거형은 지정된 튜플과 마찬가지로 반복을 지원하지만 베어 클래스는 지원하지 않습니다.
>>> for color in Color:
print(color)
Color.red
Color.green
Color.blue
그__members__개체에 대로 매핑하는 이 지정된의 속각이개대이순체매서다니핑름입의열한함유에거형이사름과튜성지의된플정름이열은거형이▁named▁to▁attribute▁is▁(▁of▁ansimilart유함(다▁mapping사)._asdict()함수)를 선택합니다.
>>> Color.__members__
mappingproxy(OrderedDict([('red', <Color.red: 1>), ('green', <Color.green: 2>),
('blue', <Color.blue: 3>)]))
피클(패리티)에 의해 지원됨
열거형을 직렬화 및 역직렬화할 수 있습니다(누군가 이에 대해 걱정한 경우).
>>> import pickle
>>> color.red is pickle.loads(pickle.dumps(color.red))
True
개선:별칭
이것은 맨 클래스에는 없는 멋진 기능이며, 가명이 그곳에 있었는지 말하기는 어려울 것입니다.namedtuple.
class Color(Enum):
red = 1
green = 2
blue = 3
really_blue = 3
별칭은 표준 이름 뒤에 오지만 둘 다 동일합니다.
>>> Color.blue is Color.really_blue
True
충돌을 에는 값충을방위별경하금우를 합니다.enum.unique장식가(엄격히 지배적인 특징)
: 과의비교와 함.is
은 열형은다사테스다니됩트여용하로 입니다.is이는 프로세스에서 단일 개체의 신원을 신속하게 확인하는 것입니다.
>>> Color.red is Color.red
True
>>> Color.red is Color.blue
False
>>> Color.red is not Color.blue
True
동일성에 대한 검정도 작동하지만 동일성에 대한 검정은is최적입니다.
다른 Python 클래스와 다른 의미론
Enum 클래스는 일반 Python 유형과 다른 의미를 가집니다.Enum의 값은 Enum의 인스턴스이며, 해당 값에 대한 메모리의 싱글톤입니다. 인스턴스화를 위한 다른 목적은 없습니다.
>>> Color.red is Color(1)
이것은 명심해야 할 중요한 것입니다, 아마도 그것은 단점일 것입니다, 하지만 이 차원을 비교하는 것은 사과와 오렌지를 비교하는 것입니다.
순서가 지정된 것으로 가정되지 않는 열거형
Enum 클래스는 구성원이 작성된 순서를 알고 있지만 열거형은 순서가 지정된 것으로 가정되지 않습니다.이것은 열거될 수 있는 많은 것들이 자연적인 순서를 가지고 있지 않기 때문에 임의적인 순서가 되기 때문에 특징입니다.
그러나 열거형을 순서대로 지정할 수 있습니다(다음 섹션 참조).
하위 분류
멤버가 선언된 Enum은 하위 분류할 수 없지만 멤버가 동작을 공유한다고 선언하지 않는 Enum은 하위 분류할 수 있습니다(문서의 OrderedEnum 레시피 참조).
이것은 기능입니다. 구성원과 함께 Enum을 하위 분류하는 것은 거의 의미가 없지만, 다시 말하지만, 비교는 사과와 오렌지입니다.
언제 사용해야 합니까?enum.Enum?
이것은 Python의 새로운 표준 열거입니다.공동작업자는 사용자의 열거형이 이러한 열거형처럼 작동할 것으로 예상합니다.
임의 데이터 대신 정규 이름을 사용하도록 명시적으로 지정하려는 코드에 열거된 데이터의 정규 원본이 있는 곳이라면 어디든 사용하십시오.
예를 들어, 코드에서 사용자가 그렇지 않다고 말하기를 원하는 경우"Green","green"2, 또는"Greene",그렇지만Color.green열거형을 사용합니다.열거형 개체입니다.명확하고 구체적입니다.
설명서에는 많은 예시와 조리법이 있습니다.
언제 피해야 하나요?
자신의 것을 굴리거나 사람들이 마법의 숫자와 줄에 대해 추측하게 하는 것을 멈추세요.그들을 피하지 마세요.그들을 안아주세요.
그러나 과거의 이유로 열거형 구성원이 정수여야 하는 경우에는 다음이 있습니다.IntEnum동일한 모듈에서, 동작이 동일하지만 내장된 모듈을 하위 분류하기 때문에 정수이기도 합니다.int하위 분류 전에Enum.부터IntEnum의 도움말:
class IntEnum(builtins.int, Enum)
우리는 IntEnum 값이 다음의 인스턴스로 테스트된다는 것을 알 수 있습니다.int.
언급URL : https://stackoverflow.com/questions/37601644/python-whats-the-enum-type-good-for
'programing' 카테고리의 다른 글
| MySQL, SQL 오류(1305) 프로시저가 존재하지 않습니다. (0) | 2023.08.28 |
|---|---|
| dotnet mvc 응용 프로그램의 Oracle 데이터베이스에 연결 (0) | 2023.08.28 |
| 데이터베이스 커서가 기본 데이터에 대한 변경 사항을 픽업합니까? (0) | 2023.08.28 |
| Mysql 목록 표 및 크기 - 크기순 정렬 (0) | 2023.08.28 |
| VBA에서 ADODB 레코드 세트 전체 복사 또는 복제 (0) | 2023.08.09 |