2012-03-18 12 views

答えて

17

コールが実行される前に、引数が評価されます。
この場合、dict.get()も例外ではありません...

+2

1 - の禅Python: "特別なケースは、ルールを破るほど特別ではありません。" – Sake

+0

+1 zen of python – Doboy

+0

これは受け入れられる回答である必要があります。 –

3

これを評価しているので、それをgetの引数として渡します。これは、getが引数を使用するかどうかにかかわらず発生します。

0
  1. a[key]a['foo']であり、あなたがaでその鍵を持っていません。
  2. これは「キーが辞書にある場合でも、」エラー
  3. ので、b.getを呼び出す前に評価される - それはanot本当だ、bが空である(ただし、2ポイントが示すように、これは関係ありません)
6

あなたは例外を回避するために

b.get(key, a.get(key)) 

として与えた例を書き換えることができます。キーがどちらの辞書にもない場合はNoneを返します。あなたは第二引数の評価を避けたい場合はより一般的に、あなたは

try: 
    x = b[key] 
except KeyError: 
    x = a[key] # or whatever the default value is supposed to be 
5

使用この代わりに

x = b.get(key) or a.get(key) 

orandを使用することができ、短絡演算子であるので、bは、鍵を持っている場合見ることはありませんa。しかし、falsyの値がbの場合、問題が発生します。それはあなたが可能性のルックアップを避けるために...

x = b[key] if key in b else b.get(a) 
1

を行うことができそうである場合:

value = b.get(key) 
if value is None: 
    value = a[key] 

場合やNoneをその後、許可されている:

not_set = object() 
# ... 
value = b.get(key, not_set) 
if value is not_set: 
    value = a[key] 
+0

'#...'であれば、ユーザは 'b [not_set] = 1'を実行します。 {trollface} – Doboy

+0

@Doboy:何も起こりません。 'not_set'はキーではなく特別な値です。 – jfs

+0

つまり、 'b [1] = not_set' – Doboy

関連する問題