Notice
Recent Posts
Recent Comments
Link
nathan_H
Decorator 본문
decorator는 하나의 함수를 취해
또 다른 함수를 반환하는 함수이다.
from functools import wraps
def document_it(func):
@wraps(func)
def new_function(*args, **kwargs):
print("Running function:", func.__name__)
print('Positional arguments:', args)
print("Keyword arguments:", kwargs)
result = func(*args, **kwargs)
print("Result:", result)
return result
return new_function
데코레이터의
코드를 보면
크게 3가지 장치를 활용해 구성되어 있다.
*args, **kwargs
내부 함수
함수 인자
외부 함수에 어떤 인자 함수 이름을 전달하든지
외부 함수에 추가 선언문이 포함된 새 함수를 얻는다.
데코레이터는 외부 함수에서 인자로 전달 받은 함수를 호출해
결과를 출력 할뿐만 아니라 새로운 함수를 얻는다.
from functools import wraps
def document_it(func):
@wraps(func)
def new_function(*args, **kwargs):
print("Running function:", func.__name__)
print('Positional arguments:', args)
print("Keyword arguments:", kwargs)
result = func(*args, **kwargs)
print("Result:", result)
return result
return new_function
def square_it(func):
@wraps(func)
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function
def without_wraps_square(func):
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function
@square_it
@document_it
def add_ints(a, b):
'''두수의 합을 리턴'''
return a + b
@without_wraps_square
def sub_ints(a, b):
'''두수의 차를 리턴'''
return a - b
if __name__ == "__main__":
print(add_ints(1, 2))
'''
출력
Running function: add_ints
Positional arguments: (1, 2)
Keyword arguments: {}
Result: 3
9
'''
print(add_ints.__name__) # use wraps
# 출력 add_ints
print(add_ints.__doc__)
# 출력 두수의 합을 리턴
print(sub_ints.__name__) # not use wraps
# 출력 new_function
print(sub_ints.__doc__)
# 출력 None
추가로 @wraps은
wrapper로써 함수를 감싸는 역활을 한다.
위 코드에서 wraps을 사용하지않은 decorator은
new_function이 전달 받은 함수인자 sub_ints을 감싸기 때문에
name과 doc이 new_functio으로 출력된다.
그래서 wraps을 사용해
인자로 받은 함수의 name과 docsting을
출력할 수 있다.
'Programming Laguage > Python' 카테고리의 다른 글
python - class method type. (0) | 2019.04.30 |
---|---|
python - function 과 method (0) | 2019.04.30 |
python - namespace (0) | 2019.04.26 |
Closure. (0) | 2019.04.26 |
python - 진수 변환, ascll code 변환 (0) | 2019.04.18 |
Comments