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(这是第二个运行的脚本)

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