社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中的copy和deepcopy帮助

PizzAzzra • 7 年前 • 2456 次点击  

我想我试着要求太多了 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 年前