• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

함수질문

19.12.21 23:33 작성 조회수 145

2

1

def login_required(func):

    def inner_function(*args, **kwargs):

        if not kwargs.get("is_login"):  # 뭘 뜻하지???        

            return "로그인이 필요한 메세지 입니다"

                return func(*args, **kwargs)

 

    return inner_function

------------------------------------------------

2

@login_required

def login():  

    print("안녕")

login()    

기본적으로 1번 코딩이 잘 이해가 가지 않습니다.

구조적으로는 func이라는 하나의 parameter를 받는데,

이 함수 안에 있는 또다른 함수는 2개의  parameter를

필요로합니다.  2번으 데코레이션 시키지 않고 이 함수 자체만을 실행시키는 방법이 궁금합니다

또,  login() 함수를 실행시킬 때, 

   if not kwargs.get("is_login"):        

            return "로그인이 필요한 메세지 입니다"

**kwargs에서 얻어진 값이 "is_login"이 아닌 이상

밑의 메세지를 return 시키겠다. 라는 논리구조인데,

그럼 만약 

def login():  

    print("is_login") 이라고 쓰면 해당 메세지가

뜨지 말아야 하는 거 아닌가요?? 근데 연습해보니까

해당 메세지는 계속 뜹니다.

이상 함수의 구조를 제대로 이해하지 못한 학습자의

두서없는 질문이었습니다. 감사합니다:) 

답변 1

답변을 작성해보세요.

0

파이썬의 함수 특징에 대해서 이해해야 하는 부분입니다. 이 내용에 대해서는 파이썬 함수 이 강좌에서 다룬 내용입니다. 물론 말씀하신대로 쉽게 이해하기엔 다소 어렵게 느껴지는 부분도 있습니다.

먼저 클로저 라고 불리는 이런 스타일의 사용목적은 편리함과 코드 재사용을 하지 않게 하기 위한 목적도 있고 제가 사용한 예제 역시 이 목적과 비슷한 목적으로 예제를 들었습니다.

def write(**kwargs):
    if not kwargs.get("is_login"):
        print("로그인이 필요합니다.")
        return None
    '''작성 내용'''
    return True

def edit(**kwarg):
    if not kwargs.get("is_login"):
        print("로그인이 필요합니다.")
        return None
    '''수정 내용'''
    return True

보통 만약 어떤기능을 만드는데 함수마다 로그인을 판단해야 한다면 위에서 처럼 함수마다 그것을 작성해줘야 합니다. 그리고 위에서 처럼 간단한 코드는 아니겠지요. 그리고 함수가 훨씬 더 많을겁니다. 이런경우 로그인을 수정해야 하는경우 그 함수 모두를 수정해야하는 일이 발생하기도 합니다. 이런 비슷한 상황의 불편함과 비효율성을 클로저라 불리우는 함수 특성을 이용해 모두 해결할 수 있게 됩니다.

def login_required(func):
    def inner_function(*args, **kwargs):
        if not kwargs.get("is_login"):  # 뭘 뜻하지???        
            return "로그인이 필요한 메세지 입니다"
        return func(*args, **kwargs)
    return inner_function

말씀하신 위의 예제에서 안쪽 inner_function 의 (*args, **kwargs) 는 바깥쪽 login_required 함수 인자 (func)인 데코레이터를 사용하는 원래 함수가 받은 모든 파라메타를 다시 넘겨주기 위해 선언됩니다.

그리고 이 함수는 데코레이터를 하기 위해 사용된 함수로 그냥 실행시키면 오류가 발생합니다. 그냥 실행시키기 위해선 바깥쪽 login_required(func) 에서 func 인자를 받지 않아야 하고 그렇게 되면 안쪽 함수의 내용도 모두 수정해야 합니다. 또한 그냥 실행할 함수를 굳이 이렇게 복잡하게 구현할 필요는 없습니다.

위의 예제를 오류 없이 사용하려면

@login_required
def login(is_login=True):  
   '''함수내용'''
   return True

이런식으로 함수에 파라메타를 넘겨줘야 합니다.

사실 이 데코레이터는 알면 유용하나 몰라도 당장은 큰 상관없는 부분입니다. 실제 코딩을 할때 위와 같이 데코레이터를 자주 사용하지 않는 경우도 많고 쓰면서도 잘 이해 못하고 쓰시는 분들도 많습니다.

물론 파이썬을 활용하여 웹 개발을 하게되면 데코레이터를 많이 사용하게 되는데 그때도 사실 내가 구현하기보단 그냥 쓰는 입장이 됩니다만 알고 쓰면 좋은 부분이라 초급의 내용은 아니지만 초보 강좌에 비중을 두고 넣어봤습니다.