Мое понимание заключается в том, что клетка просматривается в пространстве имен родительских функций, когда вызываемая функция pet_function фактически вызывается, а не раньше.
Итак, когда вы делаете
funs = list(get_petters())
Вы генерируете 3 функции, которые найдут последнюю созданную клетку.
Если вы замените свой последний цикл на:
for name, f in get_petters():
print name + ":",
f()
Фактически вы получите:
cow: Mary pets the cow.
dog: Mary pets the dog.
cat: Mary pets the cat.
У вас есть одинарные кавычки в строке, разделенные одинарными кавычками:
'SELECT * FROM foo WHERE id = '123''
Вам нужно их избежать. IIRC, Postgres использует двойные синглы, чтобы сделать это:
'SELECT * FROM foo WHERE id = ''123'''
Или, возможно, обратный слеш:
'SELECT * FROM foo WHERE id = \'123\''