为什么mypy抱怨Any作为返回注释,我应该如何注释可以是任何东西的返回值?

时间:2018-07-21 17:35:46

标签: python types mypy

我有一个基本上是字典包装的类:

class Wrapper(dict):

    ...

    def __getitem__(self, item: Hashable) -> Any:
        return self.wrapped[item]

使用mypy检查批注时,检查此代码时将产生Explicit "Any" is not allowed。我的猜测是,这源自Any是所有其他类型的祖先和后继者的概念。我应该如何在要允许任何内容返回的地方注释此类功能?

3 个答案:

答案 0 :(得分:1)

如果您确实需要自定义映射(对吗?),我建议不要继承自dict,因为它将来可能会引起很多痛苦(您应该重新定义其方法,或者有时您应该将使用self.wrapped,有时不使用)。

我们可以简单地使用collections.abc module中的MutableMapping ABC并定义基本方法(如__getitem__),其余方法(keys()values,{{1 }}已经定义)。

关于items():我更喜欢为元素/键/值/等定义辅助类型变量。在班级内部。

所以我们最终可以得到类似的东西

mypy

测试

运行带有from collections import abc from typing import (Dict, Iterator, TypeVar) class Wrapper(abc.MutableMapping): KeyType = TypeVar('KeyType') ValueType = TypeVar('ValueType') def __init__(self, wrapped: Dict[KeyType, ValueType]) -> None: self.wrapped = wrapped def __delitem__(self, key: KeyType) -> None: del self.wrapped[key] def __len__(self) -> int: return len(self.wrapped) def __iter__(self) -> Iterator[KeyType]: return iter(self.wrapped) def __setitem__(self, key: KeyType, value: ValueType) -> None: self.wrapped[key] = value def __getitem__(self, key: KeyType) -> ValueType: return self.wrapped[key] 标志的mypy不会引起错误/警告。

答案 1 :(得分:0)

在配置文件中将该模块的disallow_any_explicit设置为True时,会发生这种情况。只需删除默认False的选项即可。

答案 2 :(得分:0)

您在问题中提供的信息不足,无法重新创建此错误,但是如果您唯一的问题是:

  

我应该在要允许任何内容返回的地方注释该功能吗?

简单的答案是完全不添加注释。默认情况下,它将充当Any