当前位置: 首页 > 面试题库 >

在Python类型注释中排除类型

柴修筠
2023-03-14
问题内容

我写了以下函数:

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


问题答案:

假设您愿意在调用函数时修复键和值的类型,则可以使用泛型来使其明确。这还可能会允许的情况下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*]'


 类似资料:
  • 在python 3.x中,通常使用函数的返回类型注释,例如: “void”类型的正确注释是什么? 我正在考虑三种选择:

  • Struts 2 应用程序可以使用Java5注释作为替代XML和Java属性配置。这里是清单的不同的类别有关的最重要的注解: 命名空间注释(动作注释): @ Namespace注释允许在Action类中,而不是基于零配置的约定动作的命名空间的定义。 结果注释 - (动作译注): @ Result注解允许在Action类中,而不是一个XML文件中定义的动作结果。 结果注释 - (动作译注): @ R

  • 问题内容: 我想创建自己的注释来注释一些局部变量。编写注释不是问题,问题在于在运行时获取它们的信息。我只能从带注释的方法或方法参数中获得一些信息,而不能从局部变量中获得一些信息。有什么办法吗? 我自己的注释是这样的: 或者,作为替代方法,是否有任何方法可以获取该方法的代码,对其进行进一步解析并最终获得注释值? 提前致谢。 问题答案: 通过反射,您无法检索局部变量。因此,您无法通过反射检索局部变量上

  • 本文向大家介绍Java注释的类型。,包括了Java注释的类型。的使用技巧和注意事项,需要的朋友参考一下 Java支持单行,多行注释和文档注释。Javadoc工具可以理解文档注释,并可用于创建基于HTML的文档。 / **被称为文档注释。Javadoc工具在为程序代码创建文档时使用它。 / *用于多行注释。 //用于单行注释 示例

  • 我正在阅读有关java注释的信息,出现了一个新的疑问。 在文档中解释功能接口注释类型: 带有一个抽象方法声明的接口称为函数式interface.The编译器验证所有使用@FunctionalInterface注释的接口是否真正包含一个且仅包含一个抽象方法。如果使用此注释注释的接口不是函数式接口,则会生成编译时错误。在类、注释类型和枚举上使用此注释也是编译时错误。FunctionalInterfac

  • 问题内容: 我是C ++ / Java程序员,在日常编程中碰巧使用的主要范例是OOP。在某个线程中,我读到一条评论,即Type类本质上比OOP更直观。有人可以用简单的词来解释类型类的概念,以便像我这样的OOP家伙可以理解吗? 问题答案: 首先,我总是非常怀疑这种程序结构更直观。编程是违反直觉的,并且总是会因为人们自然而然地根据特定情况而不是一般规则来思考。要更改此设置,需要培训和实践,也称为“编程