python - 是否存在无法创建深拷贝的对象?

标签 python typeerror deep-copy werkzeug file-storage

当我执行以下行时收到错误消息:

img = copy.deepcopy(img_file_obj)

img_file_obj 具有以下类型:

<class 'werkzeug.datastructures.FileStorage'>

是否不允许创建文件存储对象的深拷贝?

已添加

我可能需要解释为什么要尝试创建文件存储对象的副本。在我执行的代码末尾:

img_obj.save(fname)

但在此之前,我会检查文件有多大。我通过以下方式进行:

img_obj.seek(0, os.SEEK_END)
size = img.tell()

问题是检查大小会“破坏”文件。如果我检查文件大小然后保存它,我会在磁盘上得到一个空文件。这就是为什么我想创建文件对象的副本,检查副本的大小,如果大小可以接受,则将原始文件对象保存在磁盘上。

最佳答案

Are there objects for which it is impossible to create a deep copy?

是的。

任何类型覆盖标准 __deepcopy__ 的对象(或向 copyreg 注册)引发异常的函数都不能被深度复制。

任何类型使用标准 __deepcopy__ 但不能被(浅)复制的对象不能被深度复制。

任何具有无法深度复制的子元素的对象(无论是通过标准 __deepcopy__ 还是它自己的实现选择)都无法进行深度复制。

而且有很多种对象是连浅拷贝都做不到的。 copy 的文档模块给出了一些例子:

This module does not copy types like module, method, stack trace, stack frame, file, socket, window, array, or any similar types.

并不是说复制文件不可能,但它的意思很模糊(它应该复制文件句柄、重新打开文件还是共享句柄?它应该以相同的文件指针?它的缓冲区或有状态编码器是否必须处于相同状态?),因此使它们可复制更多的是误导而不是帮助。

当然,Werkzeug 框架可以选择使其 FileStorage 对象可复制,即使标准 Python 文件对象不可复制,但他们可能出于相同的原因不这样做。

关于python - 是否存在无法创建深拷贝的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696954/

相关文章:

deep-copy - Perl 6 是否有内置工具来制作嵌套数据结构的深拷贝?

python - 如何在Python中创建函数的独立副本?

python - 多条件有效查询

Python 枚举类成员

带 Stripe 的 Python/Django : Error in Post request in creating stripe subscription

javascript - ionic 框架 : Reorder list error - Uncaught TypeError: Cannot read property ‘getValues’ of null

python - 如何在 PyMC3 中定义自定义先验

python-3.x - plt.imshow() 中图像数据的尺寸无效

python - 类型错误: 'int' 对象不可迭代

python - 切片操作给我的是深拷贝还是浅拷贝?