2013-03-14 73 views
0

我感到困惑的代碼如下:KeyError異常在Python表

class Table(object): 
    def __init__(self): 
     self.d = collections.defaultdict(dict) 
    def add(self, row, col, val): 
     self.d[row][col] = val 
    def get(self, row, col, default=None): 
     return self.d[row].get(col, default) 
    def incol(self, col, val): 
     for x,y in self.d.iteritems(): 
      if y[col]==val: 
       wholerow=y 
     return wholerow.values() 

我創建了表之後,我無法使用「incol」功能讓所有的值。它總是給我關鍵的錯誤。但是,當我使用相同的代碼而不使用函數時,我可以得到我想要的。發生了什麼事我的代碼....

+0

請張貼完整的錯誤。 – thegrinner 2013-03-14 20:26:50

+3

你打電話的方法如何?這意味着什麼「當我只使用相同的代碼而不使用函數」? – 2013-03-14 20:27:25

+4

在我看來,你假設'y [col]'將存在,但'y'是常規字典。請改用'y.get(col)== val'。 – 2013-03-14 20:32:25

回答

0

上面的代碼並不「總是給我鑰匙錯誤」(「永遠」被這個詞我在這裏爭論)。例如,請考慮下面的代碼:

foo = Table() 
foo.add("row_1", "col_1", "col_1_value") 
foo.add("row_1", "col_2", "col_2_value") 
print foo.get("row_1", "col_1") 
print foo.incol("col_1", "col_1_value") 

這工作沒有任何錯誤和輸出如下:

col_1_value 
['col_2_value', 'col_1_value'] 

但是,如果你試圖通過一個不存在的列名incol ,你會得到一個KeyError。例如,如果您將追加下面一行到上面的代碼:

print foo.incol("i do not exist", "my imaginary value") 

你最終將一個錯誤信息類似以下內容:

Traceback (most recent call last): 
File "./stack_overflow-2013-03-14.py", line 21, in <module> 
    print foo.incol("i do not exist", "my imaginary value") 
File "./stack_overflow-2013-03-14.py", line 12, in incol 
    if y[col]==val: 
KeyError: 'i do not exist' 

incol示例實現,可以處理這種情況是:

def incol(self, col, val): 
    result = None 
    for x,y in self.d.iteritems(): 
     if col in y and y[col]==val: 
      result = y.values() 
      break 
    return result 

現在,如果你運行下面幾行:

foo = Table() 
foo.add("row_1", "col_1", "col_1_value") 
foo.add("row_1", "col_2", "col_2_value") 
print foo.get("row_1", "col_1") 
print foo.incol("col_1", "col_1_value") 
print foo.incol("i do not exist", "my imaginary value") 
print foo.incol("i do not exist", None) 

你得到:

col_1_value 
['col_2_value', 'col_1_value'] 
None 
None 

您還可以使用以下實現的incol由馬亭皮特斯的建議:如果你傳遞一個不存在的col

def incol(self, col, val): 
    result = None 
    for x,y in self.d.iteritems(): 
     if y.get(col)==val: 
      result = y.values() 
      break 
    return result 

但在這種情況下,和val = None,那麼它將匹配任何行。相應的輸出將是:

col_1_value 
['col_2_value', 'col_1_value'] 
None 
['col_2_value', 'col_1_value'] 

也許這是您的應用程序的行爲。這是給你決定的。