Rom*_*man 6 python deep-copy typeerror werkzeug file-storage
我执行以下行时收到错误消息:
img = copy.deepcopy(img_file_obj)
Run Code Online (Sandbox Code Playgroud)
该img_file_obj
有以下类型:
<class 'werkzeug.datastructures.FileStorage'>
Run Code Online (Sandbox Code Playgroud)
是否不允许创建文件存储对象的深层副本?
添加
我可能需要解释为什么我要创建文件存储对象的副本.在我的代码结束时,我执行:
img_obj.save(fname)
Run Code Online (Sandbox Code Playgroud)
但在此之前,我检查文件有多大.我是通过以下方式完成的:
img_obj.seek(0, os.SEEK_END)
size = img.tell()
Run Code Online (Sandbox Code Playgroud)
问题是检查大小"破坏"文件.如果我检查文件大小然后保存它,我会在磁盘上得到一个空文件.这就是为什么我想创建文件对象的副本,检查副本的大小,如果大小可以接受,则将原始文件对象保存在磁盘上.
是否存在无法为其创建深拷贝的对象?
是的。
任何类型覆盖标准的对象__deepcopy__
(或注册copyreg
)引发异常的函数都不能被深度复制。
任何类型使用标准__deepcopy__
但不能(浅)复制的对象都不能被深复制。
任何带有__deepcopy__
不能被深度复制的子元素(无论是由标准选择还是由它自己的实现选择)的对象都不能被深度复制。
并且有很多种类的对象甚至不能被浅拷贝。该copy
模块的文档给出了一些示例:
此模块不复制模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型等类型。
并不是说复制文件是不可能的,而是它的含义非常模糊(它应该复制文件句柄,重新打开文件还是共享句柄?它应该以相同的文件指针开头吗?它的缓冲区还是有状态的?编码器必须处于相同状态?),因此使它们可复制更容易误导而不是帮助。
当然,FileStorage
即使标准 Python 文件对象不是可复制的,Werkzeug 框架也可以选择使其对象可复制,但他们可能有同样的理由不这样做。