포도가게의 개발일지
파이썬 (8) 본문
반응형
Decorator and Clousure
- 클로저는 자신의 본체 바깥에서 정의된 변수를 함수가 포착해서 가져오는 기능
- 데코레이터는 다른 함수를 인수로 받는 콜러블이다.
- 함수를 반환하거나, 함수를 다른 함수나 콜러블 객체로 대체한다.
- 데코레이터는 모듈이 로딩될 때 바로 실행된다.
파이썬이 데코레이터를 실행하는 시점.
- 파이썬에서는 임포트 시에 실행됨.
함수 내에서 변수 스콥
- 파이썬 인터프리터는 함수를 실행하기 전, 코드를 컴파일하는 시점에 해당 함수에서 사용될 변수가 지역 변수인지 전역 변수인지 미리 판단합니다.
- 함수 본문 어디에서든 특정 변수에 값을 할당하는 구문(=)이 있다면, 그 변수는 해당 함수의 지역 변수(local variable)로 간주됩니다.
- global b 선언은 컴파일러에게 "b = 9 할당문이 있더라도 b를 지역 변수로 만들지 말고, 전역 공간에 있는 b를 사용해달라"고 알려주는 역할
파이썬 Clousure
- 클로저(Closure)란 자신을 감싸는 바깥 함수의 변수를 기억하고 접근할 수 있는 함수를 말합니다. 즉, 함수와 그 함수가 선언될 당시의 환경(Lexical Environment)을 함께 묶은 것입니다.
- 외부 함수는 avg = make_averager() 를 실행할 때 이미 종료되었는데, 어떻게 그 안의 지역 변수인 series = []가 사라지지 않고 호출될 때마다 계속 접근할 수 있을까요?
- 내부 함수에서 series에 참조를 계속 이어가는데, 이때 지역 변수도, 전역 변수도 아닌 특별한 변수입니다. 이를 자유 변수(free variable)라고 부릅니다.
- 파이썬은 외부함수가 반환한 내부 함수 객체에 이 자유 변수에 대한 정보를 closure 라는 특별 속성에 저장합니다. 이 공간에 series 리스트가 살아남아 계속 값을 유지하는 것입니다.
nonlocal
- nonlocal은 중첩된 함수(nested function)에서 바깥 함수(enclosing function)의 변수를 수정하고 싶을 때 사용하는 키워드입니다.
- nonlocal은 컴파일러에게 "이 변수는 지역 변수가 아니라, 나를 둘러싼 가장 가까운 함수의 변수야"라고 알려주는 역할을 합니다.
@singledispatch
- @singledispatch는 이런 문제를 해결하기 위해 제네릭 함수(generic function)를 만들어 줍니다. 제네릭 함수란, 여러 함수를 하나의 대표 함수로 묶어주는 개념
- 호출은 대표 함수로 하지만, 실제 실행은 첫 번째 인자의 자료형에 따라 그에 맞는 전문 함수가 선택됩니다. "단일(single) 디스패치"라는 이름은 바로 이 첫 번째 인자 하나로 실행할 함수를 결정하기 때문에 붙었습니다.
# 1. 기본 함수 정의 (모든 자료형에 대한 기본값)
@singledispatch
def htmlize(obj):
content = html.escape(repr(obj))
return f'<pre>{content}</pre>'
# 2. str 자료형에 대한 전문 함수 등록
@htmlize.register(str)
def _(text):
content = html.escape(text).replace('\n', '<br>\n')
return f'<p>{content}</p>'
# 3. 숫자(int, float 등) 자료형에 대한 전문 함수 등록
@htmlize.register(numbers.Integral)
def _(n):
return f'<pre>{n} (0x{n:x})</pre>'
# 4. 시퀀스(list, tuple 등) 자료형에 대한 전문 함수 등록
@htmlize.register(abc.Sequence)
def _(seq):
items = (f'<li>{htmlize(item)}</li>' for item in seq)
return '<ul>\n' + '\n'.join(items) + '\n</ul>''Tech' 카테고리의 다른 글
| 파이썬 (10) (0) | 2025.07.18 |
|---|---|
| 파이썬 (9) (0) | 2025.07.15 |
| Python (6) (3) | 2025.07.09 |
| python (5) (0) | 2025.07.01 |
| 파이썬 (4) (0) | 2025.07.01 |
Comments