| 226 | memo[id(memo)]=[x] |
| 227 | |
| 228 | def _reconstruct(x, memo, func, args, |
| 229 | state=None, listiter=None, dictiter=None, |
| 230 | *, deepcopy=deepcopy): |
| 231 | deep = memo is not None |
| 232 | if deep and args: |
| 233 | args = (deepcopy(arg, memo) for arg in args) |
| 234 | y = func(*args) |
| 235 | if deep: |
| 236 | memo[id(x)] = y |
| 237 | |
| 238 | if state is not None: |
| 239 | if deep: |
| 240 | state = deepcopy(state, memo) |
| 241 | if hasattr(y, '__setstate__'): |
| 242 | y.__setstate__(state) |
| 243 | else: |
| 244 | if isinstance(state, tuple) and len(state) == 2: |
| 245 | state, slotstate = state |
| 246 | else: |
| 247 | slotstate = None |
| 248 | if state is not None: |
| 249 | y.__dict__.update(state) |
| 250 | if slotstate is not None: |
| 251 | for key, value in slotstate.items(): |
| 252 | setattr(y, key, value) |
| 253 | |
| 254 | if listiter is not None: |
| 255 | if deep: |
| 256 | for item in listiter: |
| 257 | item = deepcopy(item, memo) |
| 258 | y.append(item) |
| 259 | else: |
| 260 | for item in listiter: |
| 261 | y.append(item) |
| 262 | if dictiter is not None: |
| 263 | if deep: |
| 264 | for key, value in dictiter: |
| 265 | key = deepcopy(key, memo) |
| 266 | value = deepcopy(value, memo) |
| 267 | y[key] = value |
| 268 | else: |
| 269 | for key, value in dictiter: |
| 270 | y[key] = value |
| 271 | return y |
| 272 | |
| 273 | del types, weakref |
| 274 | |