0

本当に厄介なバグがあり、ついに追跡しました。

スタンドアロン スクリプトを使用して (より正確には、既に使用しています)、オブジェクトのストアを作成した後、このデータ構造をピクルします。その後、プログラムを実行するたびに、デシリアライズされたデータでメイン プログラムを初期化できます。

ただし、型チェックを使用すると、これが問題になります。pickle.dump() を実行してこのデータ構造を取得した後、オブジェクトのタイプをチェックするように設定しました。残念ながら、私がチェックできる唯一のことは、クラスの新しいリロードであり、Python はこれを別個のものとして認識します。

DEBUG: Object I am type-checking: >> Fixture {name: 'Front Desk', location: '0', desc: 'The front desk has a sign that read...'} <<
DEBUG: 一般的なゲームオブジェクト: >> ゲームオブジェクト {name: '', location: 'None', desc: '...' } <<

(オブジェクト表現が非常に似ていることがわかります。これは、一方__repr__が他方から継承するためです。つまり、オブジェクトのインスタンスである必要があります。)

DEBUG: タイプチェックしているオブジェクトのタイプ: {class 'chimai.chimai.objects.fix.Fixture'}
DEBUG: ジェネリック GameObject のタイプ: {class 'objects.game_object.GameObject'}
DEBUG: オブジェクト I' の MRO m type-checking: ({class 'chimai.chimai.objects.fix.Fixture'}, {class 'chimai.chimai.objects.game_object.GameObject'}, {type 'object'})
DEBUG: ジェネリック GameObject の MRO : ({class 'objects.game_object.GameObject'}, {type 'object'})

(GameObject クラスの識別子はわずかに異なります。これは、最初にスタンドアロン スクリプトを実行した場所に由来します。)

DEBUG: pickled フィクスチャ タイプの ID: 173671604
DEBUG: メイン プログラムでリロードされたフィクスチャ タイプの ID: 149507748

最終結果は、ピクルス化されたデータを型チェックする方法がまったく思いつかないということです。誰かが天才的な提案を持っていない限り、私はダックタイピングになると思います.

4

1 に答える 1

0

私の知る限り、簡単な方法では不可能です。型チェックは、別のセッションでピクルされたデータと互換性がありません。私は型チェックに関しては熱狂的ではありませんが、機能するものは好きです。

于 2013-04-22T10:52:05.363 に答える