| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import dill |
| | from functools import partial |
| | import warnings |
| |
|
| |
|
| | def copy(obj, byref=False, recurse=False): |
| | if byref: |
| | try: |
| | return dill.copy(obj, byref=byref, recurse=recurse) |
| | except Exception: |
| | pass |
| | else: |
| | raise AssertionError('Copy of %s with byref=True should have given a warning!' % (obj,)) |
| |
|
| | warnings.simplefilter('ignore') |
| | val = dill.copy(obj, byref=byref, recurse=recurse) |
| | warnings.simplefilter('error') |
| | return val |
| | else: |
| | return dill.copy(obj, byref=byref, recurse=recurse) |
| |
|
| |
|
| | class obj1(object): |
| | def __init__(self): |
| | super(obj1, self).__init__() |
| |
|
| | class obj2(object): |
| | def __init__(self): |
| | super(obj2, self).__init__() |
| |
|
| | class obj3(object): |
| | super_ = super |
| | def __init__(self): |
| | obj3.super_(obj3, self).__init__() |
| |
|
| |
|
| | def test_super(): |
| | assert copy(obj1(), byref=True) |
| | assert copy(obj1(), byref=True, recurse=True) |
| | assert copy(obj1(), recurse=True) |
| | assert copy(obj1()) |
| |
|
| | assert copy(obj2(), byref=True) |
| | assert copy(obj2(), byref=True, recurse=True) |
| | assert copy(obj2(), recurse=True) |
| | assert copy(obj2()) |
| |
|
| | assert copy(obj3(), byref=True) |
| | assert copy(obj3(), byref=True, recurse=True) |
| | assert copy(obj3(), recurse=True) |
| | assert copy(obj3()) |
| |
|
| |
|
| | def get_trigger(model): |
| | pass |
| |
|
| | class Machine(object): |
| | def __init__(self): |
| | self.child = Model() |
| | self.trigger = partial(get_trigger, self) |
| | self.child.trigger = partial(get_trigger, self.child) |
| |
|
| | class Model(object): |
| | pass |
| |
|
| |
|
| |
|
| | def test_partial(): |
| | assert copy(Machine(), byref=True) |
| | assert copy(Machine(), byref=True, recurse=True) |
| | assert copy(Machine(), recurse=True) |
| | assert copy(Machine()) |
| |
|
| |
|
| | class Machine2(object): |
| | def __init__(self): |
| | self.go = partial(self.member, self) |
| | def member(self, model): |
| | pass |
| |
|
| |
|
| | class SubMachine(Machine2): |
| | def __init__(self): |
| | super(SubMachine, self).__init__() |
| |
|
| |
|
| | def test_partials(): |
| | assert copy(SubMachine(), byref=True) |
| | assert copy(SubMachine(), byref=True, recurse=True) |
| | assert copy(SubMachine(), recurse=True) |
| | assert copy(SubMachine()) |
| |
|
| |
|
| | class obj4(object): |
| | def __init__(self): |
| | super(obj4, self).__init__() |
| | a = self |
| | class obj5(object): |
| | def __init__(self): |
| | super(obj5, self).__init__() |
| | self.a = a |
| | self.b = obj5() |
| |
|
| |
|
| | def test_circular_reference(): |
| | assert copy(obj4()) |
| | obj4_copy = dill.loads(dill.dumps(obj4())) |
| | assert type(obj4_copy) is type(obj4_copy).__init__.__closure__[0].cell_contents |
| | assert type(obj4_copy.b) is type(obj4_copy.b).__init__.__closure__[0].cell_contents |
| |
|
| |
|
| | def f(): |
| | def g(): |
| | return g |
| | return g |
| |
|
| |
|
| | def test_function_cells(): |
| | assert copy(f()) |
| |
|
| |
|
| | def fib(n): |
| | assert n >= 0 |
| | if n <= 1: |
| | return n |
| | else: |
| | return fib(n-1) + fib(n-2) |
| |
|
| |
|
| | def test_recursive_function(): |
| | global fib |
| | fib2 = copy(fib, recurse=True) |
| | fib3 = copy(fib) |
| | fib4 = fib |
| | del fib |
| | assert fib2(5) == 5 |
| | for _fib in (fib3, fib4): |
| | try: |
| | _fib(5) |
| | except Exception: |
| | |
| | pass |
| | else: |
| | raise AssertionError("Function fib shouldn't have been found") |
| | fib = fib4 |
| |
|
| |
|
| | def collection_function_recursion(): |
| | d = {} |
| | def g(): |
| | return d |
| | d['g'] = g |
| | return g |
| |
|
| |
|
| | def test_collection_function_recursion(): |
| | g = copy(collection_function_recursion()) |
| | assert g()['g'] is g |
| |
|
| |
|
| | if __name__ == '__main__': |
| | with warnings.catch_warnings(): |
| | warnings.simplefilter('error') |
| | test_super() |
| | test_partial() |
| | test_partials() |
| | test_circular_reference() |
| | test_function_cells() |
| | test_recursive_function() |
| | test_collection_function_recursion() |
| |
|