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
不够用(也有与类相关的问题)时使用过它,而且它工作得很好 是的,筑巢是不好的。如果你不“需要”父母/子女关系,那么你就不想这样做。您不想为自己创建数独难题。