2016-06-20 1 views
0

Как создать файл рассола функции (defaultDict)? Ошибки я получаю не может pickle function objectsКак распиливать defaultdict, который использует лямбда-функцию?

from collections import defaultdict 
dtree = lambda: defaultdict(tree) 

try: import cPickle as pickle 
except: import pickle 

#Create defaultdict object: 
hapPkl = dtree() 

#Create Pickle file 
f = open("hapP.pkl","wb") 
pickle.dump(hapPkl,f) 
f.close() 

StackTrace:

TypeError         Traceback (most recent call last) 
<ipython-input-287-376cac3b4f0d> in <module>() 
     1 f = open("hapP.pkl","wb") 
----> 2 pickle.dump(hapPkl,f) 
     3 f.close() 

/usr/lib64/python2.7/copy_reg.pyc in _reduce_ex(self, proto) 
    68  else: 
    69   if base is self.__class__: 
---> 70    raise TypeError, "can't pickle %s objects" % base.__name__ 
    71   state = base(self) 
    72  args = (self.__class__, base, state) 

TypeError: can't pickle function objects 
+2

Где 'tree' приходящий из? Вы определяете только 'dtree'. – user2357112

+0

В Python 3 функции травления работают, если они определены с помощью инструкции 'def', но не если они определены с помощью lambda (даже если для lambda присваивается переменная). Попробуйте 'def dtree(): return defaultdict (dtree)' возможно? – Blckknght

+0

@Blckknght с использованием Python 2. – Merlin

ответ

1

Простое решение было бы реализовать дерево структуры данных по-разному, без defaultdict:

class DTree(dict): 
    def __missing__(self, key): 
     value = self[key] = type(self)() 
     return value 

try: import cPickle as pickle 
except: import pickle 

#Create dtree object: 
hapPkl = DTree() 

#Create Pickle file 
f = open("hapP.pkl", "wb") 
pickle.dump(hapPkl, f) 
f.close() 
+0

Каковы были бы преимущества этого? – Merlin

+0

Возможно, это лучший способ сделать это. Важным является то, что он печатает и красиво печатает ('pprint()'), как обычный словарь. См. [_Какой лучший способ реализовать вложенные словари в Python? _] (Http://stackoverflow.com/questions/635483/what-is-the-best-way-to-implement-nested-dictionaries-in-python/19829714 # 19829714) – martineau

4

сообщение об ошибке cPickle немного вводит в заблуждение; версия pickle лучше. Это не значит, что вы не можете рассортировать функции; это то, что они должны быть доступны по их __name__. У лямбда есть __name__, установленный на '<lambda>', поэтому он не подбирается. Определить его def:

def tree(): 
    return defaultdict(tree) 

и это будет пригодны для консервирования. (Вы все еще нужно определение соответствия этих tree доступны, когда вы unpickle его.)

+1

Связанная информация может быть найдена здесь: http://stackoverflow.com/questions/16439301/cant-pickle-defaultdict –

+0

@user, что вы подразумеваете под: сопоставление определения? – Merlin

+0

@Merlin: Если вы попытаетесь раскрыть этот defaultdict в среде без определения 'tree', это не сработает. – user2357112