2017-12-19 32 views
2

내 문제는 클래스 A에 대해 일을 수행하고 그 함수를 서브 클래스 (B)로 사용하면 여전히 클래스 A에 대해 입력되고 클래스 B 객체를 인수 또는 함수 서명으로 받아들이지 않는다는 것입니다. . 단순화상속 된 형식 힌트를 파이썬으로 가져 오는 방법은 무엇입니까?

내 문제 :

from typing import TypeVar, Generic, Callable 

T = TypeVar('T') 


class Signal(Generic[T]): 
    def connect(self, connector: Callable[[T], None]) -> None: 
     pass 

    def emit(self, payload: T): 
     pass 


class A: 
    def __init__(self) -> None: 
     self.signal = Signal[A]() 

    def do(self) -> None: 
     self.signal.emit(self) 

def handle_b(b: "B") -> None: 
    print(b.something) 

class B(A): 
    def __init__(self) -> None: 
     super().__init__() 
     self.signal.connect(handle_b) 

    @property 
    def something(self) -> int: 
     return 42 

은 나뿐만 아니라 전체 신호 클래스를 제공 할 수 있지만 그것은 단지 문제에서 그러기. 이것은 mypy -> error에서 하나의 에러를 남겨 둡니다 : "Signal"의 "connect"에 대한 인수 1은 호환되지 않는 타입의 호출 가능 [[B], None]; 예상 호출 가능 [A], 없음] 신호 처리가 명확 잘해야 비록 B 형 객체가 반환 될 것으로 예상 할 수없는 상기 서브 클래스 B에서 구현되기 때문에

...

+0

글쎄, 오류가 옳다면,'self.signal = Signal [A]()'에만'self.signal'을'A'로 제한하십시오. –

+0

기본적으로'T = A'를 설정합니다. 'B'는 서브 클래스 일 수 있지만'A.something '이 존재하지 않기 때문에 그 속성을 사용할 수 없습니다. 이제 모든 것을 'A'에 묶었습니다. 'B'를 받아들이는 메소드는'B.something'을 사용하는 것이 명백히 허용되어서 기본 클래스'A'는 그 요구 사항을 결코 만족시킬 수 없습니다. –

답변

0

형식 힌트 오류가 완전히 맞습니다. 당신은 A__init__ 방법, 유형으로 ASignal 인스턴스를 생성 :

self.signal = Signal[A]() 

서브 클래스 벌금 전달하지만, 모든 코드는는 A 경우에만 작동하는 지금 Signal 인스턴스와 상호 작용 . 반면 handle_b()B의 인스턴스를 필요로하며 대신 A으로 요구 사항을 낮출 수 없습니다.

드롭 제약 :

self.signal = Signal() 

또는 올바른 유형의 각 서브 클래스의 인스턴스를 만듭니다.

+0

A 유형의 서브 타입을 받아들이는 힌트 유형을 알리는 방법이 없어야합니까? 타이핑 작업을 사용하지 못하게하는 것이지만 그 때 힌팅 유형이 전혀없는 이유는 무엇입니까? – user2799096

+0

죄송합니다. 잠시 동안 키보드에서 벗어나야합니다. 'A '대신에 공 변인으로 표시된'TypeVar()'를 사용할 수도 있지만 내일까지는 테스트 할 수 없습니다. –

+0

이미 시도해 봤는데 문제가 발생했습니다 : 오류 : 공용 변수 형식 변수를 매개 변수로 사용할 수 없습니다. def35 (emit (self, payload : T) : ) 여전히 이전 오류가 있습니다. D가 내 마피 버전을 업그레이드 할 수도 있습니다 ... – user2799096