의 문은 내가 좋아하는 기능이 있나요? "with"문을 무시할 수 있습니까? 즉, 메모리 누수의 관점에서 보면 안전하고 동등한 것입니까?파일 열기 및 파이썬
def func(filename):
return [line.split('\t')[0] for line in open(filename)]
?
의 문은 내가 좋아하는 기능이 있나요? "with"문을 무시할 수 있습니까? 즉, 메모리 누수의 관점에서 보면 안전하고 동등한 것입니까?파일 열기 및 파이썬
def func(filename):
return [line.split('\t')[0] for line in open(filename)]
?
안전합니다. 컨텍스트 관리자의 __exit__
은 컨텍스트 내부에서 return
인 경우에도 호출되므로 파일 핸들이 제대로 닫힙니다. 당신이 test()
를 호출 할 때
class ContextTest(object):
def __enter__(self):
print('Enter')
def __exit__(self, type, value, traceback):
print('Exit')
def test():
with ContextTest() as foo:
print('Inside')
return
, 당신이 얻을 :
다음은 간단한 테스트입니다
Enter
Inside
Exit
이 안전 실제로 with...as...
구문의 전체 목적은 보장; 그렇지 않으면 매우 어색 할 블록 try
/finally
을 대체합니다. 그래서 예, 안전하다는 보장이 있습니다. 그래서 나는 멀리 with open as f
에서 f = open
까지 선호합니다.
구문이 존재하는 이유와 작동 원리에 대한 설명은 http://effbot.org/zone/python-with-statement.htm을 참조하십시오. __enter__
및 __exit__
메서드로 클래스를 작성하면이 구문을 실제로 활용할 수 있습니다.
또한이 기능에 대한 PEP를 참조하십시오 http://www.python.org/dev/peps/pep-0343/
미안 그것은 나에게 매우 명확하지 않다 나는 두 번째 대안 '과'하고 사용을 무시할 수 있습니까? – elyase
@elyase : 두 예제 모두 메모리 누수가 없지만 두 번째 파일 핸들을 명시 적으로 닫지 않아 문제가 발생할 수 있습니다. http://stackoverflow.com/questions/4599980/python-close-file -descriptor-question – Blender
좋은 예! '... as test '를 다른 것으로 변경하고 싶을 수도 있습니다. 함수 이름도 테스트이기 때문에 잠시 멈췄습니다. – monkut