def from_dict(dict_): """ INTERNAL .. warning:: /!\\\\ Internal, do not use unless you know what you are doing /!\\\\ This is used internally only to restore action_space or observation_space if they have been saved by `to_dict`. Do not attempt to use it in a different context. Allows the de-serialization of an object stored as a dictionary (for example in the case of json saving). Parameters ---------- dict_: ``dict`` Representation of an BaseObservation Space (aka :class:`grid2op.BaseObservation.ObservartionHelper`) or the BaseAction Space (aka :class:`grid2op.BaseAction.ActionSpace`) as a dictionary. Returns ------- res: :class:`SerializableSpace` An instance of an SerializableSpace matching the dictionary. """ if isinstance(dict_, str): path = dict_ if not os.path.exists(path): raise Grid2OpException( "Unable to find the file \"{}\" to load the ObservationSpace" .format(path)) with open(path, "r", encoding="utf-8") as f: dict_ = json.load(fp=f) gridobj = GridObjects.from_dict(dict_) actionClass_str = extract_from_dict(dict_, "_init_subtype", str) actionClass_li = actionClass_str.split('.') if actionClass_li[-1] in globals(): subtype = globals()[actionClass_li[-1]] else: # TODO make something better and recursive here exec("from {} import {}".format(".".join(actionClass_li[:-1]), actionClass_li[-1])) try: subtype = eval(actionClass_li[-1]) except NameError: if len(actionClass_li) > 1: try: subtype = eval(".".join(actionClass_li[1:])) except: msg_err_ = "Impossible to find the module \"{}\" to load back the space (ERROR 1). " \ "Try \"from {} import {}\"" raise Grid2OpException( msg_err_.format(actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1])) else: msg_err_ = "Impossible to find the module \"{}\" to load back the space (ERROR 2). " \ "Try \"from {} import {}\"" raise Grid2OpException( msg_err_.format(actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1])) except AttributeError: try: subtype = eval(actionClass_li[-1]) except: if len(actionClass_li) > 1: msg_err_ = "Impossible to find the class named \"{}\" to load back the space (ERROR 3)" \ "(module is found but not the class in it) Please import it via " \ "\"from {} import {}\"." msg_err_ = msg_err_.format( actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1]) else: msg_err_ = "Impossible to import the class named \"{}\" to load back the space (ERROR 4) " \ "(the module is found but not the class in it)" msg_err_ = msg_err_.format(actionClass_str) raise Grid2OpException(msg_err_) # create the proper SerializableSpace class for this environment CLS = SerializableSpace.init_grid(gridobj) res = CLS(gridobj=gridobj, subtype=subtype, _init_grid=True) return res
def from_dict(dict_): """ Allows the de-serialization of an object stored as a dictionnary (for example in the case of json saving). Parameters ---------- dict_: ``dict`` Representation of an BaseObservation Space (aka :class:`grid2op.BaseObservation.ObservartionHelper`) or the BaseAction Space (aka :class:`grid2op.BaseAction.ActionSpace`) as a dictionnary. Returns ------- res: :class:`SerializableSpace` An instance of an SerializableSpace matching the dictionnary. """ if isinstance(dict_, str): path = dict_ if not os.path.exists(path): raise Grid2OpException( "Unable to find the file \"{}\" to load the ObservationSpace" .format(path)) with open(path, "r", encoding="utf-8") as f: dict_ = json.load(fp=f) gridobj = GridObjects.from_dict(dict_) actionClass_str = extract_from_dict(dict_, "_init_subtype", str) actionClass_li = actionClass_str.split('.') if actionClass_li[-1] in globals(): subtype = globals()[actionClass_li[-1]] else: # TODO make something better and recursive here exec("from {} import {}".format(".".join(actionClass_li[:-1]), actionClass_li[-1])) try: subtype = eval(actionClass_li[-1]) except NameError: if len(actionClass_li) > 1: try: subtype = eval(".".join(actionClass_li[1:])) except: msg_err_ = "Impossible to find the module \"{}\" to load back the space (ERROR 1). " \ "Try \"from {} import {}\"" raise Grid2OpException( msg_err_.format(actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1])) else: msg_err_ = "Impossible to find the module \"{}\" to load back the space (ERROR 2). " \ "Try \"from {} import {}\"" raise Grid2OpException( msg_err_.format(actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1])) except AttributeError: try: subtype = eval(actionClass_li[-1]) except: if len(actionClass_li) > 1: msg_err_ = "Impossible to find the class named \"{}\" to load back the space (ERROR 3)" \ "(module is found but not the class in it) Please import it via " \ "\"from {} import {}\"." msg_err_ = msg_err_.format( actionClass_str, ".".join(actionClass_li[:-1]), actionClass_li[-1]) else: msg_err_ = "Impossible to import the class named \"{}\" to load back the space (ERROR 4) " \ "(the module is found but not the class in it)" msg_err_ = msg_err_.format(actionClass_str) raise Grid2OpException(msg_err_) res = SerializableSpace(gridobj=gridobj, subtype=subtype) return res