2017-02-21 3 views
0
TypeError: Object of type 'filter' is not JSON serializable 

Это меня действительно сбивает с толку. (Моя функция «realfiles» просто удостоверяет, что список каталогов не содержит файлов Thumbs.db или .DS_Store, и даже если я уменьшу его до «return True», я получаю ту же ошибку.)Попытка фильтровать список в Python (колбу) и назначить переменной сеанса ... TypeError

I «Не пытаюсь сериализовать фильтр, что бы это ни значило. Я сериализую список, который является выходом этого фильтра. Правильно? Python не мой лучший язык, поэтому я изначально думал, что моя ошибка была попыткой присвоить выход фильтра к переменной сессии в том же линейчатом то, что бы работало хорошо в Javascript-

session['dir_listed_projects'] = filter(realfiles , pList) 
session['dir_listed_templates'] = filter(realfiles , tList) 

поэтому я переписал его присвоить промежуточной переменной:

@app.route('/projects', methods=['GET', 'POST']) 
def projects(): 
    listA = listdir(outta(here, 2) + '/Projects') 
    listB = listdir(outta(here, 2) + '/_Templates') 
    pList = filter(realfiles , listA) 
    tList = filter(realfiles , listB) 
    session['dir_listed_projects'] = pList 
    session['dir_listed_templates'] = tList 
    return render_template('projects.html') 

nope.

TypeError: Object of type 'filter' is not JSON serializable 

Если я не использую фильтр на всех, но назначить выход listdir напрямую, страница будет оказывать без какой-либо ошибки и он работает нормально с фильтра, прежде чем я начал обновление с Python 2. x до 3.x.

+1

В python3 фильтр не возвращает список, кроме объекта фильтра. Преобразуйте это в список, сохраняя его в сеансе. – Wombatz

ответ

2

В Python 3, filter возвращает объект фильтра (итератор), а не список.

filter(lambda x: x == 2, [1, 2, 3]) 
<filter object at 0x7f37049af210> 

Чтобы получить результат в виде списка, используйте функцию list.

list(filter(lambda x: x == 2, [1, 2, 3])) 
[2] 
+0

Просто из любопытства, почему я бы хотел, чтобы объект фильтра вместо отфильтрованного списка? –

+0

Простите этот комментарий еще раз: Объект фильтра похож на генератор, поэтому он намного эффективнее, если вы хотите повторить его позже. См., Например, разницу между диапазоном и xrange в python2. –

Смежные вопросы