Ponieważ nie mamy kod, który generuje błąd, ja zakładam, że występuje podczas próby pickle obiektu Person.
Twój problem nie jest związany z użyciem boostu. Leży w module cPickle. Ma problem z wytrawianiem obiektów z klasami zagnieżdżonymi. Zobacz to answer, aby uzyskać wyjaśnienie. Oto prosty przykład kodu, który generuje błąd:
import cPickle
class MyOuterClass(object):
class MyInnerClass(object):
pass
def __init__(self):
self.my_inner_class = self.MyInnerClass()
def pickle_error():
print "Pickling ..."
my_outer_class = MyOuterClass()
print cPickle.dumps(my_outer_class)
if __name__ == "__main__":
pickle_error()
Running produkuje ten wyjściowe:
Pickling ...
Traceback (most recent call last):
File "pickle.py", line 18, in <module>
pickle_error()
File "pickle.py", line 15, in pickle_error
print cPickle.dumps(my_outer_class)
cPickle.PicklingError: Can't pickle <class '__main__.MyInnerClass'>:
attribute lookup __main__.MyInnerClass failed
Jak wspomniano w połączonej odpowiedzi, kiedy cPickle pyta wewnętrzną klasę dla swojej nazwy powraca '__main__.MyInnerClass'
. Jednak tej nazwy nie można znaleźć w przestrzeni nazw modułu, stąd masz wyjątek.
Teraz możesz tego doświadczyć, ponieważ ponieważ nie ma czegoś podobnego do typu wyliczeniowego w pytonie, zwiększ go, aby go reprezentować. Konstrukt enum_ deklaruje klasę w bieżącym zakresie. Przechwytując zakres klasy, kończysz tworzenie klasy zagnieżdżonej w osobie i otrzymujesz błąd pikle opisany powyżej.
Istnieje kilka rozwiązań twojego problemu.
Najprostszym byłoby zadeklarowanie enum poza zakresem podmiotu. Możesz nie chcieć ujawnić wyliczenia pokrewnego osoby oprócz tego dla organizacji kodu. Następnie możesz zadeklarować klasę Person w podmodule, dzięki czemu Twoje wyliczenie zostanie ogłoszone w pobliżu twojej klasy, nie będąc zbyt publicznym.
Można również rzucić okiem na boost's pickle support. Jednak nie próbowałem tego.
Trzecim rozwiązaniem może być użycie czegoś innego niż pikle do przechowywania obiektu.
Istnieje pewna dziwność w ugotowaniu wyłudzeń. zobacz tutaj: http://stackoverflow.com/questions/3214969/ –