【问题标题】:Working around lambda limitation in python解决 python 中的 lambda 限制
【发布时间】:2018-10-18 20:30:59
【问题描述】:

为了更加熟悉 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);

或使用多个 lambda,例如

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);

但是,我无法弄清楚如何将后者包装成一系列包装的 lambda。我想要类似的东西:

     # 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 );

我想知道这是否可能

谢谢。

【问题讨论】:

  • 如果你分配给一个 lambda 函数,你可能做错了,他们应该保持匿名
  • 嗯,我知道它看起来很难看。这就是我要问的原因 - 我想要具有多个语句的匿名函数。这似乎可以用嵌套的 lambda 来模拟。
  • 我对你正在使用的模块不是很熟悉,但总的来说我会说坚持第一个想法,它感觉更具可读性和pythonic(顺便说一句,你不需要分号@ 987654325@ 在行尾)
  • lambda 背后的想法是替换非常简单的一行简单函数,仅此而已。如果您定义一个正常的功能来完成这项工作,您将不会丢失任何东西。这样做的积极方面是,您将有能力对其进行测试。

标签: python python-3.x lambda psycopg2


【解决方案1】:

如果您编写的函数足够重要,可以包含多个语句,那么它就足够重要,可以定义为适当的函数。

你这样定义它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多