[英]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
這將正常分配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
您可以使用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.