簡體   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