Python解包中的默认值

Lau*_*ent 7 python arrays exception unpack

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

例如:

a, b, c = read_json(request)
Run Code Online (Sandbox Code Playgroud)

如果read_json返回三个或更多变量的数组,则此方法有效.如果它只返回两个,我在分配时会出现异常c.那么,c如果无法正确解压缩,有没有办法设置为默认值?就像是:

a, b, (c=2) = read_json(request)
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Tig*_*kT3 9

您可以尝试*使用一些后处理解压缩:

a, b, *c = read_json(request)
c = c[0] if c else 2
Run Code Online (Sandbox Code Playgroud)

这将分配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
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 5

您可以使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

0 0 0
1 0 0
1 2 0
1 2 3
1 2 3
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,只有当所有默认值都相同时,这才有效,因为链从“defaults”的开头开始补充 (2认同)