docs: def set_option(self, key, subkey, value):
          """Sets the value of an option.
  
          :param str key: First identifier of the option.
          :param str subkey: Second identifier of the option.
          :param value: New value for the option (type varies).
  
          :raise:
              :NotRegisteredError: If ``key`` or ``subkey`` do not define any
                  option.
              :ValueError: If the targeted obtion is locked.
              :ValueError: If the provided value is not the expected
                  type for the option.
              :ValueError: If the provided value is not in the expected
                  available values for the option.
          """
          key, subkey = _lower_keys(key, subkey)
          _entry_must_exist(self.gc, key, subkey)
  
          df = self.gc[(self.gc["k1"] == key) & (self.gc["k2"] == subkey)]
          if df["locked"].values[0]:
              raise ValueError("{0}.{1} option is locked".format(key, subkey))
          ev.value_eval(value, df["type"].values[0])
          if not self.check_option(key, subkey, value):
              info = "{0}.{1} accepted options are: ".format(key, subkey)
              info += "[{}]".format(", ".join(df["values"].values[0]))
              raise ValueError(info)
          self.gc.loc[
              (self.gc["k1"] == key) &
              (self.gc["k2"] == subkey), "value"] = value