Python-Scope, Closure, Decorator

강현구·2021년 12월 6일
0

Python

목록 보기
17/21

Scope

변수나 함수 등이 사용될 수 있는 범위.

LEGB

L : Local
E : Enclosing (=nonlocal)
G : Global
B : Built-in

scope는 4개의 순서가 있으며, 이 순서에 맞게 변수를 탐색한다.

first class function

first class function :
first-class citizen 속성을 갖고 있는 function
first-class citizen 속성을 갖고 있다는 것은 어떤 객체를 다른 객체의 매개변수로 전달하거나, 함수의 반환값으로 사용하거나 변수에 값으로 할당할 수 있다는 것을 의미한다.
파이썬에서는 모든 객체들이 first-class citizen속성을 갖고 있다.
파이썬에서는 모든 요소들이 객체로 표현되고, 즉, 모든 함수들이 first-class function이 된다.

Closure

클로저는 nested function과 다르게 실행값을 주는 것이 아니라 내부함수 자체를 리턴한다.
( '( )'괄호까지 붙이면 함수를 실행하게된다.)
nested function에서는 리턴하는 단계에 함수를 붙여도 '( )'을 붙임으로써 리턴함수 까지 실행하게 되는데, 클로저는 함수명만 붙인다.
(정확하게는 closure는 nested function의 특수한 경우라고 생각하는 것이 맞겠다.)

외부함수의 반환 값

closure는 함수와 함수가 사용하는 환경을 저장하는 것!
내부함수에서 사용하지 않는 nonlocal로 지정되지 않는 외부함수의 변수는 저장되지 않고 날아간다.
클로저를 통해 개체들을 저장하고자 할때는 반드시 내부함수쪽에서 nonlocal로 사용해주어야 저장이 된다.


클로저 함수일 경우 __dir__을 호출하면, __closure__가 있다.

클로저 함수를 사용하는 경우?

  1. 글로벌 변수를 직접 사용하고 싶지 않을 때

글로벌 변수를 직접 접근하는 것은 다른 위치의 코드에 영향을 줄 수 있기 때문에 리스크가 다소 있다.
한편으로는 글로벌 스코프에 위치한 데이터를 감추기 위한 목적을 띄기도 한다.

  1. 클래스를 사용하고 싶지 않을 때

(물론 요즘은 컴퓨터 성능이 상향 평준화되어서 크게 따지지 않을 수 있겠지만)
데이터와 데이터를 통한 액션은 대부분 클래스로 모듈화한다.
하지만 클래스를 많이 사용하는 것은 메모리 입장에서 불리하기 때문에 클로저를 활용하게된다.
> 사용하는 변수나 함수가 많으면 그냥 클래스를 쓰는게 맞다.

  1. 데코레이터를 사용하기 위해

제일 메인이 되는 이유라고 할 수 있다.
데코레이터에 들어가는 함수가 클로저이어야 한다.

클로저 사용 시 주의 사항

클로저의 외부함수의 변수, 즉 nonlocal 변수에 시간과 관련된 값을 할당해서 사용하게 되면 원하는 결과가 나오지 않을 수 있다.
시간값이 그대로 저장되서 시간 지연과 같은 액션이 들어가지 않는다.

closure에 대한 추가 공부할 blog

Decorator

데코레이터의 가장 큰 사용 이유는 기존 함수를 수정 없이 부가적인 효과를 달아줄 수 있다는 점이다.
예를 들어 어떤 함수에 대해서 그 함수가 실행되는 시간을 계산하려면, 그 함수 안에서 코드를 수정해야 한다.
하지만 이 경우에 이 함수가 다른 어디선가 사용이 되고있다면 분명 의도하지 않은 결과를 초래한다.
따라서 이런 경우에 데코레이터를 사용해서 해당 함수의 실행 시간을 계산할 수 있다.

데코레이터는 사용이 편리하도록 @func의 형태로 붙이도록 만들어 둔 것이고, 실제로는 이 문법을 사용하지 않아도 동일한 기능을 구현하는 것 자체는 충분히 가능하다.
(데코레이터로 쓸 함수의 매개변수로 원래의 함수를 대입해주면 된다.)
f = deco(func)
다만 이렇게 사용할 경우 개발자 스스로 실수하기도 쉽고 복잡해지기 때문에 @func와 같이 편리성을 위한 기능이 생겨났다고 보면된다.

profile
한걸음씩

0개의 댓글