相当于Python中的Ruby nil数组

时间:2014-09-16 14:11:28

标签: python ruby arrays list

在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]

2 个答案:

答案 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)

isliceitertools.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]访问返回的列表中的第一个元素。