TIL-077 | Python_ Closer & Decorator
🌈 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
- https://yulsay.tistory.com/128
- https://wikidocs.net/83687
- https://velog.io/@hyeseong-dev/Decorator-Closure
Author And Source
이 문제에 관하여(TIL-077 | Python_ Closer & Decorator), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lck0827/TIL-077-Python-Closer-Decorator저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)