2013-03-14 161 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'] 

也许这是您的应用程序的行为。这是给你决定的。