``asdict`` only works on attrs instances, this works on anything.
(
val,
is_key,
filter,
dict_factory,
retain_collection_types,
value_serializer,
)
| 152 | |
| 153 | |
| 154 | def _asdict_anything( |
| 155 | val, |
| 156 | is_key, |
| 157 | filter, |
| 158 | dict_factory, |
| 159 | retain_collection_types, |
| 160 | value_serializer, |
| 161 | ): |
| 162 | """ |
| 163 | ``asdict`` only works on attrs instances, this works on anything. |
| 164 | """ |
| 165 | val_type = type(val) |
| 166 | if val_type in _ATOMIC_TYPES: |
| 167 | rv = val |
| 168 | if value_serializer is not None: |
| 169 | rv = value_serializer(None, None, rv) |
| 170 | elif getattr(val_type, "__attrs_attrs__", None) is not None: |
| 171 | # Attrs class. |
| 172 | rv = asdict( |
| 173 | val, |
| 174 | recurse=True, |
| 175 | filter=filter, |
| 176 | dict_factory=dict_factory, |
| 177 | retain_collection_types=retain_collection_types, |
| 178 | value_serializer=value_serializer, |
| 179 | ) |
| 180 | elif issubclass(val_type, (tuple, list, set, frozenset)): |
| 181 | if retain_collection_types is True: |
| 182 | cf = val.__class__ |
| 183 | elif is_key: |
| 184 | cf = tuple |
| 185 | else: |
| 186 | cf = list |
| 187 | |
| 188 | rv = cf( |
| 189 | [ |
| 190 | _asdict_anything( |
| 191 | i, |
| 192 | is_key=False, |
| 193 | filter=filter, |
| 194 | dict_factory=dict_factory, |
| 195 | retain_collection_types=retain_collection_types, |
| 196 | value_serializer=value_serializer, |
| 197 | ) |
| 198 | for i in val |
| 199 | ] |
| 200 | ) |
| 201 | elif issubclass(val_type, dict): |
| 202 | df = dict_factory |
| 203 | rv = df( |
| 204 | ( |
| 205 | _asdict_anything( |
| 206 | kk, |
| 207 | is_key=True, |
| 208 | filter=filter, |
| 209 | dict_factory=df, |
| 210 | retain_collection_types=retain_collection_types, |
| 211 | value_serializer=value_serializer, |