def tuplewrap(value): """ INTENDED TO TURN lists INTO tuples FOR USE AS KEYS """ if is_many(value): return tuple(tuplewrap(v) if is_sequence(v) else v for v in value) return unwrap(value),
def _getdefault(obj, key): """ obj ANY OBJECT key IS EXPECTED TO BE LITERAL (NO ESCAPING) TRY BOTH ATTRIBUTE AND ITEM ACCESS, OR RETURN Null """ try: return obj[key] except Exception as f: pass if is_sequence(obj): return [_getdefault(o, key) for o in obj] try: if obj.__class__ is not dict: return getattr(obj, key) except Exception as f: pass try: if float(key) == round(float(key), 0): return obj[int(key)] except Exception as f: pass # TODO: FIGURE OUT WHY THIS WAS EVER HERE (AND MAKE A TEST) # try: # return eval("obj."+text(key)) # except Exception as f: # pass return NullType(obj, key)
def tuplewrap(value): """ INTENDED TO TURN lists INTO tuples FOR USE AS KEYS """ if isinstance(value, (list, set, tuple) + generator_types): return tuple(tuplewrap(v) if is_sequence(v) else v for v in value) return unwrap(value),
def __setitem__(self, key, value): if key == "": get_logger().error("key is empty string. Probably a bad idea") if key == None: return Null if key == ".": # SOMETHING TERRIBLE HAPPENS WHEN value IS NOT A Mapping; # HOPEFULLY THE ONLY OTHER METHOD RUN ON self IS from_data() v = from_data(value) _set(self, SLOT, v) return v try: d = self._internal_dict value = from_data(value) if key.find(".") == -1: if value is None: d.pop(key, None) else: d[key] = value return self seq = _split_field(key) for k in seq[:-1]: d = _getdefault(d, k) if value == None: try: d.pop(seq[-1], None) except Exception as _: pass elif d == None: d[literal_field(seq[-1])] = value elif is_sequence(d): for dd in d: from_data(dd)[seq[-1]] = value else: d[seq[-1]] = value return self except Exception as e: from mo_logs import Log Log.error("can not set key={{key}}", key=key, cause=e)
def __add__(self, other): if is_sequence(other): return other return Null