在 Python 类型注释中排除类型

问题描述 投票:0回答:2

我写了以下函数:

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
之外的所有可能值”?

python mypy python-typing
2个回答
8
投票

假设您愿意在调用函数时修复键和值的类型,您可以使用泛型来明确这一点。这仍然可能允许

V
的实例成为
None
,但它使意图非常明确。请注意,由于
方差问题
,您必须使用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*]'


8
投票

Python 类型提示不能排除类型。您不能排除

None
str
或任何其他类型。

您可以用来尝试模拟

None
排除的唯一方法是使用 Union 并在字典中写入您实际使用的每种类型。

© www.soinside.com 2019 - 2024. All rights reserved.