TIL-077 | Python_ Closer & Decorator

8698 단어 TILpythonTIL

🌈 Closer & Decorator

🧐 그동안 프로젝트를 진행할 때 여러 기능을 구현하며 데코레이터를 활용하곤 했었지만, 클로저란 무엇인가? 데코레이터란 무엇인가? 라는 질문을 자신에게 던져보면 만족스러운 답변이 튀어 나오지 않음을 인지하였기에 한번 짚고 넘어가고자 한다.

Nested Function(중첩함수)

  • 클로저와 데코레이터에 대해 알아보기전에 함수를 중첩해서 사용하는 중첩함수와 관련해서 아래의 예시를 보도록 하자.
def greeting():
    def hello():
        print("Hello!")
        
    hello()


>>> greeting()
Hello!
  • hello() 함수는 부모함수 안에서만 사용할 수 있다.

  • 위와 같이 중첩함수를 쓰는 이유에는 크게 가독성과 클로저가 있다. 반복되는 액션을 함수 안에 정의 하면 코드 길이를 줄일 수 있다. 클로저에 대해서는 아래에서 설명하도록 하겠다.


Closer (클로저)

  • 클로저의 사용을 통해 부모함수의 변수나 정보를 가둔다.

  • 어떤 정보를 기반으로 연산을 실행하고 싶으나 그 정보의 접근을 제한하여 노출이나 수정을 막고자 할 때 사용한다.

  • 클로저의 세 가지 조건
    1) Nested 구조를 갖춰야 한다.
    2) 중첩함수가 부모함수의 변수나 정보를 중첩함수 내에서 사용해야 한다.
    3) 부모함수는 return 값으로 중첩함수를 return 해야 한다.

  • 아래의 예시를 보도록 하자.

def generate_power(base_number):    #line1
    def nth_power(power):           #line2
        return base_number ** power #line3
    return nth_power                #line4
    
>>> calculator = generate_power(2)
>>> calculator(5)
32
  • 먼저 generate_power(2)에서 base_number '2'를 받은 상태이다.
  • calulator(5)를 통해 power를 받게되고 2의 5승이 계산된다.

Decorator (데코레이터)

  • Decorator란, '함수를 인자로 받아 새로운 함수를 만들어 반환하는 함수' 이다.

  • 좀 더 실제 사용과 연관되게 설명하자면, "함수 실행 전 특정동작을 하게 하는 것" 이라고 할 수 있다.

import time

def perf_clock(func):
	def perf_clocked(*args):
		# 시작 시간
		st = time.perf_counter()
		result = func(*args)
		# 종료 시간
		et = time.perf_counter() - st
		# 함수명
		name = func.__name__
		# 매개변수
		arg_str = ','.join(repr(arg) for arg in args)
		# 출력 
		print('Result : [%0.5fs] %s(%s) -> %r' %(et, name, arg_str,result))
		return result
	return perf_clocked
    
# @를 이용해서 함수를 작동하기 전에 데코레이터 함수가 아래 함수를 파라미터로 받아 실행하는 형태

@perf_clock
def time_func(seconds):
    time.sleep(seconds)
@perf_clock
def sum_func(*numbers):
	return sum(numbers)
@perf_clock
def fact_func(n):
	return 1 if n < 2 else n * fact_func(n-1)
    
time_func(3) // # Result : [3.00306s] time_func(3) -> None
sum_func(1,2,3) // # Result : [0.00000s] sum_func(1,2,3) -> 6

데코레이터의 장점

  • 중복을 줄이고 코드가 간결해진다
  • 클로저보다 문법이 간단하다

데코레이터의 단점

  • 디버깅이 힘들다
  • 에러를 찾기 힘들다.

📝 Reference

  1. https://yulsay.tistory.com/128
  2. https://wikidocs.net/83687
  3. https://velog.io/@hyeseong-dev/Decorator-Closure

좋은 웹페이지 즐겨찾기