2014-09-06 2 views
4

은 내가 다음 줄을 실행할 때 오류 메시지가 :딥 복사본을 만들 수없는 개체가 있습니까?

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() 

문제는 크기 검사가 파일을 "파괴"한다는 것이다. 파일 크기를 확인한 다음 저장하면 디스크에 빈 파일이 생깁니다. 그래서 파일 객체의 복사본을 만들고 복사본의 크기를 확인한 다음 크기가 맞으면 원본 파일 객체를 디스크에 저장하려고했습니다.

+0

[Python : deepcopy가 사용자 정의 클래스에서 작동하지 않습니까?] (http://stackoverflow.com/questions/18364284/python-deepcopy-does-not-work-on-user-defined)의 복제본입니까? - 클래스)? – dawg

+2

'FileStorage'가 딥 카피가 가능하지 않고 그 질문의 딥 카피가 작동하지만 OP가 예상대로되지 않는 다른 이유가 있기 때문에 중복이 아닙니다. – abarnert

답변

3

딥 복사본을 만들 수없는 개체가 있습니까?

예.

형식이 __deepcopy__ 표준을 무시하거나 (copyreg에 등록) 예외를 발생시키는 함수는 딥 복사 할 수 없습니다.

__deepcopy__ 표준을 사용하지만 (얕은) 복사 할 수없는 유형의 객체는 모두 복사 할 수 없습니다.

딥 - 카피 할 수없는 서브 - 엘리먼트 (표준 __deepcopy__에 의해 선택 되든 또는 그 자체의 구현으로 선택 되든)를 갖는 임의의 객체는 딥 - 카피 될 수 없다.

그리고 얕게 복사 할 수없는 많은 종류의 개체가 있습니다. copy 모듈의 문서는 몇 가지 예를 제공합니다

모듈, 방법, 스택 추적, 스택 프레임, 파일, 소켓, 창, 배열, 또는 유사한 유형과 같은 유형을 복사하지 않습니다이 모듈.

아니가? 불가능이 파일을 복사하지만 의미 무슨 일이 매우 모호 (이 파일 핸들을 DUP해야 파일을 다시하거나 처리 공유 될이 같은으로 시작해야 함 파일 포인터? 버퍼 또는 상태 저장 인코더가 같은 상태에 있어야합니까?), 복사 가능하도록 만드는 것보다 오도 된 것입니다.

물론 Werkzeug 프레임 워크는 표준 파이썬 파일 객체가 없어도 FileStorage 객체를 복사 가능하도록 선택할 수 있었지만 그렇지 않은 이유는 같았습니다. 에서

2

확실히 deepcopied 수없는 형식을 만들 수 있습니다. The documentation는 말한다 :

자체 사본 구현을 정의하는 클래스 위해서는 특별한 방법 __copy__()__deepcopy__()을 정의 할 수 있습니다.

따라서 클래스는 거기에서 예외를 발생시킴으로써 자체를 삭제 취소 할 수 있습니다.

개념적으로 파일과 같은 것은 깊은 복사가 불가능한 것일뿐입니다. 파일과 같은 것을 복사하는 것은 실제 파일을 디스크에 복사하는 것과 관련이 있습니다. 파일이 크면 비용이 많이들 수 있습니다. 사용자에게 올바른 사용 권한이 없거나 디스크가 꽉 찬 경우에는 가능하지 않을 수 있습니다. 리소스에 제한되지 않은 일부 리소스를 복사하려고 할 때 발생할 수있는 가능한 모든 문제가 있습니다. 프로그램 자체. 따라서 외부 리소스를 참조하는 개체는 복사 할 수 없게 될 수 있습니다. 정말로 deepcopy하려는 경우 외부 리소스를 수동으로 복사하고 새 객체를 만들어야합니다.

1

copy 모듈의 documentation :

모듈, 방법, 스택 추적, 스택 프레임, 파일, 소켓, 창, 배열, 또는 유사한 유형과 같은 유형을 복사하지 않습니다이 모듈. werkzeug.datastructures.FileStorage 이후

나는 그것이 위에 인용 한 텍스트 당 file에 "유사한 유형"으로 간주 말하고 싶지만, "a thin wrapper over incoming files"입니다.

관련 문제