在Python类型注释中排除类型

时间:2019-09-09 13:18:33

标签: python python-3.x typing mypy python-typing

我编写了以下函数:

var client = new MongoClient($"mongodb://usre1:123@localhost/GSCADB");
IMongoDatabase db = client.GetDatabase("GSCADB");
var collection = db.GetCollection<BsonDocument>("GSCALogs");
int TotalFiles = collection.Find(new BsonDocument()).ToList().Count;

我想在函数中添加类型注释:

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

但是,我想明确定义返回的字典中的值不能为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} 类型,但Any除外”或“除NoneType以外的所有可能值”?

2 个答案:

答案 0 :(得分:4)

鉴于您愿意在调用函数时修复键和值的类型,因此可以使用泛型来使其明确。这仍然可能允许将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*]'

答案 1 :(得分:1)

Python类型提示不能排除类型。您不能排除Nonestr或任何其他类型。

唯一可以用来模拟None排除的方法是使用Union并在字典中写出您实际使用的每种类型。