2017-02-21 1 views
2

함수의 반환 형식이 기본 클래스가 아닌 - 현재 클래스 -가되도록 클래스에서 함수를 정의하는 방법은 무엇입니까? 예 :파이썬 pep484 형식 검사로 self를 반환하는 상위 수준 메서드를 수행하는 방법

Class Parent: 
    def set_common_properties_from_string(input : str) -> <WHAT SHOULD BE HERE> 
    # Do some stuff you want to do in all classes 
    return self 

Class Child(Parent): 
    pass 

    def from_file(filename : str) -> 'Child' 
     return Child().set_common_properties_from_string() # The return type of set_common must be Child 

아니면 어떻게해야합니까? 반환 유형이 baseclass 인 경우 오류가 발생합니다.

두 줄로 줄이고 Child()를 유지하기위한 임시 변수를 추가 할 수 있지만 한 라이너가 훨씬 멋지다고 생각합니다.

유형 검사를 위해 mypy를 사용합니다.

+1

그냥 스타일 힌트 : 후 괄호 전에 공간이 코드가 덜 읽을 수 있도록 . – MKesper

답변

0

새로 구현 된 (아직 실험중인) generic self 기능을 사용할 수 있습니다.이 기능은 발생하는 문제를 정확히 해결할 수 있도록 설계되었습니다.

Mypy는 version 0.4.6 (주 : 작성시 mypy의 최신 버전은 0.470 임)에서 "generic self"기능을 지원합니다. 불행히도 다른 PEP 484 호환 유형 검사기가 아직이 기능을 지원하지 않는다면 머리 꼭대기에서 기억이납니다.

간단히 말해서 새 TypeVar을 만들고 해당변수에 명시 적으로 주석을 추가하고 해당 TypeVar을 반환 값으로 지정해야합니다. 내에서, 그런 식으로 - 우리가 Parent 클래스에 의해 제한 될 우리의 TypeVar를 설정해야

from typing import TypeVar 

T = TypeVar('T', bound='Parent') 

class Parent: 
    def set_common_properties(self: T, input: str) -> T: 
     # Do some stuff you want to do in all classes 
     return self 

class Child(Parent): 
    def from_file(self, filename: str) -> 'Child': 
     # More code here 
     return Child().set_common_properties(...) 

참고 :

따라서 귀하의 경우, 다음에 코드를 수정해야 할 것 set_common_properties 메서드를 사용하면 Parent 내에있는 다른 메서드를 호출 할 수 있습니다.

당신은 PEP mypy의 웹 사이트와 내 484을 좀 더 정보를 확인할 수 있습니다