上面的代码并不“总是给我钥匙错误”(“永远”被这个词我在这里争论)。例如,请考虑下面的代码:
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