以相同方式处理列表和字典 - 使用默认

时间:2016-02-19 19:57:34

标签: python python-2.7

我有一个适用于listdict的函数:

def row2tuple (row, md):
    return (row[md.first], row[md.next])

如果rowlist,那么md.firstmd.next将是int,如果rowdict },它们将是str ings。

但是,如果rowdict并且字段丢失,则会导致错误。如果我使用get方法:

def row2tuple (row, md):
    return (row.get(md.first), row.get(md.next))

它完全符合我对dict的要求,但它对list s根本不起作用。

我当然可以做到

def row2tuple (row, md):
    if isinstance(row,list):
        return (row[md.first], row[md.next])
    return (row.get(md.first), row.get(md.next))

但它看起来很难看。

有更多的pythonic /简明方法吗?

3 个答案:

答案 0 :(得分:1)

写一个"安全查找"函数如this question中所述,并使用它来进行查找。知道LookupErrorKeyErrorValueError的超类是很有用的,因此您可以通过捕获LookupError来捕获列表或字典上的缺失索引:

def safeLookup(container, index):
    try:
        return container[index]
    except LookupError:
        return None

def makeTuple(container, indices):
    return tuple(safeLookup(container, index) for index in indices)

然后:

>>> makeTuple([1, 2, 3], [0, 2, 4])
(1, 3, None)
>>> makeTuple({'x': 1, 'y': 2, 'z': 3}, ['x', 'z', 'hoohah'])
(1, 3, None)

答案 1 :(得分:0)

根据perms方式,请求宽恕比获得更容易。因此,如果您确定只是处理这两种类型的对象(EAFPlist)作为更加pythonic的方式,则可以使用dict表达式:

try-except

答案 2 :(得分:0)

我认为你所拥有的是好的,但如果你喜欢这里是一个(通常如此)更简洁的选择:

rails new projectName