上面的代碼並不「總是給我鑰匙錯誤」(「永遠」被這個詞我在這裏爭論)。例如,請考慮下面的代碼:
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']
也許這是您的應用程序的行爲。這是給你決定的。
請張貼完整的錯誤。 – thegrinner 2013-03-14 20:26:50
你打電話的方法如何?這意味着什麼「當我只使用相同的代碼而不使用函數」? – 2013-03-14 20:27:25
在我看來,你假設'y [col]'將存在,但'y'是常規字典。請改用'y.get(col)== val'。 – 2013-03-14 20:32:25