def set_option(self, key, subkey, value):
key, subkey = _lower_keys(key, subkey)<EOL>_entry_must_exist(self.gc, key, subkey)<EOL>df = self.gc[(self.gc["<STR_LIT>"] == key) & (self.gc["<STR_LIT>"] == subkey)]<EOL>if df["<STR_LIT>"].values[<NUM_LIT:0>]:<EOL><INDENT>raise ValueError("<STR_LIT>".format(key, subkey))<EOL><DEDENT>ev.value_eval(value, df["<STR_LIT:type>"].values[<NUM_LIT:0>])<EOL>if not self.check_option(key, subkey, value):<EOL><INDENT>info = "<STR_LIT>".format(key, subkey)<EOL>info += "<STR_LIT>".format("<STR_LIT:U+002CU+0020>".join(df["<STR_LIT>"].values[<NUM_LIT:0>]))<EOL>raise ValueError(info)<EOL><DEDENT>self.gc.loc[<EOL>(self.gc["<STR_LIT>"] == key) &<EOL>(self.gc["<STR_LIT>"] == subkey), "<STR_LIT:value>"] = value<EOL>
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.