2016-03-24 7 views
1
self.dictionary.get(tuple_row_column, self.raiseError()) 
  1. 手動でエラーが発生するメソッドを定義せずにエラーを上げる方法はありますか?
  2. 辞書にキーが含まれていても、self.raiseError()メソッドが呼び出されます。何故ですか?

答えて

1

.getは、欠落しているキーの場合に何を返すかを知る必要があるため、最初にデフォルトパラメータを評価するためです。コメントに指摘されているように、もしあなたの辞書に、False(空文字列、0、False、[]等)と評価されるブール値があれば、このアプローチはエラーself.dictionary.get(tuple_row_column) or self.raiseError()を発生させます。いずれにしても、キーが見つからない場合にエラーを発生させたい場合は、ブラケットルックアップをもっとpythonにする必要があります。あなたの最初の質問については

あなたはそれがあなたのエラーが発生する場合は、単に

self.dictionary[tuple_row_column] # Raises KeyError if tuple_row_column not present in dictionary keys. 

を行うことができ、あなたが言うことができる:

try: 
    self.dictionary[tuple_row_column] 
except KeyError: 
    self.raiseError() 
+1

booleanコンテキストで値が 'False'の場合、' self.dictionary.get(tuple_row_column)またはself.raiseError() 'は機能しません。 – niemmi

+0

@niemmi、優れた点、それをキャッチするための感謝! – Bahrom

+0

私は制御フローの例外を使うことは嫌になる傾向があると思います。 –

2

のPythonを厳密に評価され、意味すべてのこと関数呼び出しの引数はの前に評価され、関数が呼び出されます。だから、self.raiseError()は、それが必要であるかどうかにかかわらず、必ず実行されます(これには制限がない非厳格な言語や "怠惰な"言語とは対照的です)。

あなたはgetの代わりに添字を使用する場合:

self.dictionary[tuple_row_column] 

をマッピングができない場合は、これはKeyErrorが発生します。