上面的代码不是“总是给我关键错误”(“总是”是我在这里争论的词)。例如,考虑以下代码:
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
Martijn Pieters 的建议使用以下实现:
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
但是在这种情况下,如果您传递一个不存在的col
名称和val
= None
,那么它将匹配任何行。相应的输出将是:
col_1_value
['col_2_value', 'col_1_value']
None
['col_2_value', 'col_1_value']
也许这是您希望应用程序的行为。那是你来决定的。