[Python In Depth] from __future__ import

A Ydobon
7 min readSep 17, 2019

--

텐서플로우 2.x 시작해보기

위의 링크를 클릭해 들어가 보시면, tf.data 라는 텐서플로우의 하위 기능을 이용해 csv 확장자 파일을 로딩하는 방법에 대해 설명이 되어 있습니다.

이 포스팅에서 제가 말씀드리고자 하는 부분은 다음의 한 줄 짜리 코드입니다.

from __future__ import absolute_import, division, print_function, unicode_literals

위의 __future__ statement 는 파이썬 2.x 코드가 파이썬 3.x 처럼 작동하게 해줍니다. 이 한마디를 풀어 설명하는 내용이 아래의 글입니다.

위의 코드 박스에는 우리가 자주 봐 온 코드 한 줄이 들어있습니다. 사실 못 본 체 하며 그냥 슥 지나쳐도, 심지어 저 코드를 무시해도 전체 프로그램 실행에는 사실 큰 차질이 없습니다.

아래와 같이 위의 코드 맨 앞에 # 기호를 추가해서 코멘트 형식으로 바꾼 후 코랩에서 코드를 실행해 보시면,

#from __future__ import absolute_import, division, print_function, unicode_literals

오류 하나 없이! 매끄럽게 코드가 실행되는 것을 알 수 있습니다. 그렇다면 저 코드 한 줄은 왜 존재하는 것 일까요? 아래의 긴 코드를 작성하기 전, 손가락 스트레칭을 단디 해 두라는 구글 텐서플로우 라이브러리 개발자들의 따뜻한 배려인 것 일까요? 그럴리가요.

저는 궁금했습니다. 저기 보이는 “__future__” 이 것은 도대체 무엇인지, 왠지 뭔가 미래에서 온 것 같고 막 퓨처리스틱, 대단한 냄새가 나는 저 생소한 단어.

저와 같이 생각하는 사람이 지구에 적어도 한 명은 더 있을거라는 확신과 함께, 이번 포스팅을 시작하게 됐습니다.

우선 저 코드의 구조를 봅시다. from 그리고 import 는 파이썬에서 예약된(reserved) 단어입니다. from A import B 이런 코드가 있다면, 우리는 알 수 있습니다. A 라는 큰 라이브러리 안에서 B 라는 기능을 불러오겠다는 것이지요.

그럼 이제 __future__ 에서부터 이야기를 시작해 봅시다. 분명 거대한 라이브러리 같습니다. absolute_import, division, print_function, unicode_literals 이러한 어디선가 본 것 같고 들어본 것 같은 함수들을 가지고 있지요. 그리고 맨 앞에 나온 것을 보니 왠지 중요할 것 같기도 합니다.

이에 대한 파이썬 공식 문서는 다음과 같습니다.

위의 파이썬 공식 문서에서 __future__ 에 대한 설명을 읽고 ‘__future__’ 에 대해 크게 두 가지를 새로 알게됐습니다.

  1. 위치 (왜 전체 코드의 거의 최상단에서 등장하는가?)
  2. 역할

__future__는 코드를 기계어로 바꿔주는 컴파일러에게 “미래의, 장차 배포될 파이썬의 표준에 적합하게(에러를 발생시키지 않도록) 특정 모듈(함수)을 실행시키시오.” 라는 명령을 내리는 것과 같습니다.

현재 우리는 파이썬 3.x 버전을 사용하고 있지만, 이전에는 파이썬 2.x 버전이 있었습니다. 위의 설명에 따르면, __future__ 덕분에 우리는 과거 파이썬 버전 (예시. 파이썬 2.5) 에서 작성된 코드라도 현재의 파이썬 버전 (예시. 파이썬 3.6) 에서 성공적으로 실행시킬 수 있게 됩니다.

즉, 함수 실행시 최신의 파이썬 버전 표준에 맞게 “알아서 잘” 작동하도록 지시를 해 줘야 하기 때문에, __future__ 가 전체 프로그램 코드의 상단에 위치해야 하는 것입니다.

이제 __future__ 다음 부분 absolute_import, division, print_function, unicode_literals 각각에 대해 살펴봅시다.

  • absolute_import
    예를 들어 ydobon 이라는 이름의 모듈이 있고, 그 안에 우연히 numpy 라는 이름으로 특정 작업 파일을 저장해 두었다고 가정해 봅시다. 만일 제가 ydobon 모듈 안에서 작업하다가 import numpy 라는 코드를 실행시키면 과거 파이썬 2.x 버전에서는 먼저 ydobon.numpy 라는 모듈을 먼저 불러오고, 그 다음으로 numpy 를 불러오려고 했습니다. 즉, 표준 numpy 라이브러리가 아닌, 로컬에서 제가 임의로 만들어둔 모듈이 우선적으로 임포트 되는 것입니다. 따라서 이와 같은 상대적인 임포트가 아닌 표준 모듈을 우선적으로 임포트 시키기는 역할을 absolute_import가 해 내고 있습니다. 파이썬3.x 부터는 표준 라이브러리를 먼저 불러오는것이 표준이 됐습니다.
  • division
    파이썬 2.x 에서 7/4 를 하면 1이 출력됐습니다. 하지만 현재 사용되는 파이썬 3.x 버전에서는 7/4를 하면 1.75, 이렇게 소숫점 이하 자릿수까지 출력됩니다. from __future__ import division 은 파이썬 2.x 버전에서 작성된 나눗셈 코드 부분이 파이썬 3.x 환경에서 매끄럽게 작동할 수 있도록 합니다. 즉, 소숫점까지 야무지게 출력되도록 하는 것이지요. 만일 정수값 만을 원한다면 ‘//’ 을 사용하면 됩니다.
  • print_function
    파이썬 3.x 에서 print가 함수가 됨에따라 괄호가 꼭 필요해졌습니다. 그래서 이전 파이썬 2.x에서 하듯 print “ydobon” 이런 식의 출력문을 작성했다간 오류가 발생합니다. 이러한 상황을 방지하는 역할을 print_function이 하고 있습니다
  • unicode_literals
    파이썬 2.x에서는 문자열(str) 데이터 타입이 따로 있고, 유니코드(unicode)라는 것도 함께 존재했습니다. 하지만 파이썬 3.x 부터는 둘을 통합했습니다.
    파이썬 2.x 에서 print type(u’ydobon’) 을 실행해 보면 <type ‘unicode’> 라는 값이 반환됩니다. 반면 파이썬 3.x 에서 print (type(u’ydobon’)) 을 실행하면, <class ‘str’> 으로 값이 반환되는 것을 확인할 수 있습니다. str과 unicode의 통일을 이룬 파이썬3.x의 특성대로 코드가 실행될 수 있도록 하는 역할을 unicode_literals 가 하고 있습니다.

--

--