2012-03-18 17 views

Respuesta

17

Como en cualquier llamada de función, los argumentos se evalúan antes de que se ejecute la llamada.
En este caso no es una excepción dict.get() ...

+2

+1 - zen de Python: "Los casos especiales no son lo suficientemente especiales como para romper las reglas". – Sake

+0

+1 zen de pitón – Doboy

+0

Esta debería ser la respuesta aceptada. –

3

Debido a que usted está evaluando, y luego pasa como argumento a get. Esto sucede ya sea que get termine usando el argumento.

0
  1. a[key] es a['foo'] y que no tienen esa clave en a.
  2. Esto se evalúa antes de llamar b.get por lo tanto, el error
  3. "incluso si la clave está en el diccionario" - que es anot cierto, b está vacía (pero como los 2. Los puntos de muestra, esto no es relevante)
6

puede volver a escribir el ejemplo que dio como

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

para evitar la excepción. Esto devolverá None si la clave no está en ninguno de los diccionarios. Más en general, si se quiere evitar la evaluación del segundo argumento, podría utilizar

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

uso este lugar

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

or y and son los operadores de corto circuito, por lo que si b tiene la llave se no mirará al a. Pero surgirán problemas si tiene falsy valores en b. Si ese es el caso, se puede hacer ..

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

Para evitar las operaciones de búsqueda, usted podría:

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

O si None se permite entonces:

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

que pasa si en '# ...', el usuario hace 'b [not_set] = 1'. {trollface} – Doboy

+0

@Doboy: no pasa nada. 'not_set' es un valor especial, no clave. – jfs

+0

quiero decir .. 'b [1] = not_set' – Doboy

Cuestiones relacionadas