mypy:如何最好地处理 random.choice

Posted

技术标签:

【中文标题】mypy:如何最好地处理 random.choice【英文标题】:mypy: how to best deal with random.choice 【发布时间】:2020-10-03 02:22:38 【问题描述】:

处理以下 mypy 错误的最佳方法是什么 -

赋值类型不兼容(表达式类型为“object”,变量类型为“Union[ClassOne, ClassTwo, ClassThree, ClassFour]”)

对于下面的循环:

def func(self) -> List:
        thing = [x for x in self.Bar if x.condition]
        Foo: Union[ClassOne, ClassTwo, ClassThree, ClassFour]
        if len(thing) == 1:
            Foo = ClassOne(self.Bar)
        elif len(thing) == 2:
            Foo = random.choice([ClassTwo(self.Bar), ClassThree(self.Bar)])
        elif len(thing) == 3:
            Foo = ClassFour(self.Bar)
        result = Foo.mymethod()

        return result

如您所见,我正在根据条件选择一个已初始化的类并在其上运行一个方法。

当使用 random.choice 时,mypy 坚持类型是对象。

在 Foo 的类型声明中添加“object”或“Any”无济于事,因为 mypy 抱怨 object 没有 mymethod 属性。

【问题讨论】:

【参考方案1】:

Mypy 推断[ClassTwo(self.Bar), ClassThree(self.Bar)] 的类型是List[object],这是合理的,因为objectClassTwoClassThree 的最后一个公共基类。

但是您可以通过显式设置其类型来使其类型更具限制性:

choices: List[Union[ClassTwo, ClassThree]] = [ClassTwo(self.Bar), ClassThree(self.Bar)]
Foo = random.choice(choices)

【讨论】:

以上是关于mypy:如何最好地处理 random.choice的主要内容,如果未能解决你的问题,请参考以下文章

如何在PyCharm中运行mypy插件以检查键入的代码?

jQuery.ajax() - 如何最好地处理超时?

如何最好地处理传递给 IFilter 的照片?

如何让 Mypy 在 Callable 中识别类的协议成员资格?

我需要关于如何最好地处理电子商务情况的建议

如何在静态类型检查时运行代码 [重复]