2013-12-23 32 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语法传递。