繁体   English   中英

Python 解包中的默认值

[英]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

这将正常分配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

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM