2013-04-22 18 views
0

我有一个非常恼人的错误,我终于找到了它。是否有可能得到isinstance或类似的类型检查与我的腌制课程一起工作?

我使用(或更准确地说,已经使用过)一个独立的脚本来创建对象的存储,之后我腌制这个数据结构。每次运行程序时,我都可以用反序列化的数据初始化我的主程序。

但是,如果我使用类型检查,这会成为一个问题。在完成pickle.dump()并获得这个数据结构之后,我设置了它,以便检查对象的类型。不幸的是,我唯一可以检查的是新的重新加载我的类,Python认为它是不同的。

DEBUG:对象我的类型检查:>>灯具{名称:“前台”,位置:“0”,说明:“前台有一个牌子,上面写着......”} < <
DEBUG:一个通用的游戏对象:游戏对象>> {名称: '',位置: '无',说明: '...'} < <

(你可以看到,对象表示看起来非常相似。这是因为它从另一个继承了它的__repr__,即OUGHT是它的一个例子。)

DEBUG:对象的类型,我的类型检查:{类的chimai.chimai.objects.fix.Fixture'}
DEBUG:普通游戏对象的类型:{类的objects.game_object.GameObject'}
DEBUG:对象类型检查的MRO:({class'chimai.chimai.objects.fix.Fixture'},{class'chimai.chimai.objects.game_object.GameObject'},{type'object'} )
DEBUG:MRO针对通用游戏物体:({类 'objects.game_object.GameObject'},{类型 '对象'})

(游戏对象类具有略微不同的标识符;这个来自哪里我最初运行独立脚本)

DEBUG:腌制的灯具类型的编号:173671604
DEBUG:灯具类型的ID作为重新加载在我的主要程序:149507748

的最终的结果是,我想不出一种方式来检查我的腌制数据。除非任何人有任何天才的建议,我想我会打鸭子。

+0

Yuo没有检查相同的对象*。您正在比较'fix.Fixture'实例和'game_object.GameObject'。显然这些不是同一类型的对象。我认为你误解了你的代码的作用,这与Pickle有什么关系。 – 2013-04-22 10:57:06

+0

也许我不够清楚。 'isinstance()',给定一个'fix.Fixture'的实例,并且'game_object.GameObject'类返回'False'。这就是为什么我调查了这两个。 – 2013-04-22 11:05:35

+0

而'fix.Fixture'应该是'game_object.GameObject'的子类吗? – 2013-04-22 11:06:08

回答

0

AFAIK,这不可能以任何简单的方式;类型检查与不同会话中挑选的数据不兼容。在类型检查方面,我不是一个狂热的人,但我喜欢什么是有效的。

+0

Pickle应该给你*相同的类型*;它使用与原始类相同的类引用(模块 - >类定义)。你的代码有其他问题。 – 2013-04-22 10:55:28

+0

一个类是一个对象。当您重新加载模块时,在不同的会话中,您将创建一个不同的类对象。例如,请参阅http://stackoverflow.com/a/620866/1151229 – 2013-04-22 11:17:13

+0

如果通过不同的会话表示新的解释器,那么*您的诊断错误*。在这个新的会话中,'pickle'将使用相同的类来取消你正在用来测试'isinstance()'的东西。除非在新课程中,班级在此期间已交换。 – 2013-04-22 11:20:31

相关问题