<p>因为我们没有产生错误的代码,所以我假设在您尝试pickle一个Person对象时会发生这种情况。在</p>
<p>您的问题与boost的使用没有特别的关系。它位于cPickle模块中。它在用嵌套类对对象进行pickle时出现问题。有关说明,请参阅此<a href="https://stackoverflow.com/questions/4677012/python-cant-pickle-type-x-attribute-lookup-failed">answer</a>。下面是一个生成错误的简单代码示例:</p>
<pre><code>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()
</code></pre>
<p>运行它会产生以下输出:</p>
^{pr2}$
<p>如链接答案中所述,当cPickle向内部类请求其名称时,它返回<code>'__main__.MyInnerClass'</code>。但是,在模块的名称空间中找不到该名称,因此会出现异常。在</p>
<hr/>
<p>现在您会遇到这种情况,因为python中没有类似于enum类型的东西,boost创建一个对象来表示它。枚举构造声明当前范围中的类。通过捕获类作用域,您最终在Person中创建了一个嵌套类,并得到了上面提到的pickle错误。在</p>
<p>你的问题有几种解决办法。在</p>
<p>最简单的方法是在Person的作用域之外声明枚举。您可能不想为代码组织公开除此之外的人员相关枚举。然后您可以在子模块中声明Person类,这样您的enum在某种程度上声明为接近您的类而不是太公共。在</p>
<p>你也可以看看<a href="http://www.boost.org/doc/libs/1_48_0/libs/python/doc/v2/pickle.html" rel="nofollow noreferrer">boost's pickle support</a>。但是我没有试过。在</p>
<p>第三种解决方案是使用pickle之外的其他方法来存储对象。在</p>