class_docstr: Transforms list comprehension into intrinsics.
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse("def foo(y) : return (x for x in y)")
  >>> pm = passmanager.PassManager("test")
  >>> _, node = pm.apply(ComprehensionPatterns, node)
  >>> 'map' in pm.dump(backend.Python, node)
  True
  
  >>> node = ast.parse("def foo(y) : return [0 for _ in builtins.range(y)]")
  >>> _, node = pm.apply(ComprehensionPatterns, node)
  >>> print(pm.dump(backend.Python, node))
  def foo(y):
      return ([0] * builtins.len(builtins.range(y)))
code: def make_Iterator(self, gen):
      if gen.ifs:
          ldFilter = ast.Lambda(
              ast.arguments(
                  [ast.Name(gen.target.id, ast.Param(), None, None)],
                  [],
                  None,
                  [],
                  [],
                  None,
                  [],
              ),
              ast.BoolOp(ast.And(), gen.ifs)
              if len(gen.ifs) > 1
              else gen.ifs[0],
          )
          ifilterName = ast.Attribute(
              value=ast.Name(
                  id="builtins",
                  ctx=ast.Load(),
                  annotation=None,
                  type_comment=None,
              ),
              attr="filter",
              ctx=ast.Load(),
          )
          return ast.Call(ifilterName, [ldFilter, gen.iter], [])
      else:
          return gen.iter
  
file_path: pythran/pythran/optimizations/comprehension_patterns.py
imports: from pythran.analyses import OptimizableComprehension
  from pythran.passmanager import Transformation
  from pythran.transformations.normalize_tuples import ConvertToTuple
  from pythran.conversion import mangle
  from pythran.utils import attr_to_path, path_to_attr
  import gast
label_desc: Use image node_id 3 for calling the ComprehensionPatterns obj's underlying member method code with example usage: obj.make_Iterator(gen) and returns: ast, gen