如何正确地向pythonmixin添加类型注释?

2024-10-05 15:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

代码设置

我有以下类,我想使用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内部实例引用的正确方法

最后一个问题是:

这是注释这种混合的正确方法吗?


Tags: toselfstringreturnifdefmixinclass