¿Python tiene un operador definido o como Perl?

En Perl puedo hacer algo como esto:

foo = a // b; 

Lo que me pregunto es si Python tiene algo similar a esto. He intentado lo siguiente, pero obviamente no funciona:

 foo = {'key1':'val1','key2':'val2'} bar = foo['doesntexist'] or foo['key1'] 

Y me sale el error:

 KeyError: 'doesntexist' 

No necesitas el or para nada:

 bar = foo.get('doesntexist', foo['key1']) 

La razón por la que su método no funciona es porque Python genera un error antes de poder evaluar su expresión booleana. En lugar de simplemente indexar el diccionario, necesita usar .get() lugar. En lugar de generar un error, .get() devuelve None que permite que su expresión se evalúe correctamente:

 bar = foo.get('doesntexist') or foo.get('key1') 

Tenga en cuenta que si el valor de la primera clave es 0 o cualquier otro valor que se evalúe como falso, su método fallará. Si esto está bien con usted, utilice el método anterior.

Sin embargo, si no desea tener el comportamiento descrito anteriormente, debe probar si el primer valor es None . En este punto, sin embargo, sería mejor simplemente extraer esta lógica a una función separada:

 def get_key(d, test_key, default_key): """ Given a dictionary(d), return the value of test_key. If test_key does not exists, return the default_key instead. """ if d.get(test_key) is not None: return d.get(test_key) return d.get(default_key) 

Que se puede utilizar como tal:

 foo = {'key1':'val1','key2':'val2'} bar = get_key(foo, 'doesntexist', 'key1')