나는 mypy로 파이톤의 Enum과 다른 유형의 갑작스러운 비교를 측정하고 싶다
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는 방지할 수 없다)
Reference
이 문제에 관하여(나는 mypy로 파이톤의 Enum과 다른 유형의 갑작스러운 비교를 측정하고 싶다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/marufeuille/articles/9c941d4cf6de80텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)