Python 酸洗内部类

Python 酸洗内部类,python,pickle,Python,Pickle,我有一个名为model的python模块,基本上包含以下内容: class Database: class Publiation(object): pass class Article(Publication): pass class Book(Publication): pass class AnotherDatabase: class Seminar(object): pass

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

class Database:

    class Publiation(object):
        pass

    class Article(Publication):
        pass

    class Book(Publication):
        pass

class AnotherDatabase:

    class Seminar(object):
        pass

    ...
我将数据库中的对象定义为嵌套在一个主类下的类,以便更明确地组织它们。这些对象是从一个大的XML文件中解析出来的,这需要时间。我想对导入的对象进行pickle处理,以使它们能够在更短的时间内加载

我得到一个错误:

pickle.PicklingError:不能泡菜 当前位置 未作为project.model.Article找到


该类现在是
project.model.Article
,而不是定义的
project.model.Database.Article
。我可以修复这个错误并像上面那样嵌套类吗?通过嵌套类来组织类是个坏主意吗?

创建内部类时,解释器无法知道它是在哪个类中定义的,这些信息不会被记录。这就是为什么pickle不知道在哪里可以找到类文章的原因

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


因此,通常最好避免使用Python中的嵌套类,除非您有很好的理由这样做。

保持类不被嵌套肯定要简单得多。或者,您可以使用包将类分组在一起


在任何情况下,都有一个名为的替代序列化程序,我认为它可以处理嵌套类。在反序列化之前,您需要向它注册这些类。我以前在
pickle
不够用(也有与类相关的问题)时使用过它,而且它工作得很好

是的,筑巢是不好的。如果你不“需要”父母/子女关系,那么你就不想这样做。您不想为自己创建数独难题。