Игнорировать IndexError в python (что-то вроде оператора объединения нулей в подписке на список) - PullRequest
1 голос
/ 23 мая 2019

Есть ли питонский способ заставить python игнорировать IndexError и просто возвращать значение по умолчанию или None, когда я получаю доступ к списку / массиву с индексом вне диапазона?

import sys
input = sys.argv[1]
output = sys.argv[2]

Это может вызвать IndexError, когда программа запускается не более чем с 2 параметрами. Однако, если я хочу сказать, что есть значения по умолчанию для argv[1] и argv[2], то я должен написать так:

import sys
input = len(sys.argv) > 1 ? sys.argv[1] : DefaultValue1
output = len(sys.argv) > 2 ? sys.argv[2] : DefaultValue2

Есть ли какой-нибудь питонный способ сократить это утверждение, кроме try?

(например, name = input or "Not set" для питонического оператора с нулевым коллапсом)

Похожие записи? (с использованием оператора or)

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Не уверен, действительно ли это питон, но вы можете расширить sys.argv массивом, содержащим None, и нарезать его. Тогда вам просто нужно проверить значения по None:

input, output = (sys.argv + [None] * 2)[:2]
if input is None: input = defaultValue1
if output is None: output = defaultValue2

Или в один лайнер:

defaultValues = [defaultValue1, defaultValue2]
input, output = (val if val is not None else defaultValues[i]
                 for i, val in enumerate((sys.argv + [None] * 2)[:2]))

Близко к вкусу ...

0 голосов
/ 23 мая 2019

Установите значения по умолчанию в default_val_a и default_val_b и установите индекс в index a - это sys.arg[1], а b - sys.arg[2]. Это самый питонический и однострочный способ, которым я могу придумать:

<b>import</b> sys

a = [1]
b = []

default_val_a = [1, 2, 3]
default_val_b = [4, 5, 6]

index = 1

a = default_val_a[index] <b>if</b> len(a) <= index <b>or</b> <b>not</b> a <b>else</b> a[index]
b = default_val_b[index] <b>if</b> len(b) <= index <b>or</b> <b>not</b> b <b>else</b> b[index]

<b>print</b>(a, b)

И структура такая:

VAR = DEFAULT_VALUE[INDEX] if len(VAR) <= INDEX or not VAR else VAR[INDEX]
...