source

Enum 특성에 대한 주석 유형

factcode 2023. 5. 14. 11:11
반응형

Enum 특성에 대한 주석 유형

다음 코드가 있습니다.

import enum


class Color(enum.Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'


def get_color_return_something(some_color):
    pass

유형 주석을 적절하게 추가하려면 어떻게 해야 합니까?some_colorColor enum(색상 enum)에서 enum 속성을 수신한다고 가정할 경우 이 함수의 variable(예:Color.RED)?

색상 클래스가 작동할 것임을 암시하는 입력:

def get_color_return_something(some_color: Color):
    print(some_color.value)

hint Literal 유형의 옵션을 사용할 수 있습니다.

공식 PEP8 문서를 통해 다음과 같은 사실을 알 수 있습니다.

리터럴 해당 변수 또는 함수 매개 변수의 값이 제공된 리터럴(또는 여러 리터럴 중 하나)과 동일함을 유형 검사기에 나타내기 위해 사용할 수 있는 유형입니다.

따라서 함수 인수에 특정 값을 사용해야 하는 경우 가장 좋은 옵션 중 하나가 됩니다.그러나 Enum 값의 유형 때문에 이 접근 방식이 예상대로 완전히 작동하지는 않을 것입니다.각 값에는 Enum 클래스 유형이 있습니다.이는 아래 코드 예제에 색상을 넣을 수 있음을 의미합니다.함수 인수로 GREEN을 지정합니다.따라서 이러한 솔루션은 개발자를 위한 정보일 뿐 함수 인수에 대한 필수 규칙은 아닙니다.

class Color(enum.Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'

print(type(Color.RED)  # will return <enum 'Color'>

코드 예:

from enum import Enum
from typing import Literal


class Color(Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'

def some_function(some_color: Literal[Color.RED, Color.BLUE]) -> None:
    pass

두 번째 옵션은 클래스 유형 힌트만 포함하여 위 게시물의 @ibarrond가 제공하는 완전히 올바른 솔루션입니다.

some_color: Color

따라서 필요에 따라 작업할 옵션을 선택할 수 있습니다.

제 관점에서 우리는 함수에 대한 요구 사항을 보다 명확하게 하기 위해 개발자에게 가능한 Enum 값을 지정하려고 시도할 수 있습니다.

def get_color_return_something(some_color: Color):
    pass

다음은 Pyton 3.9/PyCharm과 함께 작동합니다.

from enum import Enum
from typing import Optional, Union


class Color(Enum):
    RED: int = 1
    GREEN: int = 2


def guess_color(x: Union[Color.RED, Color.GREEN]) -> Optional[ValueError]:
    if x == Color.RED:
        print("Gotcha!")
    else:
        return ValueError(f"It's not {Color.RED}")


guess_color(Color.RED)

다른 이상한 구문 해결 방법은 견적의 순방향 참조 구문(PEP 484에 따라)을 사용하여 Enum 클래스 유형으로 Enum 멤버를 지정하는 것입니다.

from enum import Enum


class ETest(Enum):
    EXAMPLE: 'ETest' = "example"  <--- forward referenced type


def example() -> ETest:
    return ETest.EXAMPLE


print(type(ETest.EXAMPLE.value))

<class 'str'>

아래 이미지에서는 PyCharm에서 강조 표시된 경고가 더 이상 나타나지 않습니다.

Enum 클래스를 참조하는 type-hint

참고로, 다음은 PyCharm의 불만 사항에 대한 스크린샷입니다.EXAMPLE의 일원.<str>다음과 같이 입력합니다.

PyCharm pylint 경고 열거형

나는 팬이나 이런 접근법은 아니지만 경고를 없애줍니다.

언급URL : https://stackoverflow.com/questions/52624736/type-annotations-for-enum-attribute

반응형