2015-08-12 6 views
4

Есть ли способ получить значение по умолчанию, если количество значений для распаковки слишком мало по сравнению с списком переменных?Значение по умолчанию при распаковке Python

Например:

a, b, c = read_json(request) 

Это работает, если read_json возвращает массив из трех или более переменных. Если он возвращает только два, я получаю исключение, назначая c. Итак, есть ли способ установить c на значение по умолчанию, если оно не может быть распаковано должным образом? Что-то вроде:

a, b, (c=2) = read_json(request) 

Это похоже на то, что вы делаете при определении функции с аргументами по умолчанию.

Спасибо!

+1

является 'read_json()' собственные функции? Если да, почему вы не можете убедиться, что он всегда возвращает 3 значения? –

+0

Нет, нет; вам нужно убедиться, что вы вернете три значения, или пэд и срез в правой части задания. – jonrsharpe

+1

Вы можете пойти с '*' распаковкой, например. 'a, b, * c = read_json (request)', где распаковка только двух значений приведет к тому, что 'c' будет пустым' list', но если вам действительно нужны конкретные значения, лучше иметь функцию 'return' something немного более строгий. – TigerhawkT3

ответ

4

Вы могли бы попробовать * распаковка с некоторым пост- обработка:

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 
+0

Не работает на Python 2 – Kevin

0

В ответ на вопрос нет, вы не можете этого сделать.

Кроме того, я бы рекомендовал не возвращать различное количество аргументов из функций - это приведет только к дальнейшему устранению компиляций по строке (в этом случае вопрос). Каждый раз, когда вы вызываете эту функцию, вам нужно будет проверить, было ли возвращено 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'] 
0

Вы можете использовать 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