0

ここで最初の質問をする時が来ました。次の問題に直面しています。

pickle モジュールを使用して大きな辞書をダンプし、ディスクからロードします。問題は、ピッキングを解除した後、2 つのオブジェクトが同じではないことです。実際、これは私がやっていることです:

ファイルA.pyで、いくつかの属性とメソッドを持つクラスを定義します。

ファイルB.pyで、値がクラスのインスタンスである辞書を作成しますA.py

また、ファイルB.pyで、この辞書をピクルし、再びピクルを解除します。

2 つの dict は同じではありません。キーを確認しましたが、同じです。問題は値にあります。

何か案は?

4

2 に答える 2

2

同じキーと値を持つ 2 つの異なる辞書は同一とは見なされません。

>>> d1 = {'k1': 12345}
>>> d2 = {'k1': 12345}
>>> d1 is d2
False
>>> d1['k1'] is d2['k1']
False

実際に値を一方から他方にコピーしたとしても:

>>> d1['k1'] = d2['k1']
>>> d1['k1'] is d2['k1']
True
>>> d1 is d2
False

これは、それぞれが別のコンテナーであるためです。一方、次のような式を使用して、文字通り同一のオブジェクトではなく、すべてのキーと値が等しい値を持っているかどうかを確認できます。

(set(d1) == set(d2)) and all(d1[k] == d2[k] for k in d1)

最初の部分式は、それぞれが同じ値を持つキーを持っていることを確認し、2 番目の部分式は、これらのキーのそれぞれに関連付けられた値が等しいことを確認します。

保存されたデータから辞書を再構成すると、新しい辞書が作成されます。同じ辞書にはなりませんが、すべてのキーと値は元のものと同じでなければなりません。そうでない場合は、少なくとも同じではないことを確認するために使用しているコードを提供してください。

于 2012-11-16T19:41:39.720 に答える
0

実際に辞書の値であるクラスのインスタンスは次のようになります。

class SchemaObject:
def __init__(self):
    self.type = ''
    self.name = ''
    self.parentdn = ''
    self.dn = ''
    self.oclass = ''

def initWithXMLNode(self, xmlnode, parentdn):
    self.type = ''
    self.name = ''
    self.parentdn = parentdn
    if xmlnode.nodeName=='fragments':
        self.dn = parentdn
    if xmlnode.nodeName=='fragment':
        self.initFragment(xmlnode)
    elif xmlnode.nodeName=='configGroupLdap':
        self.initGroup(xmlnode)
    elif xmlnode.nodeName=='configObjectLdap':
        self.initObject(xmlnode)

def initWithFragment(self, dn, parentdn, name):
    self.type = 'object'
    self.name = name
    self.parentdn = parentdn
    self.dn = dn
    self.oclass = name

def initFragment(self, xmlnode):
    self.type = 'fragment'
    self.dn = 'fsFragmentId=' + xmlnode.firstChild.nodeValue + ',' + self.parentdn
    self.oclass = 'FSFragment'

def initGroup(self, xmlnode):
    self.type = 'group'
    self.name = 'group-' + xmlnode.getAttribute('name')
    self.dn = xmlnode.getAttribute('dn')
    self.oclass = 'FSFragment'

def initObject(self, xmlnode):
    self.type = 'object'
    self.name = xmlnode.getAttribute('name')
    self.oclass = self.name
    if not xmlnode.hasAttribute('rdnname'):
        self.type = 'no_rdnname'
        return
    else:
        rdnname = xmlnode.getAttribute('rdnname')
    parts = rdnname.split(',')
    if xmlnode.getAttribute('multiple')!='true':
        dn = self.parentdn
        for part in reversed(parts):
            dn = 'fsFragmentId=' + part + ',' + dn
        self.dn = dn
    else:
        self.type = ''
        self.dn = 'fsFragmentId=' + parts[len(parts)-1] + ',' + self.parentdn
        dynamicStatics.append(self.oclass)

ファイル B.py で、その値がこのクラスに基づいている辞書を作成します。dict は my_dict です。また、キーが等しいことも確認しました。これらの辞書間で2つの値を比較しようとすると失敗します。

だから私はそれを漬けようとします:

 with open('my_dumped.pkl','wb') as schema:
    pickle.dump(my_dict,schema)

ディスクから復元しようとすると:

with open('my_dumped.pkl','rb') as schema:
    b = pickle.load(schema)

今私が my_dumped == b を発行した場合、これは True を返すべきではありませんか?私はアイデンティティを気にしません。

上記の等式は残念ながら False を返します。

于 2012-11-17T13:12:17.453 に答える