【发布时间】:2013-04-22 10:52:05
【问题描述】:
我有一个非常烦人的错误,我终于找到了它。
我使用(或更准确地说,已经使用过)一个独立的脚本来创建对象存储,然后我腌制这个数据结构。然后,我可以在每次程序运行时使用反序列化数据初始化我的主程序。
但是,如果我使用类型检查,这将成为一个问题。在我做 pickle.dump() 并得到这个数据结构之后,我设置了它,以便我尝试检查一个对象的类型。不幸的是,我唯一可以检查的就是我的类的 new 重新加载,Python 认为这是不同的。
DEBUG: 我正在检查对象:>> Fixture {name: 'Front Desk', location: '0', desc: 'The front desk has a sign that read...'} 调试:通用游戏对象:>> GameObject {name: '', location: 'None', desc: '...' }
(您可以看到对象表示看起来非常相似。这是因为一个从另一个继承__repr__,即应该是它的一个实例。)
调试:我正在类型检查的对象类型:{class 'chimai.chimai.objects.fix.Fixture'}
调试:通用游戏对象的类型:{class 'objects.game_object.GameObject'}
调试:我正在类型检查的对象的 MRO:({class 'chimai.chimai.objects.fix.Fixture'},{class 'chimai.chimai.objects.game_object.GameObject'},{type 'object'} )
调试:通用游戏对象的 MRO:({class 'objects.game_object.GameObject'}, {type 'object'})
(GameObject 类的标识符略有不同;这来自我最初运行独立脚本的位置。)
调试:腌制夹具类型的 ID:173671604
调试:在我的主程序中重新加载的夹具类型 ID:149507748
最终结果是,我根本想不出一种方法来检查我的腌制数据。除非有人有任何天才的建议,否则我想我会是鸭子打字。
【问题讨论】:
-
你没有检查同一个对象根本。您将
fix.Fixture实例与game_object.GameObject进行比较。显然,这些不是同一类型的对象。我认为您误解了您的代码的作用,这与 Pickle 无关。 -
也许我不够清楚。
isinstance(),给定fix.Fixture的实例,类game_object.GameObject返回False。这就是我研究这两个的原因。 -
而
fix.Fixture应该是game_object.GameObject的子类吗? -
看看我刚刚发布的 MRO。
fix.Fixture确实是game_object.GameObject的直接子类。但是,那个特定的fix.Fixture实例是与我比较的game_object.GameObject不同的子类。例如,请参阅 stackoverflow.com/questions/620844/… 和 stackoverflow.com/questions/15876395/… -
这是因为在一个会话中进行酸洗并在另一个会话中使用数据时,您实际上已经加载了两个不同的时间类,这会分别创建一个不同的对象。见:stackoverflow.com/a/620866/1151229
标签: python class pickle typechecking isinstance