본문 바로가기
Studying/Python

[Python] Closure 설명, 사용 방법 및 예제

by giem 2022. 5. 31.
반응형

Closure의 사전적 의미를 먼저 보면 폐쇄이다.

 

하지만 이렇게 보는것은 조금 이해에 도움이 되지 않을 것 같아서 비유를 해서 설명해보겠다.

 

우선 객체지향 프로그래밍에서 중요한 것중에 encapsulation이 있다. 이것과 비슷하게

 

함수를 캡슐화하는 것이나 함수를 찍어내는 공장이라고 이해하면 좋을 것 같다.

 

예제 코드를 보겠다.

 

def add(var):
	return var + 2

def multiply(var):
	return var * 2

def factory(function, n): # 함수를 파라미터로 받는 Factory
    def closure(var): # Closure 생성
        for _ in range(n):
	        var = function(var)
    	return var
	return closure
    
print(factory(add, 4)(10))
print(factory(multiply, 4)(3))

이런식으로 사용할 수 있다.

 

이를 응용한 decorator가 있다.

 

이 부분도 코드를 통해 이해해 보자.

 

def print_closure_factory(function):
    def print_closure(var):
        print("Input:", var)
        out = function(var)
        print("Output:", out)
        return print_closure
        
def add(var):
    return var + 2
        
print_add = print_closure_factory(add)
print_add(10)

 

위 코드를 decorator를 사용해서 아래와 같이 더 보기 쉽고 짧게 만들 수 있다.

def print_decorator(function):
    def print_closure(var):
        print("Input:", var)
        out = function(var)
        print("Output:", out)
        return print_closure
        
@print_decorator
def add(var):
	return var + 2

add(10)

 

decorator를 한국어로 꾸밈자라고 하는데 특징은 다음과 같다.

 - 함수 하나를 인자로 받아 같은 형태의 함수를 반환하는 함수
 - @을 사용하여 함수를 꾸미는데 사용 가능
 - Class를 사용할 시 Decorator에 인자 추가가 가능

 

여기서 인자를 추가하려면 아래와 같이 한 번 더 wrapping 하면 된다

def times_decorator_factory(times): # 인자를 받아 Decorator를 만들기
    def times_decorator(function): # 함수를 받아 꾸미기
        def closure(var): # 꾸며진 함수
            for _ in range(times):
            	var = function(var)
            return var
        return closure
    return times_decorator

@times_decorator_factory(5) # Decorator에 인자 추가
def add(number):
return number + 2

print(add(5))

 

여기까지 closure의 설명과 예제를 보았다.

 

아직 익숙하지 않아 많이 사용은 안하지만

 

주변의 파이썬 개발자들은 생각보다 많이 사용한다고 한다.

 

익숙해지도록 많이 사용을 해봐야겠다.

반응형

댓글