산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python 데코레이터 마스터하기: 전문 기법으로 함수 강화

Python 데코레이터

데코레이터로 함수를 재사용 가능 로직으로 감싸 코드 모듈성, 가독성, 유지보수성 향상. 이 가이드에서 데코레이터 구축, 설명, 실전 적용.

동영상: Python @데코레이터

Python 데코레이터

Python 데코레이터는 정의 시점에 함수나 클래스에 행동 추가하는 강력한 메타프로그래밍 도구. Python에서 모든 게 객체—함수와 클래스 포함—라 데코레이터는 호출 가능 객체 하나 받아 다른 걸로 감싸 새 호출 가능 객체 반환.


데코레이터 학습 전 선행 지식

시작 전 Python에서 함수가 퍼스트 클래스 객체란 사실 익숙해야 함. 이름은 단순히 객체에 바인딩된 참조; 같은 함수가 여러 이름으로 참조 가능.

def first(msg):
    print(msg)
first("Hello")
second = first
second("Hello")

출력

Hello Hello

함수는 인수로 전달, 다른 함수에서 반환, 다른 함수 내 중첩 가능. 이런 개념—고차 함수, 중첩 함수, 클로저—이 데코레이터 구성 요소.

def inc(x):
    return x + 1
def dec(x):
    return x - 1
def operate(func, x):
    result = func(x)
    return result

사용:

>>> operate(inc,3)
4
>>> operate(dec,3)
2
def is_called():
    def is_returned():
        print("Hello")
    return is_returned
new = is_called()
new()

출력

Hello

클로저 이해가 핵심: 중첩 함수가 외부 스코프 접근 유지, 데코레이터가 메타데이터 저장이나 행동 수정 위해 정확히 이걸 활용.


데코레이터로 돌아가기

Python에서 데코레이터는 단순히 함수(또는 다른 호출 가능 객체) 받아 새 호출 가능 객체 반환하는 호출 가능 객체. 반환 함수는 보통 원본 감싸 호출 전후 기능 추가/변경.

def make_pretty(func):
    def inner():
        print("I got decorated")
        func()
    return inner
def ordinary():
    print("I am ordinary")

예제 사용:

>>> ordinary()
I am ordinary
>>> pretty = make_pretty(ordinary)
>>> pretty()
I got decorated
I am ordinary

데코레이터 패턴은 원본 함수 의미 유지하며 보강. 수동 재할당 피하려 Python이 @ 심볼로 문법적 설탕 제공:

@make_pretty
def ordinary():
    print("I am ordinary")

이는 다음과 동등:

def ordinary():
    print("I am ordinary")
ordinary = make_pretty(ordinary)

매개변수 있는 함수 데코레이팅

많은 데코레이터가 임의 인수 처리 필요. *args와 **kwargs 문법으로 모든 위치/키워드 인수 캡처해 그대로 전달.

def works_for_all(func):
    def inner(*args, **kwargs):
        print("I can decorate any function")
        return func(*args, **kwargs)
    return inner

예외 상황 처리도 흔한 데코레이터 용례. 예: 0 나누기 방지:

def smart_divide(func):
    def inner(a, b):
        print("I am going to divide", a, "and", b)
        if b == 0:
            print("Whoops! cannot divide")
            return
        return func(a, b)
    return inner
@smart_divide
def divide(a, b):
    print(a/b)

사용:

>>> divide(2,5)
I am going to divide 2 and 5
0.4
>>> divide(2,0)
I am going to divide 2 and 0
Whoops! cannot divide

Python 데코레이터 체이닝

데코레이터 중첩 가능. 적용 순서 중요—각 데코레이터가 아래 것 반환 함수 받음.

def star(func):
    def inner(*args, **kwargs):
        print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
    return inner
def percent(func):
    def inner(*args, **kwargs):
        print("%" * 30)
        func(*args, **kwargs)
        print("%" * 30)
    return inner
@star
@percent
def printer(msg):
    print(msg)

결과:

******************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
******************************

순서 뒤집으면 감싸는 패턴 교체돼 데코레이터 스택이 행동에 영향 주는 것 확인.


python

  1. 파이썬 데이터 타입 마스터하기: 실전 가이드
  2. 파이썬 연산자 마스터하기: 종합 가이드
  3. 파이썬 pass 문 마스터하기: 실전 가이드
  4. 파이썬 함수 인자 마스터하기: 위치, 키워드, 기본 매개변수
  5. 파이썬 람다 함수: 익명 함수 실전 가이드
  6. 파이썬 람다 함수 마스터하기: 실용 예제 & 모범 사례
  7. 파이썬 abs() 함수: 숫자 & 복소수의 절댓값 구하기
  8. 파이썬 round() 함수 완전 정복: 실용 예제로 이해하기
  9. 파이썬 range() 함수 마스터하기: 기초부터 고급 활용까지
  10. 파이썬 map() 함수 마스터하기: 문법, 예제, 모범 사례