Python2와 3 공존하기

  • Best Practices & Patterns
  • Beginner
  • 2017-08-13 (Sun) 16:00 - 16:40
  • Korean
  • 103
  • Photography and recording is allowed

Slides

https://www.slideshare.net/TaehwanKIm27/python-2-3

Video

https://youtu.be/2mFb5M5R4qw

Description

이번 발표에서는 네이버 오픈 프로젝트 마이그레이션 모듈을 (https://goo.gl/1bOjHZ) Python 2.7와 3.x 둘 다 호환되게 하는 과정에서 발생한 여러 경험과 교훈에 대해서 말할 예정입니다. 처음에는 Python3 코드로 모듈을 전부 작성했지만 모듈을 배포할 때가 오자 Python 2.x도 지원해야 한다는 걸 깨달았습니다.
 작업을 시작하기 전에 가장 먼저 생각한 것은 3to2를 사용하는 것이었습니다. 하지만 3to2를 사용할 경우 코드가 부자연스럽게 변경되었고 기능도 동작하지 않았습니다. 그래서 직접 코드를 수정하는 편이 훨씬 좋겠다는 결정을 내렸습니다.
 첫 문제는 상위 클래스의 __init__ 을 호출하는 것이었습니다. Python3에서는 super().__init__ 을 이용할 수 있었지만 Python2 에서는 그냥 클래스 자체의 __init__ 을 호출해야 했습니다. 다행히 Python2,3 둘 다 이 방식을 사용할 수 있어서 Python2 방식을 사용했습니다. (해당 커밋: https://goo.gl/MHCc0D)
 가장 중요했던 문제는 인코딩 문제였습니다. 주로 한글로 된 웹 페이지를 다운로드 받아 처리해야 했는데 Python2는 ASCII를 Python3는 유니코드를 사용하므로 Python2일때만 시스템 기본 인코딩을 utf-8로 바꿔주는 작업이 필요했습니다. 문제는 그 작업을 위해 sys.setdefaultencoding() 함수를 호출하기 전에 reload(sys)를 호출해줘야 하는데 Python3에서는 reload가 importlib 에 속해있어서 호환을 위해 imp 내장 패키지에 있는 reload 를 호출했습니다. (당시에는 imp가 deprecated 되었는지 모르고 사용했습니다) (해당 코드: https://goo.gl/Hok1qZ)
  이외에도 str과 open함수가 2와 3이 동작이 서로 달라서 builtins패키지에 있는 open과 str을 사용해야 하는 경우도 있었습니다. 또한, 테스트 코드도 여러 버전 이처럼 제가 겪은 문제 말고도 정말 세세하게 신경 써줘야 할 부분이 많아서 http://python-future.org/index.html 을 참고해서 내용을 좀 더 추가하도록 하겠습니다.
  위에서 설명한 것처럼 Python2와 3 동시에 동작하는 코드를 작성하기 위해 많은 시행착오를 겪었습니다. 하지만 이런 경험을 하면서 Python에 대해서 좀 더 많이 이해하고 잘 사용할 수 있게 된 계기가 된 것 같습니다. 이번 발표를 듣는 분들이 앞으로 Python 개발을 하시면서 저와 같은 함정에 빠지지 않고 호환성을 갖춘 코드를 짤 수 있게 되었으면 좋겠습니다.

Comments

blog comments powered by Disqus

Sponsors