Чтобы лучше познакомиться с Python, я пытаюсь написать ряд связанных с sql функций. Один из них должен выполнить запрос и преобразовать результат в named tuple. Соответствующий фрагмент кода.
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 );
Интересно, возможно ли это вообще
Благодарю.
Если функция, которую вы пишете, достаточно важна, чтобы иметь несколько операторов, это достаточно важно, чтобы ее можно было определить как правильную функцию.
Вы определяете его так:
def my_important_multistatement_lambda_func(*args, **kwargs):
# TODO