docs: def bind(self, prefix: str, namespace: str, override=True, replace=False):
          """
          bind a given namespace to the prefix, forbids same prefix with different namespace
  
          :param prefix:
          :param namespace:
          :param override: if override, rebind, even if the given namespace is already bound to another prefix.
          :param replace: if replace, replace any existing prefix with the new namespace
          """
          namespace = URIRef(str(namespace))
          # When documenting explain that override only applies in what cases
          if prefix is None:
              prefix = ''
          bound_namespace = self.store.namespace(prefix)
          # Check if the bound_namespace contains a URI and if so convert it into a URIRef for
          # comparison. This is to prevent duplicate namespaces with the same URI.
          if bound_namespace:
              bound_namespace = URIRef(bound_namespace)
          if bound_namespace and bound_namespace != namespace:
  
              if replace:
                  self.store.bind(prefix, namespace)
              # prefix already in use for different namespace
              raise PrefixAlreadyUsedException("Prefix (%s, %s) already used, instead of (%s, %s).",
                                               prefix, self.store.namespace(prefix).toPython(),
                                               prefix, namespace.toPython())
          else:
              bound_prefix = self.store.prefix(namespace)
              if bound_prefix is None:
                  self.store.bind(prefix, namespace)
              elif bound_prefix == prefix:
                  pass  # already bound
              else:
                  if override or bound_prefix.startswith("_"):
                      self.store.bind(prefix, namespace)