如果解压缩的值与变量列表相比太少,有没有办法获得默认值?
例如:
a, b, c = read_json(request)
如果read_json
返回三个或更多变量的数组,则此方法有效。如果它只返回两个,则在分配c
时会出现异常。那么,如果无法正确解压缩,有没有办法将c
设置为默认值?类似的东西:
a, b, (c=2) = read_json(request)
这与使用默认参数定义函数时的操作类似。
谢谢!
答案 0 :(得分:7)
您可以尝试*
解压缩一些后处理:
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
答案 1 :(得分:2)
您可以使用chain function from itertools,它是Python标准库的一部分。如果第一个列表中没有值,它将作为默认填充。 '默认'我的示例中的list变量可以为您解压缩的每个变量包含多个不同的值(在一个示例中,我将所有三个值的默认值都设置为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
答案 2 :(得分:0)
在回答问题时,你不能这样做。
此外,我建议不要从函数中返回不同数量的参数 - 这只会导致编译进一步发生问题(这个问题的例子)。每次调用该函数时,您都需要测试是否返回了2或3个值。 (解压缩在这里很有用,但你仍然需要检查那些返回的变量)。例如:
a, b, *others = read_json(request)
if others:
c = others[0]
如果函数可以返回设置了默认值的dict,那么假设read_json是你的函数会更有意义:
def read_json(request):
ret = { 'c': 2 }
# ... set 'a' and 'b' and 'c' if possible
return ret
res = read_json(request)
c = res['c']
答案 3 :(得分:0)
我知道我迟到了,但是值得一提。
如果您想要的所有默认值都相同,则可以使用以下小技巧:
def return_tuple():
return (1, 2)
def return_list():
return [1, 2]
a, b, c, *_ = return_tuple() + (0,)
print(a, b, c)
# 1 2 0
a, b, c, *_ = return_list() + [0]
print(a, b, c)
# 1 2 0
a, b, c, d, *_ = return_list() + [0, 0]
print(a, b, c, d)
您可以为其他类型设置默认值:
a, b, c, d, *_ = list(range(1, 3)) + [0, 0]
print(a, b, c, d)
但是,如果默认值不同:
defaults = [10, 11, 12, 13]
result = [1, 2]
a, b, c, d, *_ = result + defaults[len(result):]
print(a, b, c, d)
# 1, 2, 12, 13
# other types
result = range(2)
a, b, c, d = list(result) + defaults[len(result):]
print(a, b, c, d)
# 0 1 12 13
希望其他人会发现它有用