• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

궁금합니다.

20.05.22 17:38 작성 조회수 97

3

inner_function을 정의할때 (*args,**kwargs)를 사용하는

이유가 있나요?

그리고 굳이 func를 리턴해주는 이유가 무엇인가요?

import time

def time_checker(func):
    def inner_function():
        start_time = time.time()
        result = func()
        end_time = time.time()
        print("함수 {} 동작시간 :{}".format(func.__name__,end_time - start_time))
    return inner_function

@time_checker
def test1():
    for i in range(5):
        time.sleep(0.1)

test1()

이런식으로 짠다면 어떤문제가 있을수 있나요?

답변 1

답변을 작성해보세요.

6

예제로 주신 내용에서는 inner_function 이 (*args, **kwargs) 인자를 받지 않아도 문제가 되지 않고 func 를 리턴해주지 않아도 전혀 상관이 없습니다. 이유는 test1() 함수가 인자를 받지 않았고 test1() 함수가 리턴하는 값이 없기 때문입니다. 그러나!!!!

import time

def time_checker(func):
    def inner_function():
        start_time = time.time()
        result = func()
        end_time = time.time()
        print("함수 {} 동작시간 :{}".format(func.__name__,end_time - start_time))
    return inner_function

@time_checker
def test1(a, b):
    for i in range(5):
        time.sleep(0.1)
    return a+b

c = test1(5, 10)
print(c)

예를 들어 위의 코드같은 상황이라면 오류가 발생하고 당연한 얘기지만 c 에 값이 들어가질 않습니다. 

import time

def time_checker(func):
    def inner_function(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("함수 {} 동작시간 :{}".format(func.__name__,end_time - start_time))
        return result
    return inner_function

@time_checker
def test1(a, b):
    for i in range(5):
        time.sleep(0.1)
    return a+b

c = test1(5, 10)
print(c)

그래서 위처럼 작성해야 어떻게 생긴 함수던 데코레이터를 적용할 수 있게 되고 해당 함수의 결과가 정상적으로 리턴됩니다. *args 로 a, b 값을 받을 수 있게 되며 result 를 리턴했기 때문에 c = test(5, 10) 의 리턴값이 c에 문제없이 들어갑니다. 이해가 되셨길 바랍니다. ^^