try-except 블록과 함께 python "with" 문 사용
이것이 try-except 블록과 함께 파이썬 "with" 문을 사용하는 올바른 방법입니까?
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
그렇다면 기존 방식을 고려하면 다음과 같습니다.
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
여기서 "with" 문의 주요 이점은 코드 세 줄을 제거할 수 있다는 것입니까?이 사용 사례에 대해서는 그다지 설득력이 없어 보입니다("with" 문구에 다른 용도가 있다는 것은 이해하지만).
편집: 위의 두 코드 블록의 기능이 동일합니까?
EDIT2: 처음 몇 개의 답변은 일반적으로 "with"를 사용할 경우의 이점에 대해 설명하지만, 이러한 답변은 여기서 거의 도움이 되지 않는 것처럼 보입니다.우리 모두는 수년 동안 f.close()라고 명시적으로 전화를 걸어왔습니다.한 가지 이점은 엉성한 코더가 "with"를 사용함으로써 이득을 얻을 것이라는 것입니다.
- 지정한 두 코드 블록이 동일하지 않습니다.
- 당신이 오래된 방식으로 설명한 코드는 심각한 버그를 가지고 있습니다: 파일 열기가 실패할 경우 당신은 두 번째 예외를 얻게 될 것입니다.
finally
절 이유는f
구속되지 않습니다.
이에 해당하는 이전 스타일 코드는 다음과 같습니다.
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
보다시피,with
문을 사용하면 오류 발생 가능성이 줄어듭니다.최신 버전의 Python(2.7, 3.1)에서는 여러 개의 식을 하나로 결합할 수도 있습니다.with
진술.예:
with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
그 외에도, 저는 개인적으로 어떤 예외라도 가능한 한 빨리 잡는 것을 나쁜 습관으로 생각합니다.이것은 예외의 목적이 아닙니다.IO 기능에 장애가 발생할 수 있는 IO 기능이 더 복잡한 작업의 일부인 경우 대부분의 경우 IO 오류는 전체 작업을 중단해야 하므로 외부 수준에서 처리해야 합니다.사용.with
진술, 당신은 이 모든 것을 없앨 수 있습니다.try...finally
내부 수준의 진술.
의 내용이finally
블록은 열려 있는 파일 객체의 속성에 의해 결정되는데, 왜 파일 객체의 구현자가 작성자가 되어서는 안 되는 것입니까?finally
차단? 그게 바로 그 혜택입니다.with
이 특정 인스턴스에서 세 줄의 코드를 저장하는 것보다 훨씬 더 많은 것을 설명합니다.
그리고 네, 당신이 결합한 방식은with
그리고.try-except
거의 유일한 방법입니다. 예외적인 오류가 발생하기 때문입니다.open
진술 자체는 그 안에서 포착될 수 없습니다.with
블록으로 막다
줄만 줄인다는 "with" 문구에 대해 잘못 이해하신 것 같습니다.실제로 초기화를 수행하고 해체 작업을 처리합니다.
당신의 경우 "with"는
- 파일 열기,
- 내용을 처리합니다.
- 꼭 닫아주세요.
"with" 문을 이해하기 위한 링크입니다. http://effbot.org/zone/python-with-statement.htm
편집: 예, "with"의 사용법이 올바르고 두 코드 블록의 기능이 동일합니다."with"를 사용해야 하는 이유에 대한 질문 - 실수로 f.close()를 놓쳤다고 언급한 것처럼 "with"를 사용하면 얻을 수 있는 이점 때문입니다.
다음 코드에 대한 더 파이썬적인 방법은 다음과 같습니다.
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
try:
f = open("file", "r")
except IOError:
<whatever>
else:
f.close()
언급URL : https://stackoverflow.com/questions/3642080/using-python-with-statement-with-try-except-block
'programing' 카테고리의 다른 글
PHP - 각 루프에 대한 변수 앞의 앰퍼샌드 (0) | 2023.07.25 |
---|---|
외부 키 추가 오류: ORA-02298: 유효성을 검사할 수 없음 - 상위 키를 찾을 수 없음 (0) | 2023.07.25 |
ANSI/VT100 코드를 사용한 PowerShell 콘솔의 컬러 텍스트 출력 (0) | 2023.07.25 |
Node.js가 하위 프로세스를 생성하고 터미널 출력을 라이브로 가져옵니다. (0) | 2023.07.25 |
오라클에서 날짜를 다른 형식으로 표시하는 방법 (0) | 2023.07.25 |