• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

pyright 를 이용한 클래스 재정의 코드 실행 문제점 질문 드립니다.

22.01.26 16:20 작성 조회수 272

1

안녕하세요.

강사님.

먼저 재미있고 흡입력있게 파이썬 타입 강의를 진행해주신 것 같아 감사의 말씀 드립니다. ^^

제네릭 강의를 실습하다가 발견한 부분이 있어 질문을 드리고자 합니다.

 

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년 한해 새해 복 많이 받으세요.

감사합니다.

 

답변 1

답변을 작성해보세요.

1

안녕하세요! 답변이 밀려 이제야 확인하네요 죄송합니다 ㅠㅠ

네 맞습니다! pyright는 해당 툴에서 정의된 PEP 규칙에 따라 타입 체킹이 달라지는 것입니다.

config 파일을 사용하여 원하는 방식으로 규칙을 수정할 수 있으니 참고하세요!