如何避免python中过多的if-else块

如何避免python中过多的if-else块,python,django,Python,Django,我编写了一个类,该类检查输入中的4个参数,并在输出中显示结果列表。 这个参数只需要一个,因此我有7个if-else嵌套块。 我想说明所述条件是否正常工作 我在想是否有更聪明的方法来写这个: if cd['subject'] is None: if cd['school'] == '': if cd['price']: files = File.objects.filter(name__contains=cd['name'], price = '0.

我编写了一个类,该类检查输入中的4个参数,并在输出中显示结果列表。 这个参数只需要一个,因此我有7个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})

使用关键字args为调用
filter()
构建一个dict,然后使用
**kwargs
语法传递它。

在内部,传递给函数的关键字参数只是一个
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})

请修复代码缩进;为什么要在比较中混合使用
None
、空字符串
'
和布尔协整(
if
)呢?因为变量来自Django表单,并且是不同的表单字段。我忘了说,条件很好,我想知道是否有更聪明(或者更优雅,如果你可以)的方式来表达同样的话。非常奇怪的
cd['price']
handling这可能更适合。稍微调整一下条件,效果很好。