python
데코레이터로 함수를 재사용 가능 로직으로 감싸 코드 모듈성, 가독성, 유지보수성 향상. 이 가이드에서 데코레이터 구축, 설명, 실전 적용.
Python 데코레이터는 정의 시점에 함수나 클래스에 행동 추가하는 강력한 메타프로그래밍 도구. Python에서 모든 게 객체—함수와 클래스 포함—라 데코레이터는 호출 가능 객체 하나 받아 다른 걸로 감싸 새 호출 가능 객체 반환.
시작 전 Python에서 함수가 퍼스트 클래스 객체란 사실 익숙해야 함. 이름은 단순히 객체에 바인딩된 참조; 같은 함수가 여러 이름으로 참조 가능.
def first(msg):
print(msg)
first("Hello")
second = first
second("Hello")
출력
Hello Hello
함수는 인수로 전달, 다른 함수에서 반환, 다른 함수 내 중첩 가능. 이런 개념—고차 함수, 중첩 함수, 클로저—이 데코레이터 구성 요소.
def inc(x):
return x + 1
def dec(x):
return x - 1
def operate(func, x):
result = func(x)
return result
사용:
>>> operate(inc,3)
4
>>> operate(dec,3)
2
def is_called():
def is_returned():
print("Hello")
return is_returned
new = is_called()
new()
출력
Hello
클로저 이해가 핵심: 중첩 함수가 외부 스코프 접근 유지, 데코레이터가 메타데이터 저장이나 행동 수정 위해 정확히 이걸 활용.
Python에서 데코레이터는 단순히 함수(또는 다른 호출 가능 객체) 받아 새 호출 가능 객체 반환하는 호출 가능 객체. 반환 함수는 보통 원본 감싸 호출 전후 기능 추가/변경.
def make_pretty(func):
def inner():
print("I got decorated")
func()
return inner
def ordinary():
print("I am ordinary")
예제 사용:
>>> ordinary()
I am ordinary
>>> pretty = make_pretty(ordinary)
>>> pretty()
I got decorated
I am ordinary
데코레이터 패턴은 원본 함수 의미 유지하며 보강. 수동 재할당 피하려 Python이 @ 심볼로 문법적 설탕 제공:
@make_pretty
def ordinary():
print("I am ordinary")
이는 다음과 동등:
def ordinary():
print("I am ordinary")
ordinary = make_pretty(ordinary)
많은 데코레이터가 임의 인수 처리 필요. *args와 **kwargs 문법으로 모든 위치/키워드 인수 캡처해 그대로 전달.
def works_for_all(func):
def inner(*args, **kwargs):
print("I can decorate any function")
return func(*args, **kwargs)
return inner
예외 상황 처리도 흔한 데코레이터 용례. 예: 0 나누기 방지:
def smart_divide(func):
def inner(a, b):
print("I am going to divide", a, "and", b)
if b == 0:
print("Whoops! cannot divide")
return
return func(a, b)
return inner
@smart_divide
def divide(a, b):
print(a/b)
사용:
>>> divide(2,5)
I am going to divide 2 and 5
0.4
>>> divide(2,0)
I am going to divide 2 and 0
Whoops! cannot divide
데코레이터 중첩 가능. 적용 순서 중요—각 데코레이터가 아래 것 반환 함수 받음.
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner
def percent(func):
def inner(*args, **kwargs):
print("%" * 30)
func(*args, **kwargs)
print("%" * 30)
return inner
@star
@percent
def printer(msg):
print(msg)
결과:
****************************** %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Hello %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ******************************
순서 뒤집으면 감싸는 패턴 교체돼 데코레이터 스택이 행동에 영향 주는 것 확인.
python
Python 메인 함수란? 메인 함수는 Python 프로그램의 진입점. 스크립트 직접 실행 시 인터프리터가 코드 순차 실행. def main() 안 코드는 스크립트가 주 모듈일 때만 실행, 다른 곳에서 임포트 시 실행 안 됨. 명확한 예제로 살펴보기. 예제 1: main() 정의 def main(): print(Hello World!) print(Guru99) 이 파일 실행 시 Guru99만 출력. Hello World! 줄은 main() 안에 있어 호출되지 않음. main()을 스크립트가 메인 프로그램으로 실행될
파이썬 함수 마스터하기: 정의, 호출, 들여쓰기, 인자 & 반환값 함수는 모든 파이썬 애플리케이션의 기본 구성 요소입니다. 재사용 가능한 로직을 캡슐화하고, 코드를 DRY(Dont Repeat Yourself) 원칙에 맞게 유지하며, 프로그램을 더 쉽게 읽고, 테스트하고, 유지보수할 수 있게 해줍니다. 이 가이드에서는 파이썬 3에서 함수를 작성, 호출, 문제 해결하는 데 필요한 모든 단계를 다루며, 파이썬 2에서 마주칠 차이점도 함께 살펴봅니다. 파이썬에서 함수란 무엇인가? 파이썬 함수는 호출할 때 실행되는 독립적인 코드 블