code: async def dispense(self, mount: top_types.Mount, volume: float = None,
                         rate: float = 1.0):
          
          this_pipette = self._attached_instruments[mount]
          if not this_pipette:
              raise top_types.PipetteNotAttachedError(
                  "No pipette attached to {} mount".format(mount.name))
          if volume is None:
              disp_vol = this_pipette.current_volume
              mod_log.debug("No dispense volume specified. Dispensing all "
                            "remaining liquid ({}uL) from pipette".format
                            (disp_vol))
          else:
              disp_vol = volume
          # Ensure we don't dispense more than the current volume
          disp_vol = min(this_pipette.current_volume, disp_vol)
  
          if disp_vol == 0:
              return
  
          self._backend.set_active_current(
              Axis.of_plunger(mount), this_pipette.config.plunger_current)
          dist = self._plunger_position(
                  this_pipette,
                  this_pipette.current_volume - disp_vol,
                  'dispense')
          speed = this_pipette.config.dispense_flow_rate * rate
          try:
              await self._move_plunger(mount, dist, speed)
          except Exception:
              self._log.exception('Dispense failed')
              this_pipette.set_current_volume(0)
              raise
          else:
              this_pipette.remove_current_volume(disp_vol)
docs: Dispense a volume of liquid in microliters(uL) using this pipette
          at the current location. If no volume is specified, `dispense` will
          dispense all volume currently present in pipette
  
          mount : Mount.LEFT or Mount.RIGHT
          volume : [float] The number of microliters to dispense
          rate : [float] Set plunger speed for this dispense, where
              speed = rate * dispense_speed