如果我想要一个可以表示多种可能类型的类型,则Union
s似乎就是我的表示方式:
U = Union[int, str]
U
可以是int
或str
。
我注意到尽管TypeVar
s允许可选的var-arg参数,但它们似乎也做同样的事情:
T = TypeVar("T", int, str)
双方T
并U
似乎只被允许采取的类型str
和int
。
这两种方式有什么区别,何时应首选?
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中