たくさん遊んだ後、奇妙な動作の回避策を見つけましたが、何が起こっているのかを理解したいと思います。初歩的なことが欠けている場合は申し訳ありませんが、私は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) !
いくつかの質問:
- それまでに置き換える
self.othername = "%s" % name
とself.othername = name
、Shove からデータを取得できなくなります。この回避策を理解するのに長い時間がかかったので、何か怪しいものが出てきて、それを知る必要があると感じています。ここに深い/浅いコピーの問題があるのではないかと考えていましたが、文字列は不変であると考えると、深いコピー以外に可能なコピーはないはずです-そうですか? - 私の回避策に関係なく、キーを
data.keys()
持っているのに機能しない可能性はありますか?'somename'
data['somename']
- 明示的にインポートされていない
shove_repro2.py
場合でも機能するようです。MyClass
これは、shove オブジェクトにクラス定義が格納されているということですか?
どうも!