Python 解包中的默认值

Default value in Python unpacking

如果要解包的值的数量与变量列表相比太少,是否有办法获得默认值?

例如:

a, b, c = read_json(request)

这适用于 read_json returns 三个或更多变量的数组。如果它只有 returns 两个,我在分配 c 时得到一个异常。那么,如果无法正确解包,有没有办法将 c 设置为默认值?类似于:

a, b, (c=2) = read_json(request)

这与使用默认参数定义函数时的操作类似。

谢谢!

在回答这个问题时,你不能那样做。

此外,我建议不要 return 从函数中获取不同数量的参数——这只会导致编译进一步的问题(这个问题就是一个恰当的例子)。每次调用该函数时,您都需要测试是否有 2 个或 3 个值 returned。 (解包在这里可能很有用,但您仍然需要检查那些 returned 变量)。例如:

a, b, *others = read_json(request)
if others:
    c = others[0]

假设 read_json 是您的函数,如果该函数可以 return 一个设置了默认值的字典,这会更有意义:

def read_json(request):
    ret = { 'c': 2 }
    # ... set 'a' and 'b' and 'c' if possible

    return ret

res = read_json(request)
c = res['c']

您可以尝试 * 使用一些 post-processing 解包:

a, b, *c = read_json(request)
c = c[0] if c else 2

这将正常分配 ab。如果 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

您可以使用 chain function from 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