我有以下类,我想使用mixin插入一个新功能:
class InputCollection(StringReprMixin, AbstractVariableCollection):
def __init__(self, data: Optional[ValidInputCollection]):
super().__init__()
# rest of the code
这是我使用协议遵循mypy documentation所做的Mixin实现:
class StringReprMixin:
def __str__(self: HasEmptyProtocol) -> str:
if self.empty:
return "Empty collection."
else:
return _collection_to_string(self)
HasEmptyProtocol
用于启用mypy检查程序,以确保mixin具有empty
属性。_collection_to_string
函数具有以下签名:
CollectionType = Union[InputCollection, OutputCollection, ExpressionCollection]
def _collection_to_string(collection: CollectionType):
# rest of function code
我不知道如何使mypy正确地检查StringReprMixin
函数中的_collection_to_string
调用,因为mypy检查程序认为self是HasEmptyProtocol
的实例,而不是CollectionType
中的任何类
这是静态检查器引发的错误:
Argument 1 to "_collection_to_string" has incompatible type "HasEmptyProtocol"; expected "Union[InputCollection, OutputCollection, ExpressionCollection]"
我看到了一些问题,特别是其中一个似乎有效。然而,对我来说,在Mixin中使用类属性违背了mypy文档所建议的协议子类的目的
在调用_collection_to_string
之前,我对InputCollection
实例执行了一个cast和一个runtime check:
class StringReprMixin:
def __str__(self: HasEmptyProtocol) -> str:
if self.empty:
return "Empty collection."
else:
if TYPE_CHECKING:
self = cast(CollectionType, self)
return __collection_to_string(self)
然而,我不知道这是否是处理带有类型注释的Mixin内部实例引用的正确方法
这是注释这种混合的正确方法吗?
目前没有回答
相关问题 更多 >
编程相关推荐