올바르게 주석을 달 수있는 방법을 찾을 수없는 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
이제 특정 Child
impl은 다음과 같습니다.
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] 삭제
몇 마디 만하겠습니다