【发布时间】:2018-08-28 15:30:12
【问题描述】:
是否有一种简短的方法可以对参数元组 *args 执行操作,如果将单个参数传递给函数,则返回单个参数,否则返回参数元组? 如下例所示。
def transform(*args):
if len(args) == 1:
return args[0] + 1
else:
return tuple(arg + 1 for arg in args)
这样对于单个参数,您可以简单地调用转换而无需额外的解包:
x = transform(3)
以及多个参数:
a, b, c = transform(1, 2, 3)
另一种选择是说总是接受 Sized 并返回 Sized,
def transform_2(args):
return tuple(arg + 1 for arg in args)
但这似乎使用户代码不那么直观:
x, = transform_2((3,))
a, b, c = transform_2((1, 2, 3))
或者这个解决方案更好吗?
【问题讨论】:
-
你不应该这样做。它打破了单一返回类型规则。 stackoverflow.com/questions/1839289/…
-
@FHTMitchell 我不认为它违反了这个规则,
transform(3)的输入类型是单个整数,transform(1, 2, 3)的输入类型是三个整数的元组,我返回的是相同的对象类型。 -
@DikobrAz 您的函数没有单一的返回类型。它返回不同类型的值取决于参数的类型。
-
嗯,不完全是。如果你输入的是一个元组,那么它会写成
transform((1, 2, 3))。在正式的类型系统中,(Int) -> T1是(Int, Int?, Int?) -> T2的超类型,因此T2必须是T1的子类型(这里我使用?表示可选,而不是像Kotlin 中那样可以为空)。我同意,看起来像(T) -> T的函数是可以接受的。 -
即使是
(T) -> T类型的函数也不是真正的单个函数;它是一整类函数的 架构,例如(Int) -> Int、(Char) -> Char等。
标签: python python-3.x