*args
,如果函数只接收到一个参数,则返回单个参数,否则返回参数元组?就像下面的例子一样。
def transform(*args):
if len(args) == 1:
return args[0] + 1
else:
return tuple(arg + 1 for arg in args)
这样,对于单个参数,您可以直接调用 transform 而无需进行额外的解包:
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))
还是这个解决方案更好?
transform((1, 2, 3))
。在正式类型系统中,(Int) -> T1
是(Int, Int?, Int?) -> T2
的超类型,因此T2
必须是T1
的子类型(这里我使用?
表示可选,而不是 Kotlin 中的可为空)。我同意,像(T) -> T
这样的函数是可以接受的。 - FHTMitchell(T) -> T
的函数并不是一个单一函数;它是一个整个函数类的模式,例如(Int) -> Int
,(Char) -> Char
等等。 - chepnerstatic T Method<T>(T arg)
(我认为)非常满意。 - FHTMitchell