def override_from_dict()

in lm_human_preferences/utils/hyperparams.py [0:0]


    def override_from_dict(self, flat_dict, separator='.'):
        """Overrides values from a dict like {'x.y': 1, 'name': "foobar"}.

        Treats keys with dots as paths into nested HParams.
        Values should be parsed already.
        """
        # Parse 'on' and 'off' values.
        typemap = _type_map(type(self), separator=separator)

        flat_dict_parsed = {}
        for flat_k, v in flat_dict.items():
            cls = _type_to_class(typemap[flat_k])
            if is_hparam_type(cls) and v == 'on':
                parsed_v = cls()
            elif is_hparam_type(cls) and v == 'off':
                parsed_v = None
            else:
                parsed_v = v
            flat_dict_parsed[flat_k] = parsed_v

        # Expand implicit nested 'on' values. For instance, {'x.y': 'on'} should mean {'x': 'on', 'x.y': 'on'}.
        flat_dict_expanded = {}
        for flat_k, v in flat_dict_parsed.items():
            flat_dict_expanded[flat_k] = v
            cls = _type_to_class(typemap[flat_k])
            if is_hparam_type(cls) and v is not None:
                parts = flat_k.split(separator)
                prefix = parts[0]
                for i in range(1, len(parts)):
                    if prefix not in flat_dict_expanded:
                        flat_dict_expanded[prefix] = _type_to_class(typemap[prefix])()
                    prefix += separator + parts[i]

        # Set all the values. The sort ensures that outer classes get initialized before their fields.
        for flat_k in sorted(flat_dict_expanded.keys()):
            v = flat_dict_expanded[flat_k]
            *ks, f = flat_k.split(separator)
            hp = self
            for i, k in enumerate(ks):
                try:
                    hp = getattr(hp, k)
                except AttributeError:
                    raise AttributeError(f"{hp} {'(' + separator.join(ks[:i]) + ') ' if i else ''}has no field '{k}'")
            try:
                setattr(hp, f, v)
            except AttributeError:
                raise AttributeError(f"{hp} ({separator.join(ks)}) has no field '{f}'")