2016-03-31 10 views
2

getメソッドでは、デフォルトの関数に例外がある場合、コントロールは常にキーの有無にかかわらずデフォルト関数に移動します辞書。同じことを示すコードブロックを次に示します。次のように
コンパイラの詳細は次のとおり のPython 2.7.6(デフォルト、2015年4月8日、11時18分18秒) [GCC 4.7.2] linux2にPython:Dict getメソッドは、デフォルトが例外をスローする関数に設定されている場合は常に例外をスローします

abc = 1 
bcd = 2 
class a(object): 
    def test1(self): 
     alphaNumMap = { 
        'a':abc, 
        'b':bcd 
        } 
     num = alphaNumMap.get("a", self.add()) 
     print num 


    def add(self): 
     print "add called " 
     raise Exception 

if __name__ == "__main__": 
    A = a() 
    A.test1() 

上記のコードの出力は、以下であります:

add called 
Traceback (most recent call last): 
File "test2.py", line 19, in <module> 
A.test1() 
File "test2.py", line 10, in test1 
ipXpath = alphaNumMap.get("a",self.add()) 
File "test2.py", line 15, in add 
raise Exception 
Exception 

'

答えて

1

.get alphaNumMap辞書に存在しているにかかわらず、キーが見つかったかどうか、最初のデフォルト値を評価またはNするので予想される出力は、1であるがot。これを回避するには、x=d.get(key)、次にif x is None: do stuffのようにします。

.getは、ちょうど辞書に属している単なる別の機能です。 Pythonの他の関数と同様に、関数が実行される前にすべての引数を評価する必要があります。これらの引数の1つがself.add()であり、評価が終わると例外がスローされます。例えば

​​
+1

そのまま残っありますそのように行動する理由は? –

+0

はい、詳細を追加@RobertMoskal – Bahrom

+0

したがって、getメソッドではデフォルトで関数呼び出しを行うことはできません。パラメータの評価はメソッドの評価を行う前に行われるためです。 @ABH – Arpitha

2

確かに、それは例外が発生します。 (あなたのケースでは、alphaNumMap.get("a",self.add())

どれ関数呼び出しは、まず、前には機能に制御を渡すために、すべての引数を評価することがあります。したがって、add()が呼び出され、例外が発生し、get()がまったく呼び出されません。

最も簡単な方法は、デフォルト(例外)の値を代入し、それをチェックするために、次のようになります。

ipXpath = alphaNumMap.get("a", None) # instead of None there could be 
if ipXpath is None:     # An_exceptional_value_specific_to_your_program 
    ipXpath = self.add() 

式(oneliner)短くすることができるが、全体的なアイデアは

+1

'add()'関数がインタープリタによって呼び出される'get'の引数を準備し、' get'は例外が発生する前に実行を開始しません。トレースバックでこれを見ることができます。 'get1'から' add'へと 'get'のフレームのことはまったくありません。 – Blckknght

関連する問題