酸洗内部课程

时间:2011-03-26 16:38:50

标签: python pickle

我有一个名为model的python模块,基本上有以下内容:

class Database:

    class Publiation(object):
        pass

    class Article(Publication):
        pass

    class Book(Publication):
        pass

class AnotherDatabase:

    class Seminar(object):
        pass

    ...

我将数据库中的对象定义为嵌套在主类下的类,以便更有特色地组织它们。从大型XML文件解析对象,这需要时间。我想挑选导入的对象,以便在更短的时间内加载它们。

我收到错误:

  

pickle.PicklingError:不能发泡   : 它的   找不到project.model.Article

该课程现在为project.model.Article,而非定义的project.model.Database.Article。我可以修复此错误并保持类嵌套如上吗?通过嵌套来组织类是不是一个坏主意?

3 个答案:

答案 0 :(得分:5)

当创建内部类时,解释器无法知道它内部定义了哪个类,因此不会记录此信息。这就是为什么pickle不知道在哪里寻找类文章。

因此,使用内部类时存在许多问题,而不仅仅是在酸洗时。如果模块范围内的类具有相同的名称,则会引入很多歧义,因为没有简单的方法可以区分两种类型(例如使用repr或调试时)。

因此,除非你有充分的理由这样做,否则通常最好避免使用Python中的嵌套类。

答案 1 :(得分:2)

让你的课程无人问津,这当然要简单得多。作为替代方案,您可以使用包将类组合在一起。

在任何情况下,都有一个名为cerealizer的备用序列化程序,我认为它可以处理嵌套类。在反序列化之前,您需要使用它注册类。我之前使用它pickle是不够的(也是与类相关的问题)并且效果很好!

答案 2 :(得分:1)

我在这里回答了类似的问题:https://stackoverflow.com/a/11493777/741316

它不漂亮,但它是可行的。简而言之 - 如果可以的话,请避免嵌套课程。