Python - 在Lambda中使用print / debug语句

时间:2013-06-06 17:57:08

标签: python filter lambda

我在Python3中有一个filter,我正在使用lambda函数。这是我的功能:

affy_reader = csv.DictReader(filter(lambda row:
                                    not row[0].startswith('#') and
                                    str(row[0]).isdigit(),
                                    file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

有没有办法可以在这个lambda函数中打印row的值?我想我需要这样做,因为row仅限于lambda中。例如,这是一个LISP Lambda程序,我相信我可以这样做:

affy_reader = csv.DictReader(filter(lambda row: print(row) 
                                    not row[0].startswith('#') and
                                    str(row[0]).isdigit(),
                                    file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

因为print()被读取并在线执行。 Python中有没有办法做到这一点?或者如果没有,我看到这个价值的好方法是什么?谢谢!

*我意识到我的“LISP”示例是Python而不是LISP。我只是想进一步说明我想做的事情。

5 个答案:

答案 0 :(得分:3)

我认为你不能用lambda做到这一点。只需定义一个辅助函数。这样,您还可以显示是否要过滤某一行:

def filter_plus_print(row):
    result = not row[0].startswith('#') and str(row[0]).isdigit()
    print("Keeping:" if result else "Removing:", row)
    return result

然后再做

affy_reader = csv.DictReader(filter(filter_plus_print, file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

答案 1 :(得分:2)

一般Python 3.x技巧在lambda中打印调试信息而不改变其语义:

原件:

lambda: 4

仪器化:

lambda: (print (3), 4) [1]

答案 2 :(得分:0)

您可以直接打印file_pointer来查看print(file_pointer) affy_reader = csv.DictReader(filter(lambda row: not row[0].startswith('#') and str(row[0]).isdigit(), file_pointer), delimiter='\t', fieldnames=affy_column_headers) 内的值。

{{1}}

答案 3 :(得分:0)

在匿名函数中执行多个语句没有pythonic方法。我建议将lambda分解为命名函数,如下所示:

def relevant(row):
    print(row)
    return not row[0].startswith('#') and str(row[0]).isdigit()

affy_reader = csv.DictReader(filter(relevant, file_pointer), 
                             delimiter='\t',
                             fieldnames=affy_column_headers)

答案 4 :(得分:0)

问题是print(row)返回None,你必须对它做点什么。在大多数情况下相当不愉快。