Evitar o retrasar la evaluación de cosas que no se pueden usar

¿Cómo se puede lograr una evaluación perezosa en Python? Un par de ejemplos simples:

>>> def foo(x):
...     print(x)
...     return x
... 
>>> random.choice((foo('spam'), foo('eggs')))
spam
eggs
'eggs'

Anterior, realmente no necesitábamos evaluar todos los elementos de esta tupla para elegir uno. Y a continuación, el valor predeterminadofoo() realmente no necesitaba ser calculado a menos que la clave de búsqueda faltara realmente en el dict:

>>> d = {1: "one"}
>>> d.get(2, foo("default"))
default
'default'
>>> d.get(1, foo("default"))
default
'one'

Estoy buscando una forma pitónica de refactorizar ejemplos como el anterior para evaluar perezosamente.

Respuestas a la pregunta(8)

Su respuesta a la pregunta