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