Python study

콘텍스트 관리자와 else 블록

adulty22 2024. 6. 4. 09:22

if문 이외에서의 else 불록

Python에서 else 블록은 조건문(if) 이외에도 반복문(for, while)과 예외 처리문(try)에서 사용될 수 있다. 각 경우에 대해 자세히 설명하겠다.

1. 반복문에서의 else 블록

반복문에서 else 블록은 반복문이 정상적으로 완료되었을 때 실행된다. 여기서 "정상적으로"라는 의미는 반복문이 break 문으로 중단되지 않고 끝까지 실행된 경우를 말한다.

for 반복문에서의 else

for i in range(5):
    if i == 3:
        break
else:
    print("반복문이 중단되지 않았습니다.")

# 결과: (출력 없음, 3에서 break로 종료)
for i in range(5):
    print(i)
else:
    print("반복문이 중단되지 않았습니다.")

# 결과:
# 0
# 1
# 2
# 3
# 4
# 반복문이 중단되지 않았습니다.

while 반복문에서의 else

count = 0
while count < 5:
    if count == 3:
        break
    count += 1
else:
    print("반복문이 중단되지 않았습니다.")

# 결과: (출력 없음, 3에서 break로 종료)
count = 0
while count < 5:
    print(count)
    count += 1
else:
    print("반복문이 중단되지 않았습니다.")

# 결과:
# 0
# 1
# 2
# 3
# 4
# 반복문이 중단되지 않았습니다.

2. 예외 처리문에서의 else 블록

예외 처리문(try)에서 else 블록은 try 블록에서 예외가 발생하지 않았을 때 실행된다. 주로 예외가 발생하지 않을 때만 실행되어야 하는 코드를 작성하는 데 유용하다.

try:
    result = 10 / 2
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
else:
    print("계산이 성공적으로 완료되었습니다.")
    print("결과:", result)

# 결과:
# 계산이 성공적으로 완료되었습니다.
# 결과: 5.0
try:
    result = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
else:
    print("계산이 성공적으로 완료되었습니다.")
    print("결과:", result)

# 결과:
# 0으로 나눌 수 없습니다.
  • 반복문 (for, while)의 else 블록: 반복문이 break로 중단되지 않고 정상적으로 완료될 때 실행된다.
  • 예외 처리문 (try)의 else 블록: try 블록에서 예외가 발생하지 않았을 때 실행된다.

이를 통해 else 블록은 다양한 상황에서 코드의 흐름을 보다 명확하게 하고, 특정 조건에서만 실행되어야 하는 코드를 분리하는 데 유용하게 사용할 수 있다.

 

콘텍스트 관리자와 with 블록

Python에서 콘텍스트 관리자(context manager)와 with 블록은 리소스의 할당과 해제를 자동으로 처리하기 위해 사용된다. 이는 파일 입출력, 네트워크 연결, 데이터베이스 연결 등 리소스를 사용한 후 명시적으로 해제해야 하는 상황에서 특히 유용하다.

콘텍스트 관리자 (Context Manager)

콘텍스트 관리자는 리소스를 할당하고 해제하는데 필요한 두 가지 메서드를 구현해야 한다:

  • enter(): 리소스를 할당하는 코드이다. with 블록이 시작될 때 실행된다.
  • exit(exc_type, exc_val, exc_tb): 리소스를 해제하는 코드이다. with 블록이 종료될 때 실행된다.

with 블록

with 블록은 콘텍스트 관리자를 사용하여 리소스를 할당하고, 블록이 종료될 때 자동으로 해제한다. 이를 통해 코드의 가독성과 안정성을 높일 수 있다.

기본 예제: 파일 입출력

with open('example.txt', 'w') as file:
    file.write('Hello, World!')

# 'example.txt' 파일은 with 블록이 끝나면 자동으로 닫힌다.

이 예제에서 open 함수는 콘텍스트 관리자이다. 파일을 열고(enter), with 블록이 끝나면 파일을 닫는다(exit).

커스텀 콘텍스트 관리자

직접 콘텍스트 관리자를 구현하는 방법을 예제로 설명하겠다.

class ManagedFile:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.file = open(self.filename, 'w')
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()

# 사용 예제
with ManagedFile('example.txt') as f:
    f.write('Hello, World!')

# 'example.txt' 파일은 with 블록이 끝나면 자동으로 닫힌다.

contextlib 모듈을 사용한 콘텍스트 관리자

Python의 contextlib 모듈을 사용하면 더 간단하게 콘텍스트 관리자를 구현할 수 있다.

contextlib.contextmanager 데코레이터

@contextmanager 데코레이터를 사용하면 제너레이터를 이용해 콘텍스트 관리자를 쉽게 작성할 수 있다.

from contextlib import contextmanager

@contextmanager
def managed_file(filename):
    file = open(filename, 'w')
    try:
        yield file
    finally:
        file.close()

# 사용 예제
with managed_file('example.txt') as f:
    f.write('Hello, World!')

# 'example.txt' 파일은 with 블록이 끝나면 자동으로 닫힌다.
  • 콘텍스트 관리자 (Context Manager): __enter__와 exit 메서드를 구현하여 리소스의 할당과 해제를 자동으로 처리하는 클래스.
  • with 블록: 콘텍스트 관리자를 사용하여 리소스를 할당하고 블록이 끝날 때 자동으로 해제.
  • 커스텀 콘텍스트 관리자: __enter__와 exit 메서드를 구현하거나 contextlib 모듈을 사용해 쉽게 구현 가능.

이를 통해 리소스 관리가 필요한 코드에서 에러 발생 시에도 안전하게 리소스를 해제할 수 있어 코드의 안정성과 가독성을 높일 수 있다.

 

모든 코드는 github에 저장되어 있습니다.

https://github.com/SeongUk18/python

728x90