class_docstr: Interface definition for `Op` subclasses compiled by `CLinker`.
class_docstr_tok: ["Interface","definition","for","`","Op","`","subclasses","compiled","by","`","CLinker","`","."]
docstr: Return C code to run after :meth:`CLinkerOp.c_code`, whether it failed or not.
  
  This is a convenient place to clean up things allocated by :meth:`CLinkerOp.c_code`.
  
  Parameters
  ----------
  node : Apply
      WRITEME
  name : str
      A name that is automatically assigned and guaranteed to be
      unique.
  inputs : list of str
      There is a string for each input of the function, and the
      string is the name of a C variable pointing to that input.
      The type of the variable depends on the declared type of
      the input. There is a corresponding Python variable that
      can be accessed by prepending ``"py_"`` to the name in the
      list.
  outputs : list of str
      Each string is the name of a C variable corresponding to
      one of the outputs of the `Op`. The type depends on the
      declared type of the output. There is a corresponding
      Python variable that can be accessed by prepending ``"py_"`` to
      the name in the list.
  sub : dict of str
      Extra symbols defined in `CLinker` sub symbols (such as ``'fail'``).
code: def c_code_cleanup(
      self,
      node: Apply,
      name: str,
      inputs: list[str],
      outputs: list[str],
      sub: dict[str, str],
  ) -> str:
      """Return C code to run after :meth:`CLinkerOp.c_code`, whether it failed or not.
  
      This is a convenient place to clean up things allocated by :meth:`CLinkerOp.c_code`.
  
      Parameters
      ----------
      node : Apply
          WRITEME
      name : str
          A name that is automatically assigned and guaranteed to be
          unique.
      inputs : list of str
          There is a string for each input of the function, and the
          string is the name of a C variable pointing to that input.
          The type of the variable depends on the declared type of
          the input. There is a corresponding Python variable that
          can be accessed by prepending ``"py_"`` to the name in the
          list.
      outputs : list of str
          Each string is the name of a C variable corresponding to
          one of the outputs of the `Op`. The type depends on the
          declared type of the output. There is a corresponding
          Python variable that can be accessed by prepending ``"py_"`` to
          the name in the list.
      sub : dict of str
          Extra symbols defined in `CLinker` sub symbols (such as ``'fail'``).
  
      """
      return ""
  
imports: import typing
  import warnings
  from abc import abstractmethod
  from typing import Callable, Optional
  from pytensor.graph.basic import Apply, Constant
  from pytensor.graph.utils import MethodNotDefined
label_desc: Use image node_id 3 for calling the CLinkerOp obj's underlying member method code with example usage: obj.c_code_cleanup(node, name, inputs, outputs, sub) and returns: str