Python sqlalchemy-处理几个可选过滤器的优雅方式?

Python sqlalchemy-处理几个可选过滤器的优雅方式?,python,mysql,coding-style,sqlalchemy,Python,Mysql,Coding Style,Sqlalchemy,假设我有一个查询方法,它带有几个可选的过滤器。我想要实现的是,如果我将一些not None值传递给过滤器参数,然后执行过滤器,如果过滤器值为None,则忽略它 def get_query_results(filter1=None, filter2=None, ...): res = models.Item.query if filter1 is not None: res = res.filter(filter1=filter1) if filter2 i

假设我有一个查询方法,它带有几个可选的过滤器。我想要实现的是,如果我将一些not None值传递给过滤器参数,然后执行过滤器,如果过滤器值为None,则忽略它

def get_query_results(filter1=None, filter2=None, ...):
    res = models.Item.query
    if filter1 is not None:
        res = res.filter(filter1=filter1)
    if filter2 is not None:
        res = res.filter(filter2=filter2)
    ....
    return res.all()
我想避免的是模式

if XXX:
    res.filter(XXX=XXX)
我想知道是否有更优雅的方式来实现这一点

例如,是否将各种过滤器作为参数传递


或者,我们可以做一些魔术,在筛选值为None时省略筛选?

与您显示的代码完全相同的代码是:

def get_query_results(*filters):
    res = models.Item.query
    for i, filt in enumerate(filters, 1):
        if filt is not None:
            d = {'filter{}'.format(i): filt}
            res = res.filter(**d)
    return res.all()
我不太清楚为什么需要将
res.filter
的命名参数指定为
filter1
filter2
,等等,但是这个代码段可以做到这一点,而不需要重复您想要避免的模式

如果名称不是实际上是
filter1
filter2
等,只要已知所需的名称就可以了:

NAMES = 'foo bar baz bat'.split()

def get_query_results(*filters):
    res = models.Item.query
    for name, filt in zip(NAMES, filters):
        if filt is not None:
            d = {name: filt}
            res = res.filter(**d)
    return res.all()
在这种情况下,此变体将起作用