얼마전 자주가는 네이버 카페에서 파이썬 코딩을 봤는데 변수 옆에 콜론( : ) 이 있는 것을 보고 깜짝 놀랐습니다. 우리가 알고 있는 콜론은 크게 두군데서 쓰입니다.

 

  • 함수(def) 나 for, if 문등의 마지막에 붙입니다.
  • 딕셔너리에서 key값과 value값 사이에 놓습니다.

하지만 변수를 처음 정의할 때 바로 붙는 것을 보고 인터넷에 찾아봤는데 파이썬 3.6버전에 새로 추가된 변수 주석(syntax for variable annotations)라는 새 기능이었던 것입니다. 그리고 이에 대한 쓰임을 잘 설명해놓은 사이트를 찾았습니다.

www.blog.pythonlibrary.org/2017/01/12/new-in-python-syntax-for-variable-annotations/

 

New in Python: Syntax for variable annotations - The Mouse Vs. The Python

Python 3.6 added another interesting new feature that is known as Syntax for variable annotations. This new feature is outlined in PEP 526. The basic premise of this PEP is take the idea of Type Hinting (PEP 484) to its next logical step, which is basicall

www.blog.pythonlibrary.org

그리고 아래와 같이 페이지 전체를 번역해보았습니다.

 

파이썬에서의 새로운 점: 변수 주석 문법

파이썬 3.6에서는 변수 주석 문법이라는 또다른 새롭고 재밌는 기능이 추가되었습니다. 이 새로운 기능은 PEP 526에 나와 있습니다. 이 PEP의 기본적인 목적은 다음 논리적 단계로 넘어가기 위한 Type Hinting의 생각에 대한 것이고 이는 기본적으로 파이썬 변수에 대한 type 정의의 옵션을 주는 것입니다. 클래스 변수나 일반 변수등을 포함해서.

 

위 주석이나 정의를 급하게 파이썬을 정적으로 작성된 언어로 반들지 마세요. 인터프리터는 변수가 어떤 type인지 여전히 신경쓰지 않습니다. 하지만 파이썬 IDE나 다른 pylint같은 유틸리티 프로그램은 주석 확인 기능이 있고 당신이 주석을 단 변수를 사용할 경우 이를 표시해줄 수 있습니다. 그리고 mid-function type을 변경하는 것으로 잘못 사용한 것도 찾아줍니다.

 

아래 간단한 예문을 보고 어떻게 작동하는지 확인해 봅시다.

 

# annotate.py

name: str = 'Mike'

 

annotate.py 파일의 내용입니다. 우리는 name이라는 이름의 변수를 만들고 주석을 달았습니다. 이는 변수 뒤에 콜론을 붙여 어떤 type이어야 하는지 적는 것으로 가능합니다. 당신은 원하지 않으면 어떠한 것이라도 변수에 부여할 필요는 없습니다. 아래도 가능합니다.

 

# annotate.py

name: str

 

만약 변수에 주석을 달게 되면 모듈이나 클래스의 __annotations__ 속성에 추가되게 됩니다. 한번 우리의 첫 주석 모듈을 불러와서 접근해 봅시다.

 

>>> import annotate

>>> annotate.__annotations__

{'name': <class 'str'="">}

>>> annotate.name

'Mike'

</class>

 

보시듯, __annotations__ 속성은 파이썬 딕셔너리 형태로 변수의 이름을 key값으로 type을 value값으로 반환합니다. 몇개 다른 주석을 우리 모듈에 추가해보고 어떻게 __annotations__가 업데이트 되는지 알아봅시다.

 

# annotate2.py

name: str = 'Mike'

ages: list = [12, 20, 32]

class Car:

    variable: dict

 

이 코드에서 우리는 주석 리스트 변수를 추가했고 주석으로서의 클래스 변수가 들어있는 클래스를 추가하였습니다. 이제 우리의 주석 모듈을 불러와 봅시다. - __annotations__attribute:

 

>>> import annotate

>>> annotate.__annotations__

{'name': <class 'str'="">, 'ages': <class 'list'="">}

 

>>> annotate.Car.__annotations__

{'variable': <class 'dict'="">}

>>> car = annotate.Car()

>>> car.__annotations__

{'variable': <class 'dict'="">}

</class></class></class></class>

 

이번엔 주석 딕셔너리가 두개의 아이템을 가지고 있는 것이 보입니다. 보시다시피 모듈 레벨에서의 __annotations__ 속성은 주석화된 클래스 변수는 포함하고 있지 않습니다. 접근하기 위해서는 우리는 클래스에 직접 접근하여 Car instance를 생성하여 접근하는 방식이 필요합니다.

 

우리 독자들이 지적하듯 당신은 typing module을 사용하여 위 예제를 좀더 PEP 484에 따르도록 만들어야 합니다. 다음의 예를 봅시다.

 

# annotate3.py

from typing import Dict, List

 

name: str = 'Mike'

ages: List[int] = [12, 20, 32]

class Car:

    variable: Dict

 

위 코드를 실행해서 어떻게 결과가 바뀌는지 봅시다.

 

import annotate

 

In [2]: annotate.__annotations__

Out[2]: {'ages': typing.List[int], 'name': str}

 

In [3]: annotate.Car.__annotations__

Out[3]: {'variable': typing.Dict}

 

대부분의 type이 typing module로부터 오는것을 알수 있습니다.

 

마치면서

저는 이 새로운 기능이 정말 재밌습니다. 파이썬의 다이나믹한 습성을 사랑하고 전 C++를 근 몇년간 작업하면서 알게된 변수에 무슨 타입이 와야하는지 알기에 그 것의 가치를 알 수 있습니다. 물론 파이썬의 멋진 자기성찰적인 도움때문에 오브젝트의 type을 아는 것은 그리 중요하지 않습니다. 그러나 이 새로운 기능은 정적인 확인작업을 좀더 낫게 해주고 당신의 코드를 더욱 분명하게 해줍니다. 특히 당신이 수달, 수년동안 작업해오지 않은 예전에 만든 소프트웨어를 업데이트 하려 할 때 말이죠.

 

 

위와 같이 번역을 해 보았습니다. 사실 파이썬의 경우는 변수들의 속성에 큰 상관이 없어 그리 이용하지 않지만(국내외 모두) 위 블로거의 마지막 말과 같이 C++같은 프로그램은 변수들의 type을 알맞게 설정하는 것이 메모리 사용 등에 큰 차이를 보이기 때문에 의미가 있다고 하지만 정작 파이썬 기능이라 거의 안쓴다고 보시면 됩니다.

 

아래는 공홈의 설명입니다. :)

www.python.org/dev/peps/pep-0526/

 

PEP 526 -- Syntax for Variable Annotations

The official home of the Python Programming Language

www.python.org

+ Recent posts