Py学习  »  Python

python中的copy和deepcopy帮助

PizzAzzra • 7 年前 • 2479 次点击  

我想我试着要求太多了 my previous question 为此道歉。这次让我以尽可能简单的方式阐述我的处境。

基本上,我有一堆引用我的对象的字典,它们依次使用sqlAlchemy映射。我没事。但是,我想对那些字典的内容进行迭代更改。问题是这样做会改变它们引用的对象---并且使用copy.copy()没有什么好处,因为它只复制字典中包含的引用。因此,即使复制了一些东西,当我试图,说 print 字典的内容,我将只获取对象的最新更新值。

这就是为什么我想使用copy.deepcopy(),但这不适用于sqlacalchemy。现在我陷入了困境,因为我需要在进行上述迭代更改之前复制对象的某些属性。

总之,我需要使用sqlacalchemy 和 同时,确保在进行更改时可以复制对象属性,这样就不会更改引用的对象本身。

有什么建议、帮助、建议等吗?


Edit: 添加了一些代码。

class Student(object):
    def __init__(self, sid, name, allocated_proj_ref, allocated_rank):
        self.sid = sid
        self.name = name
        self.allocated_proj_ref = None
        self.allocated_rank = None

students_table = Table('studs', metadata,
    Column('sid', Integer, primary_key=True),
    Column('name', String),
    Column('allocated_proj_ref', Integer, ForeignKey('projs.proj_id')),
    Column('allocated_rank', Integer)
)

mapper(Student, students_table, properties={'proj' : relation(Project)})

students = {}

students[sid] = Student(sid, name, allocated_project, allocated_rank)

因此,我将要更改的属性是 allocated_proj_ref 和 allocated_rank 属性。这个 students_table 使用唯一的学生ID键入( sid )


Question

我想保留上面更改的属性——我的意思是,这就是我决定使用sqla的基本原因。但是,映射对象将更改,这是不推荐的。因此,如果我对Doppelg_anger进行更改, 未映射的 对象…我能接受这些更改并更新 映射 对象。

从某种意义上说,我是跟随大卫的 secondary solution 在这里我创建了另一个未映射的类版本。


我试过用 StudentDBRecord 下面提到的解决方案出现错误!

File "Main.py", line 25, in <module>
    prefsTableFile = 'Database/prefs-table.txt')
File "/XXXX/DataReader.py", line 158, in readData
readProjectsFile(projectsFile)
File "/XXXX/DataReader.py", line 66, in readProjectsFile
supervisors[ee_id] = Supervisor(ee_id, name, original_quota, loading_limit)
File "<string>", line 4, in __init__
raise exc.UnmappedClassError(class_)
sqlalchemy.orm.exc.UnmappedClassError: Class 'ProjectParties.Student' is not mapped

这是不是意味着 Student 必须 被映射?


Health warning!

有人在这里指出了一个很好的附加问题。看,即使我在打电话 copy.deepcopy() 在一个未映射的对象上,在本例中,假设它是我在上面定义的学生词典,Deepcopy复制了 一切 . 我的 分配的项目参考 实际上是 Project 对象,我有一个对应的 projects 字典。

所以我把两者都复制了 students 和 项目 --我是——他说我会有 学生 的 分配的项目参考 属性与中的实例匹配时将出现问题 项目 字典。

因此,我认为我必须重新定义/重写(这就是它所称的,不是吗?) deepcopy 在每个类中使用 def __deecopy__(self, memo): 或者类似的?


我想重写一下 __deepcopy__ 这样它就忽略了所有的sqla内容(即 <class 'sqlalchemy.util.symbol'> 和 <class 'sqlalchemy.orm.state.InstanceState'> )但复制属于映射类的所有其他内容。

有什么建议吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30929
文章 [ 2 ]  |  最新文章 7 年前