2013-12-23 38 views
3

我寫了一個類,它檢查輸入中的4個參數,並在輸出中顯示一個結果列表。 只有一個這個參數是必需的,因此我有7個if - else嵌套塊。 我想指定所述的條件正常工作。如何避免python中的if-else塊太多

,我很困惑,如果有寫這一個更聰明的辦法:

if cd['subject'] is None: 
    if cd['school'] == '': 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name']) 
    else: 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school']) 
else: 
    if cd['school'] == '': 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], subject = cd['subject'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], subject = cd['subject']) 
    else: 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], subject = cd['subject'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], subject = cd['subject']) 
return render(request, 'search.html', {'files': files, 'request': request}) 
+0

請修復您的代碼縮進;爲什麼混合'None',空字符串''''和布爾coersion('如果')在比較? – alko

+0

因爲變量來自Django表單並且是不同的表單字段。 我忘了說,條件工作得很好,我想知道是否有一個更聰明(或更優雅,如果你可能)的方式說同樣的事情。 – Higure

+0

非常奇怪'cd ['price']'處理 – alko

回答

6

在內部,您傳遞給函數的關鍵字參數只是dict。因此,自己構建並使用**name語法將它傳遞給函數:

args = {} 

args['name__contains'] = cd['name'] 

if cd['subject'] is not None: 
    args['subject'] = cd['subject'] 
if cd['school'] != '': 
    args['school'] = cd['school'] 
if cd['price']: 
    args['price'] = cd['price'] 

files = File.objects.filter(**args) 
return render(request, 'search.html', {'files': files, 'request': request}) 
+0

您的if語句代碼與OP – alko

+0

有所不同。調整了一些條件並像魅力一樣工作。 – Higure

0

建立與您的來電filter()關鍵字ARGS的字典,然後使用**kwargs語法傳遞。