@@ -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