Created
March 20, 2015 16:14
-
-
Save sirpercival/27ba641f689032ad68d8 to your computer and use it in GitHub Desktop.
testing jsonpickle, functools.partial, and class methods
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$> python test_jsonpickle.py | |
test_method 16 81 | |
test_funct 16 81 | |
( <type 'functools.partial'>, | |
( <bound method TestPartial_Method.my_method of <__main__.TestPartial_Method object at 0x102177d50>>,), | |
( <bound method TestPartial_Method.my_method of <__main__.TestPartial_Method object at 0x102177d50>>, | |
(2,), | |
None, | |
None)) | |
( <type 'functools.partial'>, | |
(<function my_funct at 0x10218e6e0>,), | |
(<function my_funct at 0x10218e6e0>, (2,), None, None)) | |
test_method: | |
{ u'effects': [ { u'py/object': u'functools.partial', | |
u'py/reduce': [ { u'py/type': u'functools.partial'}, | |
{ u'py/tuple': [ { u'py/object': u'__builtin__.instancemethod'}]}, | |
{ u'py/tuple': [ { u'py/id': 3}, | |
{ u'py/tuple': [2]}, | |
None, | |
{ }]}, | |
None, | |
None]}, | |
{ u'py/object': u'functools.partial', | |
u'py/reduce': [ { u'py/type': u'functools.partial'}, | |
{ u'py/tuple': [ { u'py/object': u'__builtin__.instancemethod'}]}, | |
{ u'py/tuple': [ { u'py/id': 5}, | |
{ u'py/tuple': [3]}, | |
None, | |
{ }]}, | |
None, | |
None]}], | |
u'py/object': u'__main__.TestPartial_Method'} | |
test_funct: | |
{ u'effects': [ { u'py/object': u'functools.partial', | |
u'py/reduce': [ { u'py/type': u'functools.partial'}, | |
{ u'py/tuple': [ { u'py/function': u'__main__.my_funct'}]}, | |
{ u'py/tuple': [ { u'py/function': u'__main__.my_funct'}, | |
{ u'py/tuple': [2]}, | |
None, | |
{ }]}, | |
None, | |
None]}, | |
{ u'py/object': u'functools.partial', | |
u'py/reduce': [ { u'py/type': u'functools.partial'}, | |
{ u'py/tuple': [ { u'py/function': u'__main__.my_funct'}]}, | |
{ u'py/tuple': [ { u'py/function': u'__main__.my_funct'}, | |
{ u'py/tuple': [3]}, | |
None, | |
{ }]}, | |
None, | |
None]}], | |
u'py/object': u'__main__.TestPartial_Function'} | |
<__main__.TestPartial_Function object at 0x10218f1d0> | |
Traceback (most recent call last): | |
File "test_jsonpickle.py", line 44, in <module> | |
decoded_method = jsonpickle.decode(encoded_method) # <-- error | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/__init__.py", line 148, in decode | |
return unpickler.decode(string, backend=backend, keys=keys) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 26, in decode | |
return context.restore(backend.decode(string), reset=reset) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 113, in restore | |
value = self._restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 152, in _restore | |
return restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 231, in _restore_object | |
return self._restore_object_instance(obj, cls) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 296, in _restore_object_instance | |
return self._restore_object_instance_variables(obj, instance) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 325, in _restore_object_instance_variables | |
self._restore_from_dict(obj, instance) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 309, in _restore_from_dict | |
value = self._restore(v) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 152, in _restore | |
return restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 370, in _restore_list | |
children = [self._restore(v) for v in obj] | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 152, in _restore | |
return restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 167, in _restore_reduce | |
f, args, state, listitems, dictitems = map(self._restore, reduce_val) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 152, in _restore | |
return restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 380, in _restore_tuple | |
return tuple([self._restore(v) for v in obj[tags.TUPLE]]) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 152, in _restore | |
return restore(obj) | |
File "/Users/gray/virt_env/virt1/lib/python2.7/site-packages/jsonpickle/unpickler.py", line 202, in _restore_id | |
return self._objs[obj[tags.ID]] | |
IndexError: list index out of range |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import jsonpickle | |
import functools | |
import pprint, json # for pprinting encoded pickles | |
class TestPartial_Method(object): | |
def __init__(self): | |
self.effects = [functools.partial(self.my_method, 2), | |
functools.partial(self.my_method, 3)] | |
def my_method(self, x, y): | |
return pow(x, y) | |
def my_funct(x, y): | |
return pow(x, y) | |
class TestPartial_Function(object): | |
def __init__(self): | |
self.effects = [functools.partial(my_funct, 2), | |
functools.partial(my_funct, 3)] | |
test_method = TestPartial_Method() | |
test_funct = TestPartial_Function() | |
print "test_method", test_method.effects[0](4), test_method.effects[1](4) | |
print "test_funct", test_funct.effects[0](4), test_funct.effects[1](4) | |
pp = pprint.PrettyPrinter(indent=2) | |
pp.pprint(test_method.effects[0].__reduce__()) | |
pp.pprint(test_funct.effects[0].__reduce__()) | |
encoded_method = jsonpickle.encode(test_method) | |
print "test_method:" | |
pp.pprint(json.loads(encoded_method)) | |
encoded_funct = jsonpickle.encode(test_funct) | |
print "test_funct:" | |
pp.pprint(json.loads(encoded_funct)) | |
decoded_funct = jsonpickle.decode(encoded_funct) # <-- no error | |
print decoded_funct | |
decoded_method = jsonpickle.decode(encoded_method) # <-- error | |
print decoded_method |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment