【发布时间】:2017-07-28 16:26:04
【问题描述】:
我有一个通用的生成器函数,它将分隔字符串映射到从分隔字符串列表中生成 kwargs 类型字典对象的 a。
我想在另一个生成器函数中使用 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 dict(当然,在循环之前对其进行初始化),而不是产生一个每次循环。 -
@jasonharper - 是的,我认为你是对的。这大大简化了事情!我想我在生成器功能上做得太过火了。这是我第一次使用它们...
-
@jasonharper,说,我确实失去了使用生成器的好处,当使用边然后构建图形时,因为我必须提前实现所有的 kwargs 来生成边.我找到了另一种方法来做到这一点,但是我将作为答案发布
标签: python dictionary generator keyword-argument