Python : Nested Function, Closure, Decorator

Joey Lee·2020년 4월 27일
0

Python

목록 보기
7/12

1. Nested Function

파이썬에서도 함수 안에 함수를 중첩해서 선언할 수 있다. 다만, 중첩함수(혹은 내부함수)는 상위 부모 함수 내에서만 호출이 가능하다. 아래 코드에서 inner_func 함수는 outer_func 안에서만 호출이 가능하다.

2. First-class Function

  • 함수 자체를 인자로 다른 함수에 전달, 다른 함수의 결과값으로 리턴, 함수를 변수에 할당할 수 있는 함수

3. Closure

중첩 함수가 부모 함수의 변수나 정보를 가두어 사용하는 것을 closure라고 한다.
그리고 부모함수는 중첩 함수를 리턴해 준다. 그리하면 부모함수의 변수를 외부로부터 직접적인 접근은 격리하면서도 중첩 함수를 통해서 격리된 부모함수의 변수를 사용한 연산은 가능하게 해주는 것이다.

정리하자면:

  1. 중첩 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.
  2. 부모 함수는 리턴값으로 중첩 함수를 리턴한다.
  3. 부모 함수에서 리턴 했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모 함수가 리턴한 중첩 함수를 통해서 사용될 수 있다.

그렇다면, 언제 Closure를 사용하는 것일까? 어떠한 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을때 사용한다.


4. Decorator

Decorator는 closure처럼 중첩함수를 리턴하는 함수 이며 다른 함수에 적용해서, 적용된 함수가 실행되기 전에 무조건 실행된다. 즉, 특정 함수를 실행하기 전에 강제적으로 다른 함수가 먼저 실행된후 실행되도록 하는 강제성을 제공하는 기능이다. 따라서 특정 함수가 실행될 때 반드시 함께 수행되면 좋은 함수를 묶어서 사용하면 좋은 경우에 많이 활용된다.

1) 파라미터가 없는 함수에 Decorator 적용

  • 함수 실행 전.후 시간 알려주기 사례

2) 파라미터가 있는 함수에 Decorator 적용

  • 유효성 검사 사례
    • return func(input1,input2)는 함수의 결과값을 반환해야 하기에 함수 실행함.
    • return wrapper는 함수만 반환함. wrapper()를 하게 되면, multiply 함수 정의 시에 wrapper함수가 실행이 됨. 체커 세팅 시, 우리가 원하는 것은 함수 정의이지 실행이 아니므로 wrapper()로 하면 안 됨.

3) 파라미터와 관계 없이 모든 함수에 적용 가능한 Decorator 만들기

  • (*args, **kwargs)는 언팩킹할 수 있는 리스트, 튜플, 딕셔너리 등 자료구조 상의 어떤 인자값이 들어와도 좋다는 뜻임.
  • 따라서 파라미터에 관계 없이 모든 함수에 적용가능한 데코레이터의 내부함수를 정의할 때는 파라미터를 (*args, **kwargs)로 설정하면 됨

profile
안녕하세요!

0개의 댓글