[英]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.