python 용어정리 (데코레이터 와 컨텍스트 매니저)

2024. 10. 8. 21:11·용어정리/Python

데코레이터

데코레이터란 

데코레이터란 어떠한 함수의 실행 전 후로 추가 덧뎀을 해 줄수 있는 함수이다.

 

즉 기존 함수에 추가적인 작업을 해야할때, 새로 만들거나 원 함수를 변경시키기 곤란할때, 

 

데코레이터를 사용 할 수 있다.

 

#데코레이터 함수 만들기 
def log_decorator(func):

#함수를 감싸는 레퍼 함수에는 기존의 함수가 어떤 매개변수를 받을지 모르니
#*args와 *kwargs 즉 가변 매개변수를 써서 유연하게 대처하게 해준다.
    def wrapper(*args, **kwargs):
    
#데코레이터는 코드의 전 과 후에 작용 할 수 있다.
        print(f"실행 전: {func.__name__}")
      
#본 함수의 실행
        result = func(*args, **kwargs)
        
        print(f"실행 후: {func.__name__}")
        return result
    return wrapper

#데코레이터
@log_decorator
def say_hello(name):
    print(f"안녕하세요, {name}님!")

#함수의 호출은 기존의 함수를 그대로 불러오면 된다.
say_hello("Alice")

>>

 

 

 

 

 

궁금해요!

Q, wrapper 와 func에 가변 매개변수는 왜 들어가 있나요?

    >> 예시에 원 함수에는 name이라는 매개변수를 필요로 하는데, 이와 같이 wrapper로 감쌀 원 함수들에

          매개변수로 인한 인수의 값이 어떤 것이 될지 모르기 때문에, 가변 매개변수를 사용하여, 유동적으로

          데이터를 처리 하기 위함 입니다.

 

Q. 데코레이터에서 원 함수의 함수를 변경 하여 반환 할 수 있나요?

    >> 불가능 합니다.  이는 상속 과 같이 원 데이터는 건들일 수 없습니다. 그렇게 사용을 하시고 싶으시다면,

          클래스를 사용하여, 오버라이딩을 하시는 것이 해결 방법이 되겠습니다.

 

Q. print 함수 안에 __name__은 뭔가요?

    >> __name__은 함수의 이름을 뜻합니다.  이는 데코레이터로 부르는 원 함수의 함수명을 지칭합니다.

          이를 매직 속성이라고 합니다. 매직 속성이란, 함수나 메서드의 특정한 속성을 나타냅니다.

 

 

 

데코레이터 체이닝

데코레이터 체이닝이란, 하나의 함수에 여러개의 데코레이터를 적용 하는 것 이며, 

이때, 데코레이터는 안쪽에서 부터 차례대로 적용 할 수 있습니다.

 

@decorator1
@decorator2
def my_function():
    pass

 

이때 데코레이터가 실행되는 순서는 @decorator 2 부터 입니다.

 

★ pass는 함수 또는 메서드에서 아무 작용을 하지 않을떄, 오류가 뜨지 않고 넘기기 위함 입니다.

 

 

 

 

 

컨텍스트 매니저

컨텍스트 매니저 즉 with 구문은 어떠한 리소스를 획득했을때, 자동으로 정리 해주는 메커니즘 이다.

 

 

컨텍스트 매니저의 기본 구조를 보자.

with 컨텍스트매니저 as 변수:
    # 작업 수행

 

 

이는 우리가 파일의 작업을 할때의 코드와 비슷한데,

 

with open("example.txt", "r") as file:
    content = file.read()
    print(content)

 

이 또한 with 구문을 사용하여 파일 처리를 한 것이다.

생각해 보면, with 를 파일 처리에 사용하는 이유도, close()를 하지 않아도 되기 때문이었다.

 

그렇게 생각해 보면 자동으로 정리를 해준다는 뜻을 이해하기 쉽다.

 

 

 

__enter__()

with 블록에 진입을 하기 위하여 쓰인다. 자료 즉 리소스를 준비 하거나 설정할 떄 쓰인다.

 

 

__exit__()

with 블록에서 끝날때 호출을 하며, 리소스를 정리하고 예외 처리를 할때 쓰인다.

 

 

 

class FileContextManager:
    def __init__(self, filepath, mode):
        self.filepath = filepath
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filepath, self.mode)
        print("파일을 열었습니다.")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
        print("파일을 닫았습니다.")

# 컨텍스트 매니저 사용
with FileContextManager("example.txt", "r") as file:
    content = file.read()
    print(content)

 

 

__enter__()는 파일을 열때, 행동을 하는 메서드 이므로 파일을 실행하거나, 실행한 파일에 대해 무언가

행동을 하는 (알려주기) 모습을 보인다.

 

__exit__()는 작업을 수행 후, 종료를 한다거나 예외 처리를 함으로써, 정리를 하는 모습을 보여준다.

 

_exit__()에는 매개변수가 들어가는 것을 볼 수 있는데, 이는

 

 

  1. exc_type : 예외 타입이 들어간다.
  2. exc_value : 발생한 예외의 인스턴스. 예외 객체가 전달된다.
  3. traceback : 예외가 발생한 지점의 정보를 포함하는 객체이다.

 

 

 

GPT 사용

class MyContextManager:
    def __enter__(self):
        print("리소스를 획득합니다.")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type:
            print(f"예외 타입: {exc_type}")
            print(f"예외 값: {exc_value}")
            print(f"트레이스백 정보: {traceback}")
        print("리소스를 정리합니다.")

# 컨텍스트 매니저 사용
try:
    with MyContextManager():
        print("작업 수행 중...")
        raise ValueError("예제 예외 발생!")
except ValueError:
    print("예외를 잡았습니다.")
    
    
    
>> 리소스를 획득합니다.
   작업 수행 중...
   예외 타입: <class 'ValueError'>
   예외 값: 예제 예외 발생!
   트레이스백 정보: <traceback object at 0x...>
   리소스를 정리합니다.
   예외를 잡았습니다.

 

 

이 예제에서는 try except로 예외 코드를 정해 두엇지만,

 

close()에서는 기본적으로 예외를 자동으로 처리해주기 떄문에,

 

만약 예외 처리를 하지 않은 상태에서, 예외가 일어난다 해도 프로그램이 종료되는 것이 아닌,

예외 처리를  하게 된다.

저작자표시 비영리 변경금지 (새창열림)

'용어정리 > Python' 카테고리의 다른 글

python 용어정리 (Django)  (0) 2024.10.10
python 용어정리 (프레임워크와 라이브러리)  (0) 2024.10.10
python 용어정리 (이터레이터와 친구들)  (0) 2024.10.08
python 용어정리 (파일 다루기)  (0) 2024.10.08
python 용어정리 (메서드 친구들)  (1) 2024.10.07
'용어정리/Python' 카테고리의 다른 글
  • python 용어정리 (Django)
  • python 용어정리 (프레임워크와 라이브러리)
  • python 용어정리 (이터레이터와 친구들)
  • python 용어정리 (파일 다루기)
코드 유랑자 승열
코드 유랑자 승열
코드 유랑자 승열의 프로그래밍 일지를 남기는 공간입니다.
  • 코드 유랑자 승열
    승열의 프로그래밍 시네마
    코드 유랑자 승열
  • 전체
    오늘
    어제
  • 링크

    • 깃허브 보러가기
    • 링크드인 보러가기
    • 인스타그램 보러가기
    • 카테고리
      • 코딩테스트
        • BaekJoon
      • TIL and WIL
        • TIL
        • WIL
      • 주말스터디
      • 내일배움캠프
        • 사전캠프 강의 (SQL)
      • 용어정리
        • Python
        • Python-Library
        • Machine-Learning
        • Deep-Learning
        • AI 활용
        • LLM & RAG
        • Docker
        • Django
        • SQL
        • Java Script
        • etc
      • Daily 코드카타
        • SQL
        • Python 알고리즘
      • 임시저장
      • 보류
  • 태그

    langchain
    word2vec
    티스토리챌린지
    RAG
    vector db
    llm
    template
    django
    오블완
    View
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코드 유랑자 승열
python 용어정리 (데코레이터 와 컨텍스트 매니저)
상단으로

티스토리툴바