在玩了很多之后,我找到了一些奇怪行为的解决方法,但想了解发生了什么。抱歉,如果我缺少基本的东西,但我在 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
(这是第二个运行的脚本)
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 对象存储了类定义?
太感谢了!