我有一个广义生成器函数,它将分隔字符串映射到从分隔字符串列表中产生kwargs类型的字典对象。为函数生成kwargs映射的生成器对象
我想在另一个生成器函数中使用kwargs类型的字典作为参数。但是,我得到的消息
edge_generator()争吵后**必须是一个映射,而不是发电机
这里是我的电流,断码:
def line_from_file_generator(file_name):
with open(file_name) as text_file:
for line in text_file:
yield line
def map_delimited_lines_to_kwargs(lines, delimiter, kwarg_index_map):
for line in lines:
kwargs = {}
args = line.strip().split(delimiter)
for kwarg, index in kwarg_index_map.items():
kwargs[kwarg] = args[index]
yield kwargs
def edge_generator(source_node_name, destination_node_name, weights):
for line in lines:
yield Edge(source_node_name, destination_node_name, weights)
lines = line_from_file_generator('mit_map.txt')
kwarg_index_map = {'source_node_name': 0, 'destination_node_name': 1, 'weights': 2}
kwarg_collection = map_delimited_lines_to_kwargs(lines, ' ', kwarg_index_map)
edges = edge_generator(**kwargs_collection)
我现在明白了为什么这是错误的(一个生成器是一种序列,而不是映射(可以扩展的字典))。
我可以绕过这个,同时保持我创建的抽象?代码是什么?我试过把最后一行改为下面的代码,但是它不能遍历kwargs生成器,并且所有的边都是用相同的参数生成的。
edges = edge_generator(**kwarg_collection.next())
乍一看,你的'map_delimited_lines_to_kwargs()'应该简单*收益*单kwargs字典的循环之后(和循环之前进行初始化,当然),而不是通过每一次循环中产生一个。 – jasonharper
@jasonharper - 是的,我认为你是对的。这简化了很多事情!我想我用发电机功能过度了。这是我第一次使用它们...... – Jinglesting
@jasonharper,说,当使用边缘然后建立一个图形时,我确实丧失了使用生成器的好处,因为我必须实现所有的kwargs来生成边缘的时间。我找到了另一种方法来做到这一点,我将作为答案发布 – Jinglesting