我遇到了一个问题,我试图将字典返回给调用者,并将返回的生成器强制转换为列表,但当我打印event_list
时,它仍然声明它是生成器对象。
我的目标是通过一个文件列表来多处理一个函数,这些文件将创建一个本地字典,并将所述字典返回给调用者,这样我就可以制作一个包含该方法返回的字典的列表。不完全确定我哪里错了。
import multiprocessing as mp
import json
class Events(object):
def __init__(self):
self._parse_events()
def _parse_events(self):
my_list = ['file1', 'file2', 'file3']
event_results = list()
with mp.Pool() as pool:
results = list(pool.map(self._get_event, my_list))
for result in results:
event_results.append(result)
print(event_results) # <------- this somehow returns a generator although I thought i casted the return to a list
print(sum(event_results, [])) # <--------- this doesn't work now that im dealing with a generator rather than the original list
def _get_event(self, filename):
key_identifier = 'role'
with open(filename, 'r') as data:
for line in data:
if key_identifier in line:
temp_dict = dict()
try:
contents = json.loads(line)
temp_dict['UTC'] = contents.get('utc', 'None')
temp_dict['ServiceID'] = contents[key_identifier].get('ServiceID', 'None')
except (KeyError, ValueError):
continue
if temp_dict: yield temp_dict
您的代码正在创建生成器列表。这不是顶级对象的类型不正确,而是内部值,而你根本没有铸造这些值。这可能是您想要的,因为您目前有一个几乎毫无意义的额外循环,您可以将生成器对象从results
移动到event_results
,而不需要对它们做任何其他操作。
您可以更改该循环,将内部值放入列表中:
for result in results:
event_results.extend(result) # extend consumes an iterable
或者,如果你想要一个列表列表,而不仅仅是一个单一的平面列表,你可以这样做:
for result in results:
event_results.append(list(result)) # convert each generator into a list