上記のコードは、「常にキー エラーが発生する」わけではありません (「常に」とは、ここで論争している言葉です)。たとえば、次のコードを考えてみましょう。
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']
おそらく、これはアプリケーションに必要な動作です。それはあなたが決めることです。