2016-02-19 64 views
2

我有應與list S和dict的工作函數:處理列表和類型的字典相同的 - 默認

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

,如果rowlist然後md.firstmd.nextint S和IF rowdict,它們將是str

但是,如果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 /簡明的方法來做到這一點?

+0

你沒有在第二種方法中,什麼都可以用'int'? – Kasramvd

+0

您是否也希望處理用戶傳遞整數的情況,但整數超出了列表的範圍?用你最後一個例子(使用'get'),這仍然會產生一個錯誤。 – BrenBarn

+0

@ Kasramvd:是的,索引應該是每個解析的 – sds

回答

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) 
0

根據EAFP的方式,請求原諒比允許更容易。所以,如果你確信你只是處理這兩類型的對象(listdict)作爲更Python的方式,你可以用一個try-except表達:

def row2tuple (row, md): 
    try: 
     return (row[md.first], row[md.next]) 
    except TypeError: 
     return (row.get(md.first), row.get(md.next)) 
0

我認爲你有什麼是好的,但如果你喜歡這裏是一個(永遠)更簡潔的替代方案:

def row2tuple (row, md): 
    method = row.__getitem__ if isinstance(row,list) else row.get 
    return (method(md.first), method(md.next))