미해결
타입 파이썬! 올바른 class 사용법과 객체지향 프로그래밍
pyright 를 이용한 클래스 재정의 코드 실행 문제점 질문 드립니다.
안녕하세요.
강사님.
먼저 재미있고 흡입력있게 파이썬 타입 강의를 진행해주신 것 같아 감사의 말씀 드립니다. ^^
제네릭 강의를 실습하다가 발견한 부분이 있어 질문을 드리고자 합니다.
class Robot(Generic[ARM, HEAD]):
class Siri(Generic[ARM, HEAD], Robot[ARM, HEAD]):
pass
위와 같이 2개의 클래스 정의를 하여
mypy 를 이용하여 python 실행을 하는 경우와 python 실행만 하는 경우는 정상적으로 코드 실행이 되지만
pyright 의 경우에는 아래처럼 MRO 관련한 오류 메시지가 출력이 되며 실행이 되지 않는 것을 확인 하였습니다.
error: Cannot create consistent method ordering
아래와 같이 실행을 하게 되면 정상적으로 pyright 도 실행이 되는 것을 확인 하였습니다.
class Siri(Robot[ARM, HEAD]):
pass
pyright 를 사용하게 되면 자식클래스에 상속받는 부모클래스에서 처럼 명시적으로 생성자 타입을 정의를 하지 않아야 되는 PEP 가 존재하여 이를 준수하여 그리 되는 것인지 궁금합니다.
아래 문서등에서는 따로 명시적으로 관련 설명이 된 부분은 아직까진 찾지는 못하였습니다..
https://github.com/microsoft/pyright
https://www.python.org/dev/peps/pep-0544/
https://github.com/microsoft/pyright/blob/main/docs/type-concepts.md
실행환경은 아래와 같습니다.
pyright 1.1.215
python 3.9.1
mypy 0.931
아래는 pyright 를 함께 사용하여 실행 가능한 전체 실행 코드 입니다.
from typing import Generic, Optional, Union, TypeVar
ARM = TypeVar("ARM")
HEAD = TypeVar("HEAD")
class Robot(Generic[ARM, HEAD]):
def __init__(self, arm: ARM, head: HEAD):
self.arm = arm
self.head = head
def decode(self):
decodedValue: Optional[ARM] = None
pass
def __str__(self):
return f"{self.arm} && {self.head}"
robot: Robot = Robot[int, int](122432, 343534)
robot2: Robot = Robot[str, str]("2323544", "84539232")
robot3: Robot = Robot[float, str](345483.135, "249308543")
class Siri(Robot[ARM, HEAD]):
pass
siri1 = Siri[int, int](342323, 9238235)
siri2 = Siri[str, int]("9999", 245324)
siri3 = Siri[float, str](230845.4523, "12948")
print(robot)
print(robot2)
print(robot3)
print(siri1)
print(siri2)
print(siri3)
그럼 앞으로도 좋은 강의 부탁 드리며 22년 한해 새해 복 많이 받으세요.
감사합니다.