code: def remove(self, element, multiplicity=None):
          
          _elements = self._elements
          if element not in _elements:
              raise KeyError
          old_multiplicity = _elements.get(element, 0)
          if multiplicity is None or multiplicity >= old_multiplicity:
              del _elements[element]
              self._total -= old_multiplicity
          elif multiplicity < 0:
              raise ValueError("Multiplicity must be not be negative")
          elif multiplicity > 0:
              _elements[element] -= multiplicity
              self._total -= multiplicity
          return old_multiplicity
docs: Removes an element from the multiset.
  
          If no multiplicity is specified, the element is completely removed from the multiset:
  
          >>> ms = Multiset('aabbbc')
          >>> ms.remove('a')
          2
          >>> sorted(ms)
          ['b', 'b', 'b', 'c']
  
          If the multiplicity is given, it is subtracted from the element's multiplicity in the multiset:
  
          >>> ms.remove('b', 2)
          3
          >>> sorted(ms)
          ['b', 'c']
  
          It is not an error to remove more elements than are in the set:
  
          >>> ms.remove('b', 2)
          1
          >>> sorted(ms)
          ['c']
  
          This extends the :meth:`MutableSet.remove` signature to allow specifying the multiplicity.
  
          Args:
              element:
                  The element to remove from the multiset.
              multiplicity:
                  An optional multiplicity i.e. count of elements to remove.
  
          Returns:
              The multiplicity of the element in the multiset before
              the removal.
  
          Raises:
              KeyError: if the element is not contained in the set. Use :meth:`discard` if
                  you do not want an exception to be raised.