Skip to content

Commit 77e365b

Browse files
author
Nolan Woods
committed
Fix JMESPath generator handling
1 parent c17e4a2 commit 77e365b

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

biopython_convert/JMESPathGen.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ def _gen_to_list(self, gen, recurse=False):
4242
:param gen: generator object
4343
:return: list of values returned by generator
4444
"""
45-
gen = self._generators.get(id(gen), gen)
45+
if getattr(gen, '__hash__', None) is not None:
46+
gen = self._generators.get(gen, gen)
4647
if isinstance(gen, types.GeneratorType):
4748
l = list(gen)
48-
self._generators[id(gen)] = l
49+
self._generators[gen] = l
4950
if recurse:
5051
for i in range(len(l)):
5152
if isinstance(l[i], types.GeneratorType):
@@ -57,7 +58,7 @@ def visit(self, node, *args, **kwargs):
5758
# if a visit caused list conversion, get list. Assume that 'value' is args[0].
5859
if len(args) and isinstance(args[0], types.GeneratorType):
5960
args = list(args) #convert from tuple
60-
args[0] = self._generators.get(id(args[0]), args[0])
61+
args[0] = self._generators.get(args[0], args[0])
6162
return super().visit(node, *args, **kwargs)
6263

6364
def visit_field(self, node, value):
@@ -87,7 +88,7 @@ def visit_not_expression(self, node, value):
8788

8889
def visit_filter_projection(self, node, value):
8990
base = self.visit(node['children'][0], value)
90-
if not (isinstance(base, list) or isinstance(base, types.GeneratorType)):
91+
if not isinstance(base, (list, types.GeneratorType, map, filter)):
9192
return None
9293
comparator_node = node['children'][2]
9394
for element in base:
@@ -99,11 +100,11 @@ def visit_filter_projection(self, node, value):
99100

100101
def visit_flatten(self, node, value):
101102
base = self.visit(node['children'][0], value)
102-
if not isinstance(base, list):
103+
if not isinstance(base, (list, types.GeneratorType, map, filter)):
103104
# Can't flatten the object if it's not a list.
104105
return None
105106
for element in base:
106-
if isinstance(element, list):
107+
if isinstance(element, (list, types.GeneratorType, map, filter)):
107108
for subelement in element:
108109
yield subelement
109110
else:

0 commit comments

Comments
 (0)