我有一个基本上是字典包装的类:
class Wrapper(dict):
...
def __getitem__(self, item: Hashable) -> Any:
return self.wrapped[item]
使用mypy
检查批注时,检查此代码时将产生Explicit "Any" is not allowed
。我的猜测是,这源自Any
是所有其他类型的祖先和后继者的概念。我应该如何在要允许任何内容返回的地方注释此类功能?
答案 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
。