Skip to content

Instantly share code, notes, and snippets.

@sirpercival
Created March 20, 2015 16:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sirpercival/27ba641f689032ad68d8 to your computer and use it in GitHub Desktop.
Save sirpercival/27ba641f689032ad68d8 to your computer and use it in GitHub Desktop.
testing jsonpickle, functools.partial, and class methods
$> 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
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