在 Python 键入注释中排除类型
Exclude type in Python typing annotation
我写了下面的函数:
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
除外”或"Every possible value but None
"?
Python 类型提示不能 排除 类型。您不能排除 None
s、str
s 或任何其他类型。
唯一可以用来模拟 None
排除的方法是使用 Union 并在字典中写下您实际使用的每种类型。
鉴于您愿意在调用函数时固定键和值的类型,您可以使用泛型来明确这一点。这仍然可能允许 V
的实例成为 None
,但它使意图非常清楚。请注意,由于 variance issues,您必须使用 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*]'
我写了下面的函数:
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
除外”或"Every possible value but None
"?
Python 类型提示不能 排除 类型。您不能排除 None
s、str
s 或任何其他类型。
唯一可以用来模拟 None
排除的方法是使用 Union 并在字典中写下您实际使用的每种类型。
鉴于您愿意在调用函数时固定键和值的类型,您可以使用泛型来明确这一点。这仍然可能允许 V
的实例成为 None
,但它使意图非常清楚。请注意,由于 variance issues,您必须使用 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*]'