writing pickle function
Peter Otten
__peter__ at web.de
Fri Jan 23 14:46:27 EST 2009
perfreem at gmail.com wrote:
> i am using nested defaultdict from collections and i would like to
> write it as a pickle object to a file. when i try:
>
> from collections import defaultdict
> x = defaultdict(lambda: defaultdict(list))
>
> and then try to write to a pickle file, it says:
>
> TypeError: can't pickle function objects
>
> is there a way around this? it's simply a dictionary that i want to
> write to file.. this works no problems with ordinary dicts.
The error message is misleading. You can pickle your defaultdict if you use
a "normal" function instead of the lambda:
$ cat pickle_defaultdict.py
import sys
from collections import defaultdict
from cPickle import dumps, loads
if "--lambda" in sys.argv:
make_inner = lambda: defaultdict(list)
else:
def make_inner():
return defaultdict(list)
d = defaultdict(make_inner)
d[1][2].append(42)
e = loads(dumps(d))
print e == d
$ python pickle_defaultdict.py
True
$ python pickle_defaultdict.py --lambda
Traceback (most recent call last):
File "pickle_defaultdict.py", line 13, in <module>
e = loads(dumps(d))
File "/usr/lib/python2.5/copy_reg.py", line 69, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle function objects
Peter
More information about the Python-list
mailing list