상속 유형 및 멤버 오버로드와 관련된 Python 유형 주석 문제

마이클 후어 만

올바르게 주석을 달 수있는 방법을 찾을 수없는 python 3.7의 아래 예제를 참조하십시오. 주석 오류는 주석에 표시되며 mypy에서 제공합니다.

  • "일반 멤버"를 구현하는 "일반 클래스"가 있습니다. 그리고 그 구조를 상속받은 구체적인 클래스와 멤버.
  • 구체적인 멤버는 추가 메서드를 가질 수 있으며 생성자에 대해 다른 인수를 사용할 수 있습니다.

이를 올바르게 주석 처리하는 방법은 무엇입니까?

감사합니다.

import abc
import typing


class ParentProvider(metaclass=abc.ABCMeta):
    def __init__(self) -> None:
        pass


class ChildProvider(ParentProvider):
    def __init__(self, who: str) -> None:
        ParentProvider.__init__(self)
        self._who: str = who

    @property
    def p(self) -> str:
        return "Hello %s" % self._who


class Parent(metaclass=abc.ABCMeta):
    @property
    @abc.abstractmethod
    def providerType(self) -> typing.Type[ParentProvider]:
        pass

    @property
    @abc.abstractmethod
    def providerKwargs(self) -> typing.Dict[str, typing.Any]:
        pass

    @property
    def provider(self) -> ParentProvider:
        # How to avoid the following error?
        # error: Too many arguments for "ParentProvider"  [call-arg]
        return self.providerType(**self.providerKwargs)

    @abc.abstractmethod
    def useIt(self) -> None:
        pass


class Child(Parent):
    @property
    def providerType(self) -> typing.Type[ParentProvider]:
        # Using Type[ChildProvider] instead Type[ParentProvider]
        # doesn't helps
        return ChildProvider

    @property
    def providerKwargs(self) -> typing.Dict[str, typing.Any]:
        return dict(who='world')

    def useIt(self) -> None:
        # How to avoid the following error?
        # error: "ParentProvider" has no attribute "p"  [attr-defined]
        print(self.provider.p)


if __name__ == "__main__":
    Child().useIt()
편자

"일반 멤버"를 구현하는 "일반 클래스"가 있습니다.

그런 다음 다음과 같이 표시하십시오.

from typing import Generic, TypeVar


_T = TypeVar('_T', bound='ParentProvider')


class Parent(Generic[_T], metaclass=abc.ABCMeta):
    @property
    @abc.abstractmethod
    def providerType(self) -> typing.Type[_T]:
        pass

    @property
    @abc.abstractmethod
    def providerKwargs(self) -> typing.Dict[str, typing.Any]:
        pass

    @property
    def provider(self) -> _T:
        return self.providerType(**self.providerKwargs)

    @abc.abstractmethod
    def useIt(self) -> None:
        pass

이제 특정 Childimpl은 다음과 같습니다.

class Child(Parent[ChildProvider]):
    @property
    def providerType(self) -> typing.Type[ChildProvider]:
        return ChildProvider

    @property
    def providerKwargs(self) -> typing.Dict[str, typing.Any]:
        return dict(who='world')

    def useIt(self) -> None:
        print(self.provider.p)

다음 오류를 피하는 방법은 무엇입니까?

error: Too many arguments for "ParentProvider"  [call-arg]

Parent.__init__서명 인수가 전달 될 수 없습니다 - 당신이 그것을 풀어 수 있습니다

class ParentProvider(metaclass=abc.ABCMeta):
    def __init__(self, *args, **kwargs) -> None:
        pass

(또는 그냥

class ParentProvider(metaclass=abc.ABCMeta):
    def __init__(self, **kwargs) -> None:
        pass

공급자 생성자에 전달 된 위치 인수를 허용하지 않으려는 경우).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python 유형 주석 : 상속 된 메서드의 반환 유형

분류에서Dev

Python 버전 종속 유형 주석

분류에서Dev

제네릭 형식 유추와 관련된 이상한 문제

분류에서Dev

특정 C ++ 유형에 멤버가 있는지 감지 (상속 된 멤버 제외)

분류에서Dev

상속 된 멤버의 힌트 유형 변경

분류에서Dev

list 및 bool 유형의 작업 매개 변수와 관련된 WebAPI MapHttpRoute 문제

분류에서Dev

중괄호 ( "{"및 "}")와 관련된 Python 문자열 형식화 문제

분류에서Dev

PowerShell의 멤버 유형 (ScriptProperty, Property 및 NoteProperty)

분류에서Dev

주석 핀 색상 및 유형

분류에서Dev

상속 된 클래스 멤버의 반환 유형을 변경하는 방법

분류에서Dev

제네릭 및 유형 별칭과 관련된이 typescript 구문을 설명하십시오.

분류에서Dev

스칼라 추상 유형 멤버

분류에서Dev

추상 유형 멤버 지정

분류에서Dev

python3 유형 주석에 대한 속성 오류 발생

분류에서Dev

관련 유형 및 제네릭 사용 오류

분류에서Dev

제네릭 유형 및 상속 혼란

분류에서Dev

제네릭 유형 및 상속 혼란

분류에서Dev

상속 및 제네릭 유형

분류에서Dev

Umbraco 6.X에서 상속 된 멤버 유형을 만드는 방법은 무엇입니까?

분류에서Dev

Umbraco 6.X에서 상속 된 멤버 유형을 만드는 방법은 무엇입니까?

분류에서Dev

공유 된 임의 유형으로 결합 된 추상 클래스에 대한 유형 주석

분류에서Dev

유효성 검사와 관련된 Python 중첩 루프 문제

분류에서Dev

C ++ 유형 변환 클래스 멤버 연산자 문제

분류에서Dev

클래스 멤버 함수 전달 : 유형 문제

분류에서Dev

경로 종속 유형 및 제네릭

분류에서Dev

속성, 유형 및 Python

분류에서Dev

내 정의 된 클래스의 멤버에 C ++ 벡터 데이터 유형 컴파일러 오류 문제

분류에서Dev

Python의 유형 주석

분류에서Dev

jOOQ Postgres PERCENTILE_CONT 및 MEDIAN 유형 캐스팅 관련 문제

Related 관련 기사

  1. 1

    Python 유형 주석 : 상속 된 메서드의 반환 유형

  2. 2

    Python 버전 종속 유형 주석

  3. 3

    제네릭 형식 유추와 관련된 이상한 문제

  4. 4

    특정 C ++ 유형에 멤버가 있는지 감지 (상속 된 멤버 제외)

  5. 5

    상속 된 멤버의 힌트 유형 변경

  6. 6

    list 및 bool 유형의 작업 매개 변수와 관련된 WebAPI MapHttpRoute 문제

  7. 7

    중괄호 ( "{"및 "}")와 관련된 Python 문자열 형식화 문제

  8. 8

    PowerShell의 멤버 유형 (ScriptProperty, Property 및 NoteProperty)

  9. 9

    주석 핀 색상 및 유형

  10. 10

    상속 된 클래스 멤버의 반환 유형을 변경하는 방법

  11. 11

    제네릭 및 유형 별칭과 관련된이 typescript 구문을 설명하십시오.

  12. 12

    스칼라 추상 유형 멤버

  13. 13

    추상 유형 멤버 지정

  14. 14

    python3 유형 주석에 대한 속성 오류 발생

  15. 15

    관련 유형 및 제네릭 사용 오류

  16. 16

    제네릭 유형 및 상속 혼란

  17. 17

    제네릭 유형 및 상속 혼란

  18. 18

    상속 및 제네릭 유형

  19. 19

    Umbraco 6.X에서 상속 된 멤버 유형을 만드는 방법은 무엇입니까?

  20. 20

    Umbraco 6.X에서 상속 된 멤버 유형을 만드는 방법은 무엇입니까?

  21. 21

    공유 된 임의 유형으로 결합 된 추상 클래스에 대한 유형 주석

  22. 22

    유효성 검사와 관련된 Python 중첩 루프 문제

  23. 23

    C ++ 유형 변환 클래스 멤버 연산자 문제

  24. 24

    클래스 멤버 함수 전달 : 유형 문제

  25. 25

    경로 종속 유형 및 제네릭

  26. 26

    속성, 유형 및 Python

  27. 27

    내 정의 된 클래스의 멤버에 C ++ 벡터 데이터 유형 컴파일러 오류 문제

  28. 28

    Python의 유형 주석

  29. 29

    jOOQ Postgres PERCENTILE_CONT 및 MEDIAN 유형 캐스팅 관련 문제

뜨겁다태그

보관