code: def air_gap(self, volume=None, height=None):
          
          if not self.tip_attached:
              log.warning("Cannot perform air_gap without a tip attached.")
  
          if height is None:
              height = 5
  
          do_publish(self.broker, commands.air_gap, self.air_gap, 'before',
                     self, None, self, volume, height)
  
          # if volumes is specified as 0uL, do nothing
          if volume != 0:
              location = self.previous_placeable.top(height)
              # "move_to" separate from aspirate command
              # so "_position_for_aspirate" isn't executed
              self.move_to(location)
              self.aspirate(volume)
  
          do_publish(self.broker, commands.air_gap, self.air_gap, 'after',
                     self, None, self, volume, height)
  
          return self
docs: Pull air into the :any:`Pipette` current tip
  
          Notes
          -----
          If no `location` is passed, the pipette will touch_tip
          from it's current position.
  
          Parameters
          ----------
          volume : number
              The amount in uL to aspirate air into the tube.
              (Default will use all remaining volume in tip)
  
          height : number
              The number of millimiters to move above the current Placeable
              to perform and air-gap aspirate
              (Default will be 10mm above current Placeable)
  
          Returns
          -------
  
          This instance of :class:`Pipette`.
  
          Examples
          --------
          ..
          >>> from opentrons import instruments, robot # doctest: +SKIP
          >>> robot.reset() # doctest: +SKIP
          >>> p300 = instruments.P300_Single(mount='left') # doctest: +SKIP
          >>> p300.aspirate(50, plate[0]) # doctest: +SKIP
          >>> p300.air_gap(50) # doctest: +SKIP