decorator

ddalkigum·2020년 12월 17일
2

python

목록 보기
3/3
post-thumbnail

Closure

가둬둔다
닫아둔다

중첩함수가 부모함수의 변수나 정보를 가두어 사용하는 것
이렇게 되면 외부로 부터 직접적인 접근을 제어

  1. 격리된 부모함수의 변수를 사용한 연산은 가능하게 해줌

  2. 중첩 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.

  3. 부모 함수는 리턴값으로 중첩 함수를 리턴한다.

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

클로저의 진행 순서


def generate_power(base_number):			#1 #3
    def nth_power(power):				#4
        return base_number ** power			#8
    return nth_power					#5
 

n = generate_power(2)					#2 #6
print(n(4))						#7 #9

#1

부모 함수를 정의함

#2

n이라는 변수에 2라는 인자를 가진 generate_power를 호출

#3

generate_power 함수가 호출 되었고, nth_power라는 함수가 정의됨

#4

내부에 있는 함수를 호출함

#5

내부 함수를 리턴 해줌, 아직 내부 함수는 실행이 되지 않음

module = __main__
"__main__" 이게 무슨뜻일까

python docs에서는 __module__을

함수가 정의 된 모듈의 이름 또는 None사용할 수없는 경우.

위 처럼 설명해준다

__module__이 main이라는 이름을 찾는다고 이해했다~

제일 처음 함수가 main이기 떄문에 첫 함수를 모듈로 사용한다는 뜻으로 이해했습니다

if __name__ =="__main__":
	pass

이 것과 비슷한 맥락이 아닐까 생각한다

__name__ = nth_power
첫 실행 함수가 아니기 때문에 이름이 main이 아닌 자기 자신을 갖는것

가장 궁금한건 qualname

파이썬 3.3 이후에 나온 개념이고

최상위 함수 및 클래스의 경우 __qualname__ 속성은 __name__ 속성 과 같습니다 .
중첩 된 클래스, 메서드 및 중첩 된 함수의 경우 __qualname__ 속성에는 모듈 최상위 수준에서 개체로 이어지는 점선 경로가 포함됩니다.
함수의 로컬 네임 스페이스는 <locals> 라는 구성 요소로 점선 경로에 표시됩니다 .

이 경우에는 내부에 있는 함수 이기때문에 name속성과 같지 않고
<locals> 라는 구성 요소로 표시 됨

점선경로가 뭘까

generate_power에 nth_power가 할당되어 있으니까
이 둘사이를 점선경로라 하는 것같다

#6

generate_power 는 최상위 함수이기 때문에 qualname이 자기 자신을 가짐

#7

n(4) 즉 nth_power에 4를 할당해줌

#8

모두 할당이 완료됨 계산을 진행

#9

마지막으로 nth_power의 값을 리턴해줌

종료

클로저 함수의 주기를 한번 살펴봤다

이 궁금증은 과연 데코레이터 함수가 어디서 부터 어떻게 진행될까
궁금했고, 데코레이터 함수를 제대로 알려면

Closure를 제대로 알아야 한다고 생각 했다

아직 완벽하게 사용하지는 못하겠지만,
어떤 흐름을 갖고 움직이는지 감은 조금 잡힌다


Decorator

간단하지만 생각을 좀 했엇던 구구단을 만들어봤다

def multiply(func):
    def wrapper(*args, **kwargs):
        for i in args:
            print(f"-----------{i}단 구구단---------")
            for j in range(1, 10):
                print(f"{i} * {j} = {i*j}")
        return  func(*args)
    return wrapper

@multiply
def multiplication_table(*args):
    pass

a =multiplication_table(2)

궁금했던 점

  1. 마지막에 리턴을 하는게 wrapper = wrapper의 리턴값이 가장 나중에 실행
    그럼 wrapper의 리턴값이 None인 이유는?


    메모리 할당이 끝나고 메모리를 회수해 가는 과정때문에 일어나는 일인가?
    multiplication_table함수의 생명이 다했기 때문에 return 값이 None?

  1. 그러면 wrapper가 리턴하는걸 None으로 설정하면 어떻게 될까?
    multiplication_table은 리턴값이 있는데 리턴하지 않는건가?

wrapper함수는 multiply가 받아온 multiplication_table의 인자를 리턴 하는데
여기서 wrapper가 리턴하는 값이 리턴 값이 없음

  1. ?? 데코레이터를 받는 함수가 None을 리턴해주면 wrapper가 None을 리턴함

2번과 마찬가지로 구구단테이블 함수의 리턴값이 None이므로
함수를 프린트해주게 되면 구구단테이블이 리턴하는 None을 리턴


Closure와 데코레이터에 관해서 너무 궁금했다
만들고나서 보니 데코레이터 느낌이 안난다..
그냥 함수를 만든듯한 느낌이다

과연 데코레이터가 뭘까?

기본기가 많이 부족하다 느꼇고, 다시 되돌아 보는시간을 가지면서
데코레이터에 관해서 공부를 했습니다

내가 과연 실제로 문제를 마주했을 때,
제대로 활용을 할 수 있을까?
불안한 마음에 처음부터 다시 보기시작했고,

공부하던중 데코레이터가 어떻게 돌아가는지 궁금했습니다
읽기만해서는 정리가 되지 않아 블로그를 작성하면서 공부를 진행했습니다

아직 풀리지 않은 부분도 있고, 내 추측인 부분도 있지만
진행하다 보면서 풀린 부분이 많습니다

아직은 개린이를 넘어 씨앗수준이지만,,,
열심히 노력하면 개린이는 넘어서겟지 🐒

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글