| 119 | |
| 120 | |
| 121 | def SONify(arg, memo=None): |
| 122 | if not have_bson: |
| 123 | return arg |
| 124 | add_arg_to_raise = True |
| 125 | try: |
| 126 | if memo is None: |
| 127 | memo = {} |
| 128 | if id(arg) in memo: |
| 129 | rval = memo[id(arg)] |
| 130 | if isinstance(arg, ObjectId): |
| 131 | rval = arg |
| 132 | elif isinstance(arg, datetime.datetime): |
| 133 | rval = arg |
| 134 | elif isinstance(arg, np.floating): |
| 135 | rval = float(arg) |
| 136 | elif isinstance(arg, np.integer): |
| 137 | rval = int(arg) |
| 138 | elif isinstance(arg, (list, tuple)): |
| 139 | rval = type(arg)([SONify(ai, memo) for ai in arg]) |
| 140 | elif isinstance(arg, dict): |
| 141 | rval = {SONify(k, memo): SONify(v, memo) for k, v in list(arg.items())} |
| 142 | elif isinstance(arg, (basestring, float, int, type(None))): |
| 143 | rval = arg |
| 144 | elif isinstance(arg, np.ndarray): |
| 145 | if arg.ndim == 0: |
| 146 | rval = SONify(arg.sum()) |
| 147 | else: |
| 148 | rval = list(map(SONify, arg)) # N.B. memo None |
| 149 | # -- put this after ndarray because ndarray not hashable |
| 150 | elif isinstance(arg, bool): |
| 151 | rval = int(arg) |
| 152 | else: |
| 153 | add_arg_to_raise = False |
| 154 | raise TypeError("SONify", arg) |
| 155 | except Exception as e: |
| 156 | if add_arg_to_raise: |
| 157 | e.args = e.args + (arg,) |
| 158 | raise |
| 159 | memo[id(rval)] = rval |
| 160 | return rval |
| 161 | |
| 162 | |
| 163 | def miscs_update_idxs_vals(miscs, idxs, vals, assert_all_vals_used=True, idxs_map=None): |