class_docstr: CoreML internal representation of a torch IR node.
  Can construct itself from a provided torchIR node or manually constructed with
  args for testing.
  
  See InternalTorchIRGraph for the motivation behind this structure.
  
      Arguments:
          node: The torch._C.Node to convert, or None.
          parent: The InternalTorchIRGraph/Block this node belongs to.
          attr: If @node is not specified, the dict of named attributes.
          inputs: If @node is not specified, the list of input symbols.
          outputs: If @node is not specified, the list of output symbols.
          kind: If @node is not specified, the kind (op) of the node.
          blocks: If @node is not specified, the list of InternalTorchIRBlock.
code: def __init__(
      self,
      node=None,
      parent=None,
      attr=None,
      inputs=None,
      outputs=None,
      kind=None,
      blocks=None,
  ):
      self.parent = parent
      if node:
          self.inputs = [_input.debugName() for _input in node.inputs()]
          self.outputs = [
              output.debugName() for output in node.outputs()
          ]
          self.kind = node.kind().split("::")[-1].lower()
          self.blocks = [
              InternalTorchIRBlock(raw_block=b, parent=self)
              for b in node.blocks()
          ]
          self.attr = {
              name: getattr(node, node.kindOf(name))(name)
              for name in node.attributeNames()
          }
          if "value" not in self.attr:
              self.attr["value"] = None
          # If the output is boolean, explicitly cast it so type inference
          # will work correctly.
          if (
              len(self.outputs) == 1
              and next(node.outputs()).type().str() == "bool"
          ):
              self.attr["value"] = bool(self.attr["value"])
      else:
          self.inputs = inputs
          self.outputs = outputs
          self.kind = kind
          self.blocks = blocks if blocks is not None else []
          self.attr = attr if attr is not None else {"value": None}
      # On rare occassions, a node has no outputs. In that case, the node's
      # name will be its kind. However, this no longer guarantees the node's
      # name is unique. It will be up to the graph constructing the node to
      # make sure names are unique.
      self.name = (
          self.outputs[0] if len(self.outputs) > 0 else self.kind
      )
  
imports: from collections import OrderedDict
  from itertools import islice
  import torch
label_desc: Use image node_id 1 to create a new InternalTorchIRNode object  with example: obj = InternalTorchIRNode(node, parent, attr, inputs, outputs, kind, blocks)