Python - Почему это понимание списка возвращает пустой список?

У меня есть список задач, и я пытаюсь выбрать все задачи с заданным идентификатором.

# temp global tasks list
tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web',
        'done': False
    }
]

# here I try to select some tasks. 'request.args.get('id')' is 2 in my test
selectedTasks = tasks

if 'id' in request.args:
    selectedTasks = [task for task in selectedTasks if task['id'] == request.args.get('id')]

Если я запущу это, selectedTasks пустой. Однако я не понимаю, почему.

Я попытался напечатать некоторые значения:

# just before the list comprehension
print(selectedTasks, file=sys.stderr)
print(request.args.get('id'), file=sys.stderr)
print(selectedTasks[1]['id'], file=sys.stderr)

Это печатает:

[{'id': 1, 'title': 'Buy groceries', 'description': 'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False}, {'id': 2, 'title': 'Learn Python', 'description': 'Need to find a good Python tutorial on the web', 'done': False}]
2
2

Так что все задачи есть, request.args.get('id') правильно, а вторая задача имеет идентификатор 2, Так почему это не работает?

2 ответа

Решение

В request.args, id это строка, а в Python-3.x, 2 не равно '2':

>>> 2 == '2'
False

Таким образом, мы можем просто преобразовать строку в int(..)и решить это как:

if 'id' in request.args:
    the_id = int(request.args.get('id'))
    selectedTasks = [task for task in selectedTasks if task['id'] == the_id]

Или вы можете - как вы говорите сами - предоставить type параметр к .get() способ сделать преобразование в .get() уровень:

if 'id' in request.args:
    the_id = request.args.get('id',type=int)
    selectedTasks = [task for task in selectedTasks if task['id'] == the_id]

Вы не указываете, какую платформу вы используете для предоставления объекта запроса, но весьма вероятно, что request.args вернет список строк. Вы должны попытаться привести аргумент запроса к типу int.

if 'id' in request.args:
    task_id = request.args.get('id')
    assert task_id.isdigit()
    task_id = int(task_id)
    selectedTasks = [task for task in selectedTasks if task['id'] == task_id]
Другие вопросы по тегам