Python inner functions: what are they good for?

햄도·2020년 12월 3일
0

Encapsulation

외부에서 호출되지 않도록 scope를 제한할 때 사용한다.

Keepin' it DRY(Don't repeat yourself)

함수 내에서의 중복 제거를 위해 inner function을 만들 수 있다.

Closures and Factory functions

inner function을 사용하는 가장 중요한 이유. closure를 사용하려면 inner function이 있어야 한다.

closure란?

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

Syntactic sugar

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/

profile
developer hamdoe

0개의 댓글