| 241 | memo[id(memo)]=[x] |
| 242 | |
| 243 | def _reconstruct(x, memo, func, args, |
| 244 | state=None, listiter=None, dictiter=None, |
| 245 | *, deepcopy=deepcopy): |
| 246 | deep = memo is not None |
| 247 | if deep and args: |
| 248 | args = [deepcopy(arg, memo) for arg in args] |
| 249 | y = func(*args) |
| 250 | if deep: |
| 251 | memo[id(x)] = y |
| 252 | |
| 253 | if state is not None: |
| 254 | if deep: |
| 255 | state = deepcopy(state, memo) |
| 256 | if hasattr(y, '__setstate__'): |
| 257 | y.__setstate__(state) |
| 258 | else: |
| 259 | if isinstance(state, tuple) and len(state) == 2: |
| 260 | state, slotstate = state |
| 261 | else: |
| 262 | slotstate = None |
| 263 | if state is not None: |
| 264 | y.__dict__.update(state) |
| 265 | if slotstate is not None: |
| 266 | for key, value in slotstate.items(): |
| 267 | setattr(y, key, value) |
| 268 | |
| 269 | if listiter is not None: |
| 270 | if deep: |
| 271 | for item in listiter: |
| 272 | item = deepcopy(item, memo) |
| 273 | y.append(item) |
| 274 | else: |
| 275 | for item in listiter: |
| 276 | y.append(item) |
| 277 | if dictiter is not None: |
| 278 | if deep: |
| 279 | for key, value in dictiter: |
| 280 | key = deepcopy(key, memo) |
| 281 | value = deepcopy(value, memo) |
| 282 | y[key] = value |
| 283 | else: |
| 284 | for key, value in dictiter: |
| 285 | y[key] = value |
| 286 | return y |
| 287 | |
| 288 | del types, weakref |
| 289 | |