在Ruby中,如果访问第一个元素,则空数组返回nil:
2.1.2 :005 > arr = []
=> []
2.1.2 :006 > arr.first
=> nil
2.1.2 :007 > arr[0]
=> nil
我知道Python列表与Ruby数组不完全相同,但是如果你尝试等效的操作,就会出错:
>>> l = []
>>> l[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
我怎样才能代替错误获得False或None值?
理想情况下,如果函数调用没有返回任何内容,但是使用内联检查而不是if块,我希望像这样的赋值解析为None / False。
tp_journal = self.pool.get('account.journal').browse(cr, uid, tp_ids, context=context)[0]
答案 0 :(得分:4)
没有简单的方法可以达到你想要的效果。列表操作引发错误,句点。
但是你可以通过以下方式解决:
在第一种情况下,您可以使用空列表为false的事实,因此当(expression) or [None]
返回空列表时,[None]
将评估为expression
,因此:
((expression) or [None])[0]
另一种方法是避免使用索引但使用迭代和next
来获取第一个元素:
next(iter(expression), None)
不幸的是,您必须显式调用iter
来获取列表迭代器。
要将这些方法扩展到任何索引,您可以使用切片而不是简单的索引:
((expression)[index:] or [None])[0]
或者:
next(islice(expression, index, None), None)
# or
next(iter(expression[index:]), None)
(islice
为itertools.islice
)。
这是有效的,因为切片不会引起越界索引的错误。
但是,如果您经常在代码中使用该功能,我首选的方法是使用函数:
def get_with_default(seq, index):
try:
return seq[index]
except LookupError:
return None
答案 1 :(得分:1)
也许您可以利用or
运营商的短路性质。
seq = [23,42]
print (seq or [None])[0]
#result: 23
seq = []
print (seq or [None])[0]
#result: None
在上面的代码中,如果seq or [None]
包含任何元素,则seq
评估为seq
,如果[None]
为空,则评估为seq
。然后[0]访问返回的列表中的第一个元素。