docs: def cleanup(pin=None, assert_exists=False):
      """Cleanup the pin by closing and unexporting it.
  
      Args:
          pin (int, optional): either the pin to clean up or None (default).
              If None, clean up all pins.
          assert_exists: if True, raise a ValueError if the pin was not
              setup. Otherwise, this function is a NOOP.
      """
      if pin is None:
          # Take a list of keys because we will be deleting from _open
          for pin in list(_open):
              cleanup(pin)
          return
      if not isinstance(pin, int):
          raise TypeError("pin must be an int, got: {}".format(pin))
  
      state = _open.get(pin)
      if state is None:
          if assert_exists:
              raise ValueError("pin {} was not setup".format(pin))
          return
      state.value.close()
      state.direction.close()
      if os.path.exists(gpiopath(pin)):
          log.debug("Unexporting pin {0}".format(pin))
          with _export_lock:
              with open(pjoin(gpio_root, 'unexport'), 'w') as f:
                  _write(f, pin)
  
      del _open[pin]