inflearn logo
강의

Course

Instructor

Type Python! Correct class usage and object-oriented programming

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

445

Ji Nam Lee

1 asked

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

감사합니다.

 

pyright oop subclass python typing

Answer 1

1

amamov

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

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

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

보너스 챕터 마지막 강의 녹화 품질이 문제가 있습니다ㅠㅠ

0

110

1

린터 설치문의

0

362

2

데이터분석에서의 가상환경

0

395

0

print(Robot.how_many()) 하면 None이 뜨는 이유

2

325

2

타입파이썬 문의

1

333

1

프레임워크 질문

1

234

1

문수미님과 같은 내용입니다

1

309

1

클래스 상속 순서? 질문

1

378

2

pip과pip3의 차이

1

2727

1

메서드 리턴 값이 print일 때 print를 찍으면 None

1

247

1

변수의 참조에 대해서 질문입니다.

1

242

1

질문입니다..

1

201

1

which pyhon이 왜 안될까요..?

1

435

1

pyright 에러나서 질문드립니다.

1

392

1

클래스 변수 관련 질문입니다.

1

296

1

데코레이터 관련 질문

1

223

1

venv 로 만든 가상환경은 파이썬 버젼을 변경하기가 어려운 것 같습니다.

1

1108

1

Final로 타이핑한 변수에 list를 넣는다면

1

225

1

생성자에서 자기 자신 타이핑 하는 경우

1

217

1

f"{객체}" 출력값에서의 숫자값과 id(객체)에서의 숫자값의 차이가 무엇인가요??

1

331

1

타입힌트 실무에서 자주쓰이나요?

2

478

1

스태틱메소드와 클래스메소드

3

261

1

인스턴스와 데이터

2

232

1

call method 관련 질문입니다!

1

188

1