2013-06-06 2 views
2

У меня есть filter в Python3, который я применяю с помощью лямбда-функции. Вот моя функция:Python - использовать инструкцию печати/отладки в 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) 

Есть ли способ, что я могу напечатать значение row внутри этой лямбда-функции? Я думаю, мне нужно сделать это так, потому что row находится только в пределах лямбда. Например, были это процедура LISP лямбда, я полагаю, что я мог бы сделать что-то вроде этого:

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. Я просто пытался еще больше проиллюстрировать то, что я пытаюсь сделать.

+0

Вы хотите напечатать все строки , или только те, которые проходят фильтр? –

+0

Я бы хотел напечатать все строки, которые, я думаю, Тим. Я просто хочу взглянуть на эту строку, чтобы убедиться, что моя лямбда-функция отфильтровывает именно то, что ей нужно. Я склоняюсь к тому, чтобы разбить его на другую функцию, как это было предложено ... – Houdini

+1

Но тогда вы также должны добавить что-то к выводу, который сообщает вам, какая строка будет отфильтрована, а какая - нет? –

ответ

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) 
+0

Если вы все еще работаете, я могу запустить код, о котором мы говорили ранее, но заявления печати внутри функции 'filter_plus_print', похоже, не выполняются. т. е. я не вижу вывод в консоли. Любая идея о том, почему? – Houdini

+0

@ Хоудини: Хм. И кроме того, программа работает правильно? Кстати, я просто заметил, что если 'str (row [0] .isdigit())' is 'True', то' row [0] .startswith ("#") 'обязательно должен быть ложным, поэтому вы можете безопасно удалите это условие. –

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

Существует не pythonic способ выполнения нескольких операторов в анонимной функции. Я хотел бы предложить разорвать лямбда выписанный на имя функции, например, так:

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) 
+0

Я использовал это решение, другой парень только что ответил первым и был немного более наглядным. Я поддержал тебя, спасибо, спасибо! – Houdini

0

проблемы является то, что print(row) возвращается None, и вы должны сделать что-то с ним. Довольно неприятно в большинстве случаев.

0

Общего Python 3.x трюка для печати отладочной информации в лямбда без изменения его семантики:

Оригинала:

lambda: 4 

Instrumented:

lambda: (print (3), 4) [1] 
Смежные вопросы