Python 知道某个对象但无法检索该对象

Python 知道某个对象但无法检索该对象,python,serialization,pickle,Python,Serialization,Pickle,在玩了很多游戏之后,我发现了一些奇怪行为的解决方法,但我想了解发生了什么。很抱歉,如果我缺少基本的东西,但我在python方面非常缺乏经验 所以 我将一个对象存储在一个脚本中,并在另一个脚本中检索-如果我使用我的变通方法,所有这些都可以正常工作 推送复制类.y class MyClass(): def __init__(self, name ): self.name = name self.othername = "%s" % n

在玩了很多游戏之后,我发现了一些奇怪行为的解决方法,但我想了解发生了什么。很抱歉,如果我缺少基本的东西,但我在python方面非常缺乏经验

所以

我将一个对象存储在一个脚本中,并在另一个脚本中检索-如果我使用我的变通方法,所有这些都可以正常工作

推送复制类.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
spow_repro2.py
(这是要运行的第二个脚本)

两个问题:

  • 如果我将
    self.othername=“%s”%name
    替换为
    self.othername=name
    ,则我将无法从SHOW检索数据。这个解决方法花了我很长时间才弄明白,所以我觉得有一些可疑的事情需要我去发现,否则我会经常感到惊讶。我在想,这里可能有一个深/浅复制的问题,但考虑到我认为字符串是不可变的,除了深-对吗
  • 不管我的解决方法是什么,怎么可能
    data.keys()
    有我的
    'somename'
    键,但是
    data['somename']
    不起作用
  • 如果未显式导入
    MyClass
    ,则似乎
    show_repro2.py
    仍然有效。这是否意味着SHOW对象存储类定义

  • 太多了

    关于1:没有您的变通方法(可以用更简单的
    name[:]
    btw替换)
    self.name
    self.othername
    都包含完全相同的实例。#2:
    base.py
    中的
    getitem\uuuuuuu
    中的
    FileBase
    使用一个
    try/except
    对,该对捕获任何异常并将其作为keyrerror重新评估。基本异常实际上是一个
    BadPickleGet:5
    错误。@JPvdMerwe thx的名称为[:]thingy,但我不明白为什么它们会有相同的实例,这不像我做的那样
    self.name=self.othername=name
    @DSM-我怀疑这是一个酸洗问题-这就是为什么我添加pickle作为关键字;-)但我还是不明白为什么it@cozycoding:与其他一些语言不同,在Python中执行
    a=b
    时,不创建副本。所发生的一切就是让
    a
    充当
    b
    包含的实例的另一个别名。
    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()
    
    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) !