1

たくさん遊んだ後、奇妙な動作の回避策を見つけましたが、何が起こっているのかを理解したいと思います。初歩的なことが欠けている場合は申し訳ありませんが、私はPythonの経験がかなり浅いです。

そう...

あるスクリプトでShoveにオブジェクトを保存し、別のスクリプトで取得しています-回避策を使用すると、すべて正常に動作します

shove_repro_class.y

 class MyClass():
        def __init__(self, name ):
            self.name = name
            self.othername = "%s" % name    ## <=== workaround for 
                                            ## <=== self.othername = name
        def __repr__(self):
            return 'Object "%s"' % self.name

shove_repro.py(これは実行する最初のスクリプトです)

from shove import Shove
from shove_repro_class import MyClass

location = 'file://test'
#   location = 'sqlite:///test.db'  # this won't work any better
data = Shove(location)
data['somename'] = MyClass('somename')

data.close()

shove_repro2.py(これは実行する 2 番目のスクリプトです)

from shove import Shove
from shove_repro_class import MyClass

location = 'file://test'
#   location = 'sqlite:///test.db'  ## same remark as before

data = Shove(location)
print data.keys()            # prints [ 'somename' ]
print data[data.keys()[0]]   # throws an exception in some cases (see 1. below) !

いくつかの質問:

  1. それまでに置き換えるself.othername = "%s" % nameself.othername = name、Shove からデータを取得できなくなります。この回避策を理解するのに長い時間がかかったので、何か怪しいものが出てきて、それを知る必要があると感じています。ここに深い/浅いコピーの問題があるのではないかと考えていましたが、文字列は不変であると考えると、深いコピー以外に可能なコピーはないはずです-そうですか?
  2. 私の回避策に関係なく、キーをdata.keys()持っているのに機能しない可能性はありますか?'somename'data['somename']
  3. 明示的にインポートされていないshove_repro2.py場合でも機能するようです。MyClassこれは、shove オブジェクトにクラス定義が格納されているということですか?

どうも!

4

0 に答える 0