나는 mypy로 파이톤의 Enum과 다른 유형의 갑작스러운 비교를 측정하고 싶다

7814 단어 Pythontech
예컨대
from enum import Enum

class Color(str, Enum):
    RED = "red"
    BLUE = "blue"
이런 게 있어도
if __name__ == "__main__":
    print(Color.RED == Color.BLUE)
    print(Color.RED == Color.RED)
    print(Color.RED == "red") # こういうのを型エラーで弾きたい
    print(Color.RED is "red") # こういうのも型エラーで弾きたい
그렇다면.마이피에 가입해도 아무 말 안 하지?
그래서
from enum import Enum
from typing import TypeVar

class Color(str, Enum):
    RED = "red"
    BLUE = "blue"

class Color2(str, Enum):
    RED = "red"
    BLUE = "blue"

T = TypeVar("T")

class Comparer(Generic[T]):
    def compare(self, a: T, b: T) -> bool:
        return a is b
    
if __name__ == "__main__":
    comparer = Comparer[Color]()
    print(comparer.compare(Color.RED, Color.BLUE))
    print(comparer.compare(Color.RED, Color.RED))
    print(comparer.compare(Color.RED, "red"))
    print(comparer.compare(Color.RED, Color2.RED2))
처럼 마지막 두 줄은 mypy에 따라 연주한다.
error: Argument 2 to "compare" of "Comparer" has incompatible type "str"; expected "Color"
error: Argument 2 to "compare" of "Comparer" has incompatible type "Color2"; expected "Color"
한순간에 __eq__ 다시 쓰면 좋을 것 같았는데 __eq__ 성격상 뭐든 받아들여야 하고 원래 앞에 있는 게 Object형이라서 이런 느낌으로 먼저 회피할 수밖에 없었어요.
그 다음
T = TypeVar("T", bound=Enum)
def compare(a: T, b: T) -> bool:
    return a is b
문을 닫아도 엔움에 들어갈 수 없을 때 검사가 가능하지만, 엔움의 반을 물려받아 들어가면 감지가 불가능하다고 느낀다.(상기 예를 들어'레드'의 혼입을 방지할 수 있지만 Color2는 방지할 수 없다)

좋은 웹페이지 즐겨찾기