"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python 데코레이터 이해: 심층 분석

Python 데코레이터 이해: 심층 분석

2024-11-08에 게시됨
검색:533

파이썬 데코레이터는 함수나 메서드의 동작을 수정하거나 향상시킬 수 있는 강력한 도구입니다. 일반적인 사용 사례에는 로깅, 승인 등이 포함됩니다.
그러나 데코레이터를 정의하라는 요청을 받으면 많은 사람들이

라고 말할 것입니다.

함수에 대한 래퍼입니다.

이는 기술적으로는 정확하지만 내부적으로는 훨씬 더 많은 일이 일어나고 있습니다.

간단한 데코레이터 분석
간단한 예를 살펴보겠습니다.

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

여기서 my_ decorator는 say_hello 함수의 데코레이터입니다. say_hello가 정의되면 자동으로 my_ decorator에 전달되어 함수 호출을 다음과 같이 변환합니다.
say_hello = 내_장식자(say_hello)

이 변화는 언제 발생합니까?
이 변환은 코드 컴파일 중에, 특히 실행 시간이 아닌 함수 정의 시간에 발생합니다.

코드 분해
데코레이터가 낮은 수준에서 작동하는 방식을 이해하기 위해 dis 모듈을 사용하여 데코레이팅된 함수의 바이트코드를 검사할 수 있습니다:

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)

바이트코드 분석

dis.dis(say_hello)의 출력은 다음과 같습니다.

Understanding Python Decorators: A Deep Dive
바이트코드 설명

  1. 함수 호출 전

    • LOAD_GLOBAL: 인쇄 기능을 로드합니다.
    • LOAD_CONST: '함수 호출 전' 메시지를 로드합니다.
    • CALL_FUNCTION: 인쇄를 호출합니다.
    • POP_TOP: 반환 값을 삭제합니다.
  2. 원래 함수 호출

    • LOAD_DEREF: 클로저에 의해 캡처된 원래 함수(func)를 로드합니다.
    • LOAD_FAST: 위치 및 키워드 인수를 로드합니다.
    • BUILD_MAP: 키워드 인수에 대한 새 사전을 생성합니다.
    • CALL_FUNCTION_EX: 인수를 사용하여 원래 함수를 호출합니다.
    • STORE_FAST: 결과를 지역 변수에 저장합니다.
  3. 함수 호출 후

    • 첫 번째 부분과 유사하게 print를 호출하여 '함수 호출 후'를 출력합니다.
    • 결과 반환
    • 결과 변수를 로드하고 반환합니다.

결론
Python 데코레이터는 단순한 함수 래퍼 그 이상입니다. 이를 통해 정의 시 함수 동작을 수정할 수 있습니다. 데코레이터의 작동 방식을 이해하고 바이트코드를 검토함으로써 프로젝트에서 데코레이터를 보다 효과적으로 사용할 수 있습니다.

지금은 그게 다입니다! 제가 더 자세히 알아보고 싶은 내용이 있으면 알려주세요!

릴리스 선언문 이 글은 https://dev.to/aman-giri/understanding-python-designators-a-deep-dive-pp0?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3