繁体   English   中英

如何使用python可迭代执行灵活的搜索生成器?

[英]How can I use python iterable to perform flexible search generators?

编辑:事实证明这不是一个大问题。 当我或多或少地输入此内容时,我设法使其正常工作。

我有一个在线csv表数据库,可以使用cgi脚本进行查询。 该脚本可以采用几个可选的过滤器参数,但是添加一个新的过滤器意味着我必须将if语句加倍。

例如:

records = list()
with open (csv_datafile, 'r') as data: 
    data_reader = csv.DictReader(data, fieldnames=DATA_FIELDS)
    if product is None:
        records.extend(record for record in data_reader if id_start < record['id'] <= id_end)
    else:
        records.extend(record for record in data_reader if id_start < record['id'] <= id_end and record['code'] == product)

您会看到,如果添加其他搜索条件,则此模式会崩溃,因为我必须在上述每个if子句中嵌套多余的if。

有没有办法使用迭代器执行此操作? 我的想法是:

def data_search(iterator, **search)
    for item in iterable:
        yield_me=True
        for key in item.viewkeys() & search:
            if item[key] is not None:
                if item[key] != search[key]:
                    yeild_me=False
        if yield_me:
            yield item

然后,要集成的代码将类似于:

search = dict()
if product_search:
    search['code'] = product

if vendor_search:
    search['vendor'] = vendor

records = list()
with open (csv_datafile, 'r') as data: 
    data_reader = csv.DictReader(data, fieldnames=DATA_FIELDS)
    data_reader = data_search(data_reader, **search)
    records.extend(record for record in data_reader if id_start < record['id'] <= id_end)

我应该继续坚持下去,还是有更好的方法?

我认为您不需要生成器。 我认为您在建立搜索条件上走了正确的路(尽管如果您可以将它们作为名称/值对传递到更易于使用的字典中),但执行起来可能更简单。

with open(csv_datafile, 'r') as data:
    data_reader = csv.DictReader(data, fieldnames=DATA_FIELDS)
    records = [record for record in data_reader if all(record.get(filter_key) == filter_value for (filter_key, filter_value) in search.iteritems()) and id_start < record['id'] <= id_end]

如果愿意,可以使用filter来表达不同的表达式,为了清晰passes_search_filters ,我可以制作一个passes_search_filters帮助器函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM