忽略python中的IndexError(类似于列表订阅上的null合并运算符)

时间:2019-05-23 07:19:32

标签: python index-error null-coalescing-operator

当我使用超出范围的索引访问列表/数组时,是否存在使python忽略IndexError并仅返回默认值或None的pythonic方法?

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

当程序运行的参数不超过2个时,这可能会导致IndexError。但是,如果我想说argv[1]argv[2]有默认值,那么我应该这样写:

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

是否有任何Python方法可以缩短try以外的语句?

(例如name = input or "Not set"用于pythonic null-claescing运算符)

Related post? (using or operator)

2 个答案:

答案 0 :(得分:1)

不确定这是否真的是pythonic,但是您可以使用包含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]))

接近品味...

答案 1 :(得分:0)

default_val_adefault_val_b中设置默认值,并在index中设置索引,a为sys.arg[1],b为sys.arg[2]。这是我能想到的最pythonic和单行的方法:

import sys

a = [1]
b = []

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

index = 1

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

print(a, b)

结构如下:

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