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
这将正常分配 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
您可以使用 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
如果要解包的值的数量与变量列表相比太少,是否有办法获得默认值?
例如:
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
这将正常分配 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
您可以使用 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