장고(Djagno) 1.5의 파이썬 3 지원 :: 2013/03/07 20:18

며칠 전 장고(Django) 1.5가 정식 발표됐다. 1.5의 가장 눈에 띄는 변화는 바로 파이썬(Python) 3 지원! 냉큼 현재 작업 중인 프로젝트를 장고 1.5, 파이썬 3.3으로 올려봤다. 몇 가지만 수정했더니 아주 잘 동작한다. 브라보! 나온 지 벌써 4년이 넘었지만, 하위호환성을 이유로 깔아보는 데만 만족해하던 파이썬 3. 이제야 제대로 쓸 수 있는 시대가 도래한 것 같다.

자, 파이썬 3의 변화가 어떤 것인지 되짚어 보자.
 1. 문자열이 유니코드가 기본이다. unicode가 str이 되고 str은 bytes가 됐다. 국제화 시대에 어울리는 설정. 영어만 사용하는 사람들에게도 유니코드를 기본사용으로 강제한 셈. 우리로서는 환영할 일.
 2. 반복처리가 필요한 부분은 모두 반복자가 리턴되도록 변경. dict().keys() 같은 것은 더이상 리스트가 아니라 반복자가 리턴돼서 메모리 효율이 좋게 됐다. iterkeys() 같은 건 없어짐.
 3. 혼동됐던 각종 빌트인 모듈이름들을 좀 더 깔끔하게 변경 (cStringIO.StringIO --> io.StringIO )
 4. set을 표현하는 또 다른 방법 {1,2,3,4}, {x for x in range(5)}
 5. print 가 문이 아니라 함수임. print('hello') 로 써야함.
 6. a, *b, c = range(10) 이 동작함
 7. 국제화 식별자 가능 (어느정도 한글로 프로그래밍 가능)
 8. 기타등등 (자세한건 파이썬 3의 새로운 기능들 공식 문서를 보세요)

보면 알겠지만, 파이썬 언어 자체를 좀 더 깔끔하게 개선하려는 노력들이다. 나의 코드도 저 깔끔함을 따라가고 싶다. 그것이 파이썬 3을 써야하는 이유이다. (위 목록 중 일부는 이미 2.7에도 적용되어 그대로 써도 된다.)

파이썬 3 쓰고 싶다. 그러나 지원하지 않는 라이브러리들 때문에 쉽지 않다. 그렇다면 2.7과 3.3에서 모두 동작하도록 만들면 된다. 꼭 필요한 라리브러리의 3 지원이 안된다면 아쉽지만 그 코드 그대로 2.7에서 돌리면 된다. 이런 생각을 가능하게 만든건 six 라는 모듈 (아마도 2 x 3 = 6 여서 six 라는 이름이 붙은 듯). 약간의 노력으로 버전 2, 3 동시 호환성을 갖도록 프로그래밍할 수 있다.

장고 문서에도 소개돼있는 파이썬 3 기준으로 코딩하면서 2 도 동작하도록 만드는 방법은 다음과 같다. 이는 꼭 장고뿐 아니라 모든 파이썬 프로그래밍에도 유효하다.

 1. 문자열 이터럴 u""를 사용한 문자열에 u를 모두 뺀다. 그리고, 2.7에서도 알아먹을 수 있도록 코드 맨 앞에 다음을 추가한다. 
from __future__ import unicode_literals

 2. models.Model 등 클래스의 __unicode__ 메쏘드는 그냥 __str__ 을 쓰면 된다. 대신 2.7에서 돌게 하려면 다음과 같은 클래스 데코레이터를 붙히면 된다.
from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(object):
    def __str__(self):
        return "Hello world"

 3. dict().item() 를 꼭 써야 할 경우 좀 문제가 된다. 같은 코드가 파이썬 2와 3이 다르게 인식하기 때문. 이 경우 six.iteritems(dict())로 하면 버전에 맞게 알아서 동작한다.
import six
dict = {'a':123, 'b':456}
dict.items()  # dont' do that if you want to same operation on 2, 3.
six.iteritems(dict)

 4. 그밖에 꼭 2,3를 다르게 코딩해야한다면 six.PY3 으로 분기할 수도 있다.
if six.PY3:
    # do stuff Python 3-wise
else:
    # do stuff Python 2-wise

 5. 그밖의 상황들은 장고 문서 Porting to Python 3을 참고.

Python 3 Wall of Superpowers에 가면 각종 써드파티 모듈들의 파이썬 3 지원여부를 알 수 있다. 보면 MySQLdb는 아직 없고 psycopg2는 있다. 이부분에도 MySQL이 지고 PostgreSQL이 뜨고 있음을 실감. 파이썬 3 소개페이지에 "특정 모듈의 버전 3 지원이 없을 땐 어찌하나요"에 대한 대답이 의미심장하다.
 1. 파이썬 3 포팅을 직접 하시지요
 2. (최신버전 지원도 안하는) 그걸 꼭 써야하나요? 그 라이브러리를 빼는건 어때요?

참고로, 장고 1.5의 파이썬 3 지원은 "실험적"이라는 단서가 붙어 있다. 완벽 지원은 1.6에서 할 예정이란다. 그래도 괜찮다. 어짜피 2.7, 3.3 모두 동작하게 만들면 3.3 문제 발생시 2.7로 돌리면 되니까. "점진적 버전 업은 이렇게 하는 것이다" 라고 알려주는 듯하다. 장고의 이러한 파이썬 3 지원방법은 장고 밖에서도 유효하다. 앞으로 모든 파이썬 프로그래밍을 이런 방식으로 하면, 3의 장점을 누리면서도 2를 함께 쓸 수 있다.

파이써니스트들이여, 이제는 파이썬 3을 써야 할 때!
Trackback Address :: http://yong27.biohackers.net/trackback/380
Name
Password
Homepage
Secret
< PREV #1 #2 #3 #4 #5 #6 ... #307  | NEXT >