小编典典

在Python类型注释中排除类型

python

我写了以下函数:

def _clean_dict(d):
    return {k: v for k, v in d.items() if v is not None}

我想向函数添加类型注释:

def _clean_dict(d: Dict[Any, Any]) -> Dict[Any, Any]:                           
    return {k: v for k, v in d.items() if v is not None}

但是,我想明确定义返回的字典内的值 不能 为None。

有没有办法说“Any类型,除NoneType”或“除”以外的所有可能值None


阅读 219

收藏
2020-12-20

共1个答案

小编典典

假设您愿意在调用函数时修复键和值的类型,则可以使用泛型来使其明确。这还可能会允许的情况下VNone,但它使意图很清楚。请注意,Mapping由于存在差异问题,因此必须使用。但是,无论如何这是优选的。

from typing import *


K = TypeVar("K")
V = TypeVar("V")


def _clean_dict(d: Mapping[K, Optional[V]]) -> MutableMapping[K, V]:
    return {k: v for k, v in d.items() if v is not None}

使用此定义,可以mypy正确地将可选类型转换为非可选类型。

# clean_dict.py

d = {"a": 1, "b": 2, "c": None}
reveal_type(d)
reveal_type(_clean_dict(d))

$ mypy clean_dict.py

note: Revealed type is 'builtins.dict[builtins.str*, Union[builtins.int, None]]'
note: Revealed type is 'typing.MutableMapping[builtins.str*, builtins.int*]'
2020-12-20