Обойти ограничение лямбда в питоне

1

Чтобы лучше познакомиться с 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 );

Интересно, возможно ли это вообще

Благодарю.

  • 0
    Если вы назначаете лямбда-функцию, вы, вероятно, делаете это неправильно, они должны оставаться анонимными
  • 0
    Хм, я знаю, это выглядит ужасно. Вот почему я спрашиваю - я хочу анонимную функцию, которая имеет более одного утверждения. Кажется, что возможно подражать вложенным лямбдам.
Показать ещё 2 комментария
Теги:
python-3.x
psycopg2
lambda

1 ответ

0

Если функция, которую вы пишете, достаточно важна, чтобы иметь несколько операторов, это достаточно важно, чтобы ее можно было определить как правильную функцию.

Вы определяете его так:

def my_important_multistatement_lambda_func(*args, **kwargs):
    # TODO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню