2017-06-19 94 views
0

我有一個任務列表,我試圖選擇具有給定ID的所有任務。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')是正確的,而第二個任務具有ID 2。那麼爲什麼這不起作用呢?

+8

是否有'2'或''2''? (一個字符串?) –

+0

提供一些關於誰是「請求」的代碼,重要的是什麼類型的id。 –

+0

@WillemVanOnsem哦,那可能吧! request.args是url參數。所以我從這個URL獲得ID:http://.../api/v1.0/tasks?id = 2。 –

回答

2

request.args,該id是一個字符串,並在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]

或者,y OU可以 - 像你說的自己 - 提供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]
+0

我用'request.args.get('id',type = int)',但基本上我也這麼想。我覺得它看起來更好。是否有理由在'.get('id',type = int)''上使用'int(...)'? –

+0

@TheOddler:完全沒有。我認爲這確實是一種更優雅的方式。我已經更新了答案。感謝您的反饋。 –

1

您沒有指定用於提供請求對象的框架,但很有可能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] 
相關問題