외부에서 호출되지 않도록 scope를 제한할 때 사용한다.
함수 내에서의 중복 제거를 위해 inner function을 만들 수 있다.
inner function을 사용하는 가장 중요한 이유. closure를 사용하려면 inner function이 있어야 한다.
inner function이 상태를 기억하도록 만든다. closure는 지역 변수를 stack 내에 가둬 값이 유지되도록 한다. 이 특성을 이용해 다른 함수를 반환하는 factory function을 만들 수 있다.
def generate_power(number):
"""
Examples of use:
>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)
>>> print(raise_two(7))
128
>>> print(raise_three(5))
243
"""
# Define the inner function ...
def nth_power(power):
return number ** power
# ... that is returned by the factory function.
return nth_power
inner function을 만들 때 decorator를 이용하기도 한다. 대부분의 decorated function은, decorator가 function을 인자로 받아 새로운 function을 반환하는 factory function이다.
def generate_power(exponent):
def decorator(f):
def inner(*args):
result = f(*args)
return exponent**result
return inner
return decorator
@generate_power(2)
def raise_two(n):
return n
print(raise_two(7))
@generate_power(3)
def raise_three(n):
return n
print(raise_two(5))
이런식으로 사용하면, 원하는 함수에 기능을 추가하여 새로운 함수를 만들 수 있다.
위와 같은 nested function 대신 데코레이터를 클래스로 정의하는 방법도 있다.
import datetime
class DatetimeDecorator:
def __init__(self, f):
self.func = f
def __call__(self, *args, **kwargs):
print datetime.datetime.now()
self.func(*args, **kwargs)
print datetime.datetime.now()
class MainClass:
@DatetimeDecorator
def main_function_1():
print "MAIN FUNCTION 1 START"
@DatetimeDecorator
def main_function_2():
print "MAIN FUNCTION 2 START"
@DatetimeDecorator
def main_function_3():
print "MAIN FUNCTION 3 START"
my = MainClass()
my.main_function_1()
my.main_function_2()
my.main_function_3()
# 출처: https://bluese05.tistory.com/30 [ㅍㅍㅋㄷ]
참고: https://realpython.com/inner-functions-what-are-they-good-for/