2013-04-22 16 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

相關問題