Python decorator

박상영·2020년 5월 28일
0

decorator를 사용하여 함수를 한번 만들어보았다.

def word_decorator(func): #1
    def wrapper(password): #4
    	if len(password) <= 6 or password.isdigit():   
            return "비밀번호가 알맞지 않습니다."  #7
        elif password.isalpha():
            return "비밀번호가 알맞지 않습니다."  #7
        elif len(password) <= 8:
            return "비밀번호가 알맞습니다."  #7
     return wrapper  #5
     
def secret(word):  #3
    return  #8
    
secret_word_decorator = word_decorator(secret) #3
secret_word_decorator("12315") #6

#1. word_decorator라는 함수가 정의되었다.

#2. 그다음 secret 이라는 함수가 정의되었다.

#3. word_decorator 함수에 secret 함수를 인자로 전달하여 호출했고, 그 출력값을 secret_word_decorator 라는 변수에 저장하기로한다.

#4. word_decorator 함수가 호출되어 내부 명령이 실행되면서 wrapper 함수가 정의된다.

#5. wrapper 함수가 호출되지 않은 함수자체의 상태로 return 되었다. 따라서 아직 wrapper 함수 내의 명령들은 실행되지않는다.

#6. secret_word_decorator 변수에는 word_decorator 함수의 return 값 즉, 호출되지않은 wrapper 함수가 할당이 된다. 따라서 secret_word_decorator("12315") 는 wrapper("12315")와 같아진다.
아래의 사진을 확인해보면 secret_word_decorator 함수에는 word_decorator 함수의 local scope 에 있는 wrapper 함수가 할당되어 있는것을 볼수있다.

#7. wrapper 함수는 자신이 받은 인자를 word_decorator 함수가 받은 함수에 전달하여 호출한 결과를 return 한다. 즉, secret 함수에 자신이 받은 인자인 "password" 를 전달하여 호출한다. 이는
secret_word_decorator("12315") 를 실행하는것 과 같다.

#8. secret 함수가 호출되었으므로 secret 함수 내부의 명령이 실행된다. 하지만 secret함수 내에 따로 명령어를 입력하지않았으므로 wrapper 함수에서 return 받은 값을 출력하게된다.

범위는 Global(전역변수) 와 Local(지역변수) 가 존재한다.

먼저 Local Variable에 대해 알아보려한다.

Local Variable의 뜻은 지역내에 반복이 가능한 변수이다.

def local_var():
    var_value = "This is Local Variable"
    print(var_value)
    
local_var() #함수를출력
This is local Variable

함수를 출력하면 알맞게 출력되는것을 볼수있다. 하지만 함수내에 var_value를 그냥 출력하게된다면?

print(var_value) #_위의 함수에서 변수로 저장된 var_value를 출력해본다.


하지만 출력을 했을때 "var_value"의 변수에 값이 정의되지않았다.
그이유는 local_var 이라는 함수 내에서 저장된 값이기 때문이다.
local_var의 함수 내에서만 사용할수있는 변수, 즉 지역변수 이기때문이다. 함수라는 지역내에서만 사용가능하므로 지역 밖에서 사용하려고 하면 안되기 때문이다.

Global Variable(전역변수)

전역변수 란, Local(지역) 내에서만 사용하는것이 아닌, 전역에서 사용할수있다 라는 뜻이다.

전역에서 쓰기전에 먼저 변수의 값을 저장하고 프린트 해보았다.
결과는 원하는데로 잘 나온다. 이 변수를 함수 내에서도 쓸수있을까?

먼저 변수에 값을 저장하고나서 함수내에서 저장하지않고 바로 출력을하면 변수"global_var" 의 값이 출력이 되는것을 볼수있다. 밖에서 저장하고나서 함수 내에서도 쓸수있다면, 얼마나 편리한것인가? 하지만, 이 함수 내에서 위에처럼 한번출력후 다시 저장하고나서 출력하게 된다면?

Local Error가 발생하게 된다. 함수내에서 변수값을 저장하는 순간 그 변수는 Local_var이 되는데 그전에 print(global_var)은 이미 지역변수로 변한것이다.
그러므로 전역변수 였던 값은 지역변수로 변하게되고, 앞서 출력하려 했던 값마저 지역변수로 변하면서 Error가 나게 되는것이다.

profile
backend

0개의 댓글