반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 네트워크
- 소프트웨어
- 클라우드컴퓨팅
- I'm Sorry
- 프로그래밍언어
- 알고리즘
- 데이터과학
- 딥러닝
- 데이터베이스
- 프로그래밍
- 버전관리
- 인공지능
- Yes
- 자료구조
- 빅데이터
- 사이버보안
- 웹개발
- 자바스크립트
- 2
- 코딩
- 컴퓨터공학
- 네트워크보안
- 데이터분석
- 파이썬
- 컴퓨터비전
- 컴퓨터과학
- 보안
- 소프트웨어공학
- 머신러닝
- 데이터구조
Archives
- Today
- Total
스택큐힙리스트
StringIO.close()를 해야합니까? 본문
반응형
몇몇 코드:
import cStringIO
def f():
buffer = cStringIO.StringIO()
buffer.write('something')
return buffer.getvalue()
문서에 따르면:
StringIO.close()
: 메모리 버퍼를 해제합니다. 닫힌 StringIO 객체로 추가적인 작업을 시도하면 ValueError가 발생합니다.
buffer.close()
를 수동으로 해야 되나요, 아니면 버퍼가 범위를 벗어나게 되어 자동으로 해제될까요?
업데이트:
테스트를 해보았습니다:
import StringIO, weakref
def handler(ref):
print 'Buffer died!'
def f():
buffer = StringIO.StringIO()
ref = weakref.ref(buffer, handler)
buffer.write('something')
return buffer.getvalue()
print 'f() 호출 전'
f()
print 'f() 호출 후'
결과:
vic@wic:~/projects$ python test.py
f() 이전
버퍼가 사망했습니다!
f() 이후
vic@wic:~/projects$
답변 1
일반적으로는 여전히 close()
를 호출하거나 with
문을 사용하는 것이 좋습니다. 특수한 경우에는 예기치 않은 동작이 발생할 수 있기 때문입니다. 예를 들어, expat-IncrementalParser
는 파일이 닫히기를 기대하고 있으며, 특정한 상황에서는 마지막으로 파싱된 XML의 일부 내용을 타임아웃이 발생하기 전까지 반환하지 않을 수 있습니다.
하지만 with
문을 사용할 경우 자동으로 닫힘 처리를 해주므로, Ivc의 코멘트에서 언급한대로 io
-모듈의 StringIO
클래스를 사용해야 합니다.
이는 어떤 레거시 SAX 파서 스크립트에서 발생한 큰 문제를 수동으로 StringIO
를 닫음으로써 해결한 것입니다.
스코프를 벗어난 닫기(close)는 동작하지 않았습니다. 그냥 타임아웃을 기다리다가 종료됩니다.
답변 2
당신이 반드시 StringIO.close()를 해야 할까요?StringIO.close()는 Python에서 StringIO 객체를 닫는 메서드입니다. StringIO는 메모리에 있는 문자열을 파일 객체처럼 다룰 수 있게 해주는 클래스입니다. 그렇다면 StringIO.close()를 호출해야 할까요?
아니요, StringIO.close()를 반드시 호출할 필요는 없습니다. StringIO 객체는 메모리에서 파일과 달리 자동으로 해제되므로, 명시적으로 close() 메서드를 호출하는 것은 필요하지 않습니다. Python에서는 파일을 다룰 때에는 명시적으로 close() 메서드를 호출하여 자원을 해제해야 하는 경우가 있습니다. 예를 들어, 외부 파일로부터 데이터를 읽거나 쓰고 작업이 끝난 후 해당 파일을 닫아야 한다면 close() 메서드를 호출해야 합니다. 그러나 StringIO는 메모리에서만 작동하기 때문에 close() 메서드를 호출하지 않아도 자동으로 해제되므로 안심하셔도 됩니다.
StringIO를 사용하는 다른 목적 중 하나는 문자열 데이터를 파일과 유사하게 처리하는 것입니다. 따라서 파일 처리 코드와 유사한 방식으로 StringIO 객체를 사용할 수 있으며, 일반적인 파일 작업과 롤백 방법도 동일하게 적용할 수 있습니다. 그러나 close() 호출은 이에 해당하지 않습니다. StringIO 객체는 메모리 내에서만 작동하며, 일반 파일과 다르게 자동으로 해제되기 때문에 언제든지 간단하게 사용할 수 있습니다.
요약하자면, StringIO.close()를 호출할 필요는 없습니다. StringIO 객체는 자동으로 메모리에서 해제되기 때문에 close() 메서드를 명시적으로 호출할 필요가 없습니다. StringIO는 문자열 데이터를 파일과 유사하게 다룰 수 있는 유용한 기능을 제공하므로, 필요한 경우에 사용하면 됩니다.
반응형
Comments