2009-01-30 40 views
3

當然有更好的方法來做到這一點?重構這個Python代碼來遍歷容器

results = [] 
if not queryset is None: 
    for obj in queryset: 
     results.append((getattr(obj,field.attname),obj.pk)) 

問題是,有時queryset是None,當我嘗試迭代它時會導致異常。在這種情況下,我只想將結果設置爲空列表。這段代碼來自Django視圖,但我認爲不重要 - 這看起來像是一個更一般的Python問題。

編輯:我發現它是我的代碼將一個空的查詢集變成了一個「無」,而不是返回一個空列表。能夠假定queryset始終可迭代,通過允許刪除「if」語句來簡化代碼。以下答案可能對其他具有相同問題的人有用,但不能修改其代碼以保證queryset不是「無」。

+0

沒有什麼可這個被改進 - 如圖所示。如果你可以解釋爲什麼「有時」queryset是None,那麼也許我們可以幫忙。 – 2009-01-30 12:05:20

+0

最後一行有錯字嗎? append需要一個參數,並且關閉和開放括號的數量不相互對應。 – SilentGhost 2009-01-30 12:07:56

+0

是的,修正了錯字。查詢集是從數據庫搜索中設置的,如果沒有結果,它似乎被設置爲無。 – user27478 2009-01-30 12:12:29

回答

19
results = [(getattr(obj, field.attname), obj.pk) for obj in queryset or []] 
1

你可以使用列表解析,但除此之外,我不認爲你可以改進的地方

result = [] 
if queryset: 
    result = [(getattr(obj, field.attname), obj.pk) for obj in queryset] 
8

它如何

for obj in (queryset or []): 
    # Do your stuff 

相同JF塞巴斯蒂安建議,只是沒有作爲列表理解來實現。

2

對於什麼是值得的,Django管理器有一個「none」查詢集,您可以使用它來避免無謂的未檢查。使用它來確保你沒有空的查詢集可能會簡化你的代碼。

if queryset is None: 
    queryset = MyModel.objects.none() 

參考文獻: