Чтобы лучше познакомиться с Python, я пытаюсь написать ряд связанных с SQL функций.Один из них должен выполнить запрос и преобразовать результат в именованный кортеж.Соответствующий кусок кода.
from collections import namedtuple, Iterable
import psycopg2.extras
import psycopg2
def tuple_to_named_tuple(tuple, cursor_description) -> list:
rdef = namedtuple('row', ' '.join([x[0] for x in cursor_description]))
return rdef._make(tuple);
def run_query(connection_string, callback_function):
with psycopg2.connect(connection_string) as conn:
with conn.cursor() as cur:
return callback_function(cur);
Код работает, и я могу передать обратный вызов, используя вложенную функцию:
def test_param(value):
def nested_function(cur):
cur.execute("SELECT val from table1 where id =%", (value,));
return tuple_to_named_tuple(cur.fetchone(), cur.description);
val = run_query(CONNECTION_STRING, nested_function);
print(val);
или с несколькими лямбдами, например
def test_param(value):
cb = lambda cur: (cur.execute("SELECT val from table1 where id =%", (value,)), cur);
cb1 = lambda ignore, cur: tuple_to_named_tuple(cur.fetchone(), cur.description);
cb3 = lambda c1: cb1(*cb(c1));
val = run_query(CONNECTION_STRING, cb3);
print(val);
Однако я не могуразберись, как завернуть последнюю в серию обернутую лямбду.Я хочу что-то вроде:
# not working code
lambda_callback = lambda cur :
lambda ignore, cur :
*(cur.execute("SELECT val from table1 where id =%", (value,))[0],
*(cur.execute("SELECT val from table1 where id =%", (value,))[1];
val = run_query(CONNECTION_STRING, lambdas_callback );
Интересно, возможно ли это вообще
Спасибо.