pypar と mpich2 を使用して複数のノード間でデータを送信するレガシー python コードがあります。何らかの理由でデータはシェルフに保持され、pypar はシェルフをピクルして他のノードに送信したいと考えています。酸洗い棚は許可されていません。だから私はシェルブから、他のノードに送信する前にそれをピクルするpypar経由で送信できるものに変換したいと考えています。助言がありますか?棚をjsonに変換してピクルできますか?
2 に答える
1
シェルフを に変換してからdict()
、酸洗してみてください。
sdb = shelve.open('foo.db')
sdb['abc'] = {'a': 1, 'b': 2}
tmp = cPickle.dumps(dict(sdb), 2)
print cPickle.loads(tmp)
{'abc': {'a': 1, 'b': 2}}
更新: (コメント内の質問への回答): Adict
は任意のマッピング オブジェクトからキー値をコピーできるため、そのオブジェクトがメソッドkeys
を実装していれば機能します__getitem__
。shelve はマッピング オブジェクトであるため、dict
コピー コンストラクターは shelve からキー値を読み取ることができ、結果の dict をピクルして他のホストに送信できます。
dict
以下の例は、オブジェクトをコピーするために必要な最小限のインターフェイスを示しています。
class Foo(object):
def __init__(self):
self.value = 0
def keys(self):
return ['a', 'b']
def __getitem__(self, key):
v = self.value
self.value += 1
return self.value
foo = Foo()
print dict(foo)
print dict(foo)
出力
{'a': 1, 'b': 2}
{'a': 3, 'b': 4}
更新:辞書の内容をシェルブに追加するには、次を使用しますupdate()
。
d = {'a': 1, 'b': 2}
s = shelve.open('foo.db')
s.update(d)
print s
{'a': 1, 'b': 2}
于 2011-03-11T03:49:57.933 に答える