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

约束的TypeVar和Union之间有什么区别?

隆宏爽
2023-03-14
问题内容

如果我想要一个可以表示多种可能类型的类型,则Unions似乎就是我的表示方式:

U = Union[int, str]

U可以是intstr

我注意到尽管TypeVars允许可选的var-arg参数,但它们似乎也做同样的事情:

T = TypeVar("T", int, str)

双方TU似乎只被允许采取的类型strint

这两种方式有什么区别,何时应首选?


问题答案:

T的类型必须在给定范围内的多种用途之间保持一致,而U的类型则不一致。

使用Union类型作为函数参数时,参数以及返回类型都可以不同:

U = Union[int, str]

def union_f(arg1: U, arg2: U) -> U:
    return arg1

x = union_f(1, "b")  # No error due to different types
x = union_f(1, 2)  # Also no error
x = union_f("a", 2)  # Also no error
x # And it can't tell in any of the cases if 'x' is an int or string

将其与TypeVar参数类型必须匹配的类似情况进行比较:

T = TypeVar("T", int, str)

def typevar_f(arg1: T, arg2: T) -> T:
    return arg1

y = typevar_f(1, "b")  # "Expected type 'int' (matched generic type 'T'), got 'str' instead
y = typevar_f("a", 2)  # "Expected type 'str' (matched generic type 'T'), got 'int' instead

y = typevar_f("a", "b")  # No error
y  # It knows that 'y' is a string

y = typevar_f(1, 2)  # No error
y  # It knows that 'y' is an int

因此,TypeVar如果允许使用多种类型,请使用a ,但T单个作用域内的不同用法必须彼此匹配。Union如果允许使用多种类型,则使用a
,但是U在给定范围内的不同用法不需要相互匹配。



 类似资料:
  • 问题内容: 和之间有什么区别? 问题答案: 删除重复的记录(结果中的所有列均相同),但不删除。 使用而不是时,性能会受到影响,因为数据库服务器必须做额外的工作才能删除重复的行,但是通常您不希望重复(特别是在开发报表时)。 UNION示例: 结果: UNION ALL示例: 结果:

  • 问题内容: 和之间有什么区别?我可以举个例子吗? 问题答案: 逐个查询放置一行,同时生成笛卡尔乘积并对其进行子集化-完全不同的操作。琐碎的例子: 的类似的琐碎示例:

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 这个问题似乎离题了,因为它缺乏足够的信息来诊断问题 更详细地描述你的问题,或者在问题本身中包含一个最小的例子。 其中Fragment和Intent是构建类,FragmentABC是用户定义的类。 它非常基本,但仍然无法找出合理的差异来证明实例化。想知道这两种说法的区别是什么,请在你提供的答案中描述一下。

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中