code: def visit_BoolOp(self, node):
      values = list(node.values)
      self.generic_visit(node)
      if any(x != y for x, y in zip(values, node.values)):
          self.update = True
          expr = reduce(
              lambda x, y: ast.BinOp(
                  x, NormalizeIsNone.table[type(node.op)](), y
              ),
              node.values,
          )
          return expr
      else:
          return node
  
file_path: catboost/contrib/python/pythran/pythran/transformations/normalize_is_none.py
imports: from pythran.passmanager import Transformation
  from pythran.analyses import Ancestors
  from pythran.syntax import PythranSyntaxError
  from functools import reduce
  import gast
label_desc: Use image node_id 3 for calling the NormalizeIsNone obj's underlying member method code with example usage: obj.visit_BoolOp(node) and returns: expr, node