[英]Default value in Python unpacking
如果与变量列表相比要解包的值的数量太少,是否有一种方法可以获得默认值?
例如:
a, b, c = read_json(request)
如果read_json
返回包含三个或更多变量的数组,则此方法有效。 如果它只返回两个,我在分配c
时会遇到异常。 那么,如果c
无法正确解包,有没有办法将其设置为默认值呢? 就像是:
a, b, (c=2) = read_json(request)
这类似于您在定义默认值为 arguments 的 function 时所做的事情。
谢谢!
您可以尝试*
使用一些后处理解包:
a, b, *c = read_json(request)
c = c[0] if c else 2
这将正常分配a
和b
。 如果c
被分配了一些东西,它将是一个包含一个元素的list
。 如果只解压了两个值,它将是一个空list
。 如果有一个,则第二个语句将其第一个元素分配给c
,否则将其分配给默认值2
。
>>> a, b, *c = 1, 2, 3
>>> c = c[0] if c else 2
>>> a
1
>>> b
2
>>> c
3
>>> a, b, *c = 1, 2
>>> c = c[0] if c else 2
>>> a
1
>>> b
2
>>> c
2
您可以使用itertools 中的链函数,它是 Python 标准库的一部分。 如果第一个列表中没有值,它会用作默认填充符。 在我的示例中,'defaults' 列表变量可以为您解包的每个变量具有多个不同的值(在示例中,我将所有三个值的默认值设为 0)。
from itertools import chain
defaults = [0] * 3
data = []
a, b, c, *_ = chain(data, defaults)
print(a, b, c)
data.append(1)
a, b, c, *_ = chain(data, defaults)
print(a, b, c)
data.append(2)
a, b, c, *_ = chain(data, defaults)
print(a, b, c)
data.append(3)
a, b, c, *_ = chain(data, defaults)
print(a, b, c)
data.append(4)
a, b, c, *_ = chain(data, defaults)
print(a, b, c)
输出:
0 0 0
1 0 0
1 2 0
1 2 3
1 2 3
在回答这个问题时,你不能这样做。
此外,我建议不要从函数返回不同数量的参数 - 这只会导致进一步的问题(this question case in point)。 每次调用该函数时,您都需要测试是否返回了 2 个或 3 个值。 (解包在这里可能很有用,但您仍然需要检查那些返回的变量)。 例如:
a, b, *others = read_json(request)
if others:
c = others[0]
假设 read_json 是您的函数,如果该函数可以返回具有默认值集的 dict ,这将更有意义:
def read_json(request):
ret = { 'c': 2 }
# ... set 'a' and 'b' and 'c' if possible
return ret
res = read_json(request)
c = res['c']
如果要解压缩的值的数量与变量列表相比太少,是否可以使用默认值?
例如:
a, b, c = read_json(request)
如果read_json
返回三个或三个以上变量的数组,则此方法有效。 如果它仅返回两个,则在分配c
出现异常。 因此,如果无法正确解压缩,是否可以将c
设置为默认值? 就像是:
a, b, (c=2) = read_json(request)
这与使用默认参数定义函数时的操作类似。
谢谢!
如果您想要一个单行解决方案,可以使用以下在 lambda 函数中使用默认参数的技巧,但它有点令人困惑且难以阅读:
a, b, c = (lambda a, b, c=3: (a, b, c))(*(1, 2))
print(a, b, c)
a, b, c = (lambda a, b, c=3: (a, b, c))(*(1, 2, 4))
print(a, b, c)
Output:
1 2 3
1 2 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.