| 257 | memo[id(memo)]=[x] |
| 258 | |
| 259 | def _reconstruct(x, memo, func, args, |
| 260 | state=None, listiter=None, dictiter=None, |
| 261 | *, deepcopy=deepcopy): |
| 262 | deep = memo is not None |
| 263 | if deep and args: |
| 264 | args = (deepcopy(arg, memo) for arg in args) |
| 265 | y = func(*args) |
| 266 | if deep: |
| 267 | memo[id(x)] = y |
| 268 | |
| 269 | if state is not None: |
| 270 | if deep: |
| 271 | state = deepcopy(state, memo) |
| 272 | if hasattr(y, '__setstate__'): |
| 273 | y.__setstate__(state) |
| 274 | else: |
| 275 | if isinstance(state, tuple) and len(state) == 2: |
| 276 | state, slotstate = state |
| 277 | else: |
| 278 | slotstate = None |
| 279 | if state is not None: |
| 280 | y.__dict__.update(state) |
| 281 | if slotstate is not None: |
| 282 | for key, value in slotstate.items(): |
| 283 | setattr(y, key, value) |
| 284 | |
| 285 | if listiter is not None: |
| 286 | if deep: |
| 287 | for item in listiter: |
| 288 | item = deepcopy(item, memo) |
| 289 | y.append(item) |
| 290 | else: |
| 291 | for item in listiter: |
| 292 | y.append(item) |
| 293 | if dictiter is not None: |
| 294 | if deep: |
| 295 | for key, value in dictiter: |
| 296 | key = deepcopy(key, memo) |
| 297 | value = deepcopy(value, memo) |
| 298 | y[key] = value |
| 299 | else: |
| 300 | for key, value in dictiter: |
| 301 | y[key] = value |
| 302 | return y |
| 303 | |
| 304 | del types, weakref, PyStringMap |