본문 바로가기

Development/Python

Python 버전 선택.

원문 : https://wiki.python.org/moin/Python2orPython3


저도 처음에 고민했습니다. 풍부한 라브러리를 선택할 것이냐, 아니면 최신 트랜드를 따를 것이냐.

아래의 글을 참고해서 자신에게 적절한 것을 판단하시길.





Python 2 3은 개발에 필수적입니다.


차이점


요약: Python 2.x 버전은 구시대의 유물이며, Python 3.x 버전이 현재와 미래의 언어라고 할 수 있습니다.


2.x 시리즈의 마지막 버전인 2.7 버전은 2010년 중반에 수명이 만료된 릴리즈라는 표현과 더불어 출시되었습니다. 2.x 버전은 그 이후로 더 이상 주 상품으로 출시되지 않았습니다(branch: 곁가지 같은 버전들은 출시되었을 수 있음). 그 이후로 3.x 버전은 막후에서 개발 중이며, 2012년에 출시된 3.3 버전은 이미 2년간 안정적인 서비스를 제공했습니다. 예를 들자면 최근의 모든 standard library의 향상(upgrade를 뜻하는 것으로 보입니다) Python 3.x 에서만 가능하다는 뜻입니다.

Guido van Rossum (Python language의 원제작자) Python 2.x를 적절히 정리하기로 결정했는데 – 2.x 버전과의 호환성을 유지하는 것을 지양하고 3.x로 고정하기로 한 것입니다.. 가장 확실한 향상점은 더 나은 Unicode 지원(기본적으로 모든 텍스트 스트링을 유니코드로 지원하는 것)이며, 온전한 byte/Unicode 분리 또한 지원합니다.

그 외에도 core language(발행물이나 경영자가 행하는 발표, 플로어 부문에서 사용되는 정수와 같은)는 초보자들이 배우기에 더 쉽게 조정되었으며, 나머지 언어에서 더 일관적인 모습을 보여줍니다. 또한 오래된, 좋지 않은 결과물들은 모두 삭제되었습니다. (예를 들자면 모든 클래스들은 이제 모두 새로운 스타일이고, “range()”는 효율적이고 반복 가능한 메모리를 반환합니다 – 2.x 버전에선 지원하지 않았습니다.)

What's New in Python 3.0 문서는 주 언어의 변화와 호환되지 않는 Pyhthon 2.x용 코드에 대한 개요를 제공합니다.

그러나, 더 넓은 측면에서의 Python 에코시스템은 커다란 양의 품격있는 소프트웨어를 수년에 걸쳐서 축적해왔습니다. 3.x버전에서 과거 버전들과 호환되지 않는 불리한 면은 3.x버전에서 아직 해결되지 않았습니다(특히 회사에서 in-house 소프트웨어를 사용하는 경우 등).


어떤 버전을 사용해야 합니까?


여러분이 어떤 버전을 사용해야 하는가는 전적으로 여러분이 어떤 것을 처리하고 싶은가에 달렸습니다.

Python 3.x 버전이 여러분이 원하는 것을 처리할 수 있다면 아주 좋을 겁니다. 몇몇 소소한 문제점들이 있습니다. 예를 들어 별로 좋지 않은 library 지원이라던가, 현재 배포되어 있는 대부분의 Linux Mac에서 2.x 버전을 기본으로 사용한다는 사실 등입니다. 하지만 언어로서의 Python 3.x 버전은 이미 정확하게 준비되어 있습니다. Python 3.x 버전을 사용자의 컴퓨터에 받고, 전혀 모르는 일을 작성하는 데에는 Python 3.x 버전이 아주 좋습니다. 또한 대부분의 리눅스 배포판은 Python 2를 기본적으로 설치하였으며, 단계적으로 Python 3을 구비하고 있습니다.

하지만, 여러분이 Python 2대신 3를 사용해야 하는 몇몇 중요한 이슈가 있습니다.

  • 첫째로, 만약 여러분이 제어할 수 없는 환경에 배포하는 경우, 특정 버전을 강요하는 것보다 오히려 사용 가능한 버전들을 자유롭게 선택할 수 있게 해줍니다.
  • 둘째로, 만약 여러분이 특정한 third party 패키지나 아직 Python 3와 호환되는 릴리즈 버전이 없는 유틸리티를 사용한다면, 또한 해당 패키지를 중요한 작업에 할당해야 한다면, 여러분은 해당 패키지에 대한 접근성을 유지하기 위해 Python 2를 사용하셔야 합니다.

아직 Python 3를 지원하지 않는 대중적인 모듈들은 Twisted (네트워킹과 다른 어플리케이션용), gevent (Twisted와 비슷하지만 다름)를 포함합니다.

이와 같은 대부분의 Library들은 3.x지원 환경에서 사람들을 일하도록 하며 이는 다양하게, 거의 완성 단계에 와있습니다. 몇몇 특정 Library들에서 다음에 나오는 것들은 다른 것들보다 우선시됩니다: 예를 들어, Twisted의 경우에는 주로 이전 버전의 Python은 프로덕션 서버에 집중되어 있으며 새로운 버전에서는 언어에 큰 변화가 있고 혼자서 지원이 가능합니다. (Twisted는 주요 패키지의 한 예이며 3.x 버전에서는 훨씬 간단합니다.)

GUI 어플리케이션을 만드는데 있어서 Python 3는 이미 Tkinter를 포함하고 있으며 거의 Python3가 출시되자마자 PyQt에 의해 지원되고 있습니다. PySide 2011 Python 3에서 지원하는 항목으로 추가되었습니다. GTK+GUIs PyGtk의 후속작으로 Python 3를 지원하는 PyGObject로 만들어집니다.

그 밖에도 많은 주요 패키지들이 Python 3에 이식되었습니다:

  • numpy (for number crunching)
  • Django, Flask, CherryPy and Pyramid (for Web sites)
  • PIL (an image processing module) was superseeded by its fork Pillow, which supports Python3.
  • cx_Freeze (for packaging applications with their dependencies)
  • py2exe (for packaging your application for Windows users)

Python 3.x 버전을 쓰고 싶지만 종속성이나 의존도 때문에 문제가 될 것 같다면 조금의 조사와 연구를 해보는 것이 좋습니다. 진행중인 작업이 트렌드에 뒤쳐져 있을 수 있습니다.

공식적인 Python 문서와 튜토리얼은 Python 3용으로 계속 업데이트 되고 있습니다만, Python 2용 사용 참고서라던지 문서 대부분은 아직 남아있습니다. 하지만 Python 3용으로 사용하기 위해서는 조금 조정을 거쳐야 할 것입니다.

Python3버전 지원은 아직까지는 상대적으로 드물기 때문에  IronPython이나 Jython 이나 PyPy와 같은 다른 Python을 대체 구현하고자 하는 경우 꽤나 가치가 있을 것입니다.  이는 여러분이 다른 시스템과의 통합이나 성능상의 이유로 그러한 구현들을 선택하는 데 관심을 가지고 있다면 꽤나 큰 영향을 미칠 것입니다.


하지만 2.x 버전을 꼭 피하고 싶다면 어떻게 해야 합니까? 구식 언어이며, 많은 실수들이 나타나고 메이저 버전에서도 마찬가지 입니다.


꼭 그럴 필요는 없습니다. 3.0 3.1에서 너무 전폭적인 개선이 된 부분의 일부는 각각 2.6 버전과 2.7 버전에 포팅되어 있습니다. 백 포트 기능에 대한 자세한 내용은 Python 2.6 2.7의 새로운 기능 설명을 참조하시면 됩니다. (What's New in Python 2.6 and What's New in Python 2.7)

3.x
버전에서만 사용가능하며 2.x 버전에서는 백포트가 지원되지 않는 항목:

  • strings are Unicode by default 기본적으로 문자열은 유니코드
  • clean Unicode/bytes separation 깨끗한 유니코드와 바이트의 분리
  • exception chaining 예외 연쇄
  • function annotations 기능 주석
  • syntax for keyword-only arguments 키워드용 인수
  • extended tuple unpacking 확장 튜플 개봉
  • non-local variable declarations 비지역 변수 선언

또한, 언어의 진화는 핵심 인수라던가 의미 변경 등에 국한되지 않습니다. Python 2 버전에서는 백포트가 지원되지 않지만 3.x 버전에서 많은 개선이 이루어진 표준 라이브러리에 관련되어 있습니다. What's New in Python 3이 그 예입니다.

잘 구성된 2.x 코드는 3.x 코드만큼 기능할 수 있습니다. 이는 많은 것을 의미하는데, 새로운 스타일의 클래스들을 이용한다던가, 정말 오래된 난해한, 비밀스런 주술과 같은 황당한 코드들을 사용하지 않는 것, 사용 가능한 lazy iterators를 이용하는 것 등입니다. 구체적인 예: 좋은 2.x 코드는 일반적으로 range 대신 xrange를 이용합니다; xrangePython 3.x range의 구현의 시작점입니다. (range Python 3에서도 잘 사용되는데, sys.maxint보다 큰 값을 처리할 수 있기 때문입니다. xrange() Python 3에서 포함되지 않았음을 아셔야 합니다.

무엇보다도, 2.x 3.x간에 좋은 코드를 사용하는데 초점을 맞추기 위해서는 최소한의 차이가 있는 코드들을 사용하는 것이 좋습니다(사용법 등이 비슷한 코드를 사용하는 것).

그것은 전체단위 테스트 스윗을 작성하고 유니코드를 바로 얻는 것을 포함합니다. (Python 3.x 버전은 2.x 버전에 비해 유니코드와 바이트 이슈의 대립에 관해서 확실히 우위에 있음: 몇몇 소프트웨어 패키지가 포팅할 때 정말 짜증나게 만드는 것에 비해서 좋은 쪽으로 생각됨)


Python 3를 쓰고 싶어요. 하지만 Python 2.x 버전에서만 사용할 수 있는 작은 라이브러리가 존재합니다. Python 2버전으로 복귀해야 할까요, 아니면 해당 라이브러리를 포기해야 하나요?


이미 Python 3를 지원하고 있는 대체 패키지를 찾을 수 없다고 여겨진다 해도, 여전히 고려해보아야 할 몇 가지 옵션들이 존재합니다:

  • 3.x 버전 라이브러리로 포팅. ("포팅" 3.x버전에서 작업하는 라이브러리를 만드는 것을 의미합니다.)
  • 만약 포팅이 정말 거의 불가능한 것으로 판명되면, 그리고 여러분의 다른 모든 작업들도 2.x버전에 있다면, 2.x 버전을 유지하는 것을 고려해보셔야 합니다. 여러 번 설명드렸다시피, 좋은 2.x 버전 코드는 별다른 지장을 주지 않으며, 곧 각각의 의존성 있는 항목들을 성공적으로 포팅시킬 수 있을 것입니다.
  • 해당 기능이 정말 중요하다면 그냥 2.x를 쓰십시오.

3.x 버전의 라이브러리와 포팅을 시도해보는 것이 가장 이상적인 상황일 것입니다. 종종 여러분은 이미 3.x 버전에서 작업중인 누군가를 찾게 될 것입니다. 그렇지 않은 경우에도, 현존하는 프로젝트 멤버들은 도움에 감사할 것입니다. 특히, 오리지널 소프트웨어에서도 종종 버그를 발견하시곤 합니다. 이런 리포트들은 오리지널 소프트웨어와 3.x 버전 양쪽 모두의 질을 점점 향상시키는 원동력이 됩니다. 포팅이 늘 쉽지만은 않습니다. 하지만 스크래치에서 여러분만의어떤 것을 만드는 것보단 쉽겠죠.

어떻게 포팅을 할것인가에 대해서는 PEP 3000에 써있습니다. 기본적인 아이디어는 2에서 3으로 변환해주는 컨버터를 사용해서 2.x 버전의 라이브러리를 호환되는 Python 3 버전에 자동으로 생성하고 모든 유닛들이 정상적으로 작동하는지 테스트하는 것입니다. 만약 테스트에 실패한다면, 2.x 버전의 소스를 수정하고 재시도합니다. 이런 접근은 2.x 버전과 3.x 버전을 2.x 의 코드를 기본으로 하여 만든 평행적 요소들이 지원할 수 있도록 해줍니다. 2.x 버전과 3.x 버전을 따로따로 유지하는 것보다 이편이 더 편합니다 (그냥 Python 핵심 개발자들에게 물어봐도, 그들 역시 포팅을 하지 않으면 한 문제에 2년씩도 걸릴 것입니다.)

C 확장 모듈이 포함되어있다면 포팅 상황은 조금 복잡해집니다. 하지만 그런 상황에서도 여전히 여러분 고유의 패키지를 만들어내는 것보다는 여전히 쉽습니다.
좀더 심층적인 가이드를 찾아보세요:
 PortingPythonToPy3k, PortingExtensionModulesToPy3k


어떤 부분을 3.x 버전으로 쓰기로 결정했습니다만, 누군가가 해당 부분을 2.x 버전용으로 쓰길 원합니다. 어떻게 해야 하나요?


2.x 소스 코드를 3.x 버전으로 전환해주는 2to3 툴에 더해 3to2 툴도 존재합니다. 이론적으로, 3to2툴은 2to3 툴에 비해서 더 잘 작동해야 합니다. 왜냐하면 3.x 버전은 다루기 어려운 코너케이스들을 처리해야 하는 컨버터가 존재하지 않기 때문입니다(이 컨버터들을 최대한 많이 없애는 것이 결국 이전버전과의 호환성을 포기한 주요 이유 중 하나였습니다: 2.x 버전과 3.x 버전의 호환이 어려워진 이유). 그러나 3.x에서 많이 사용되는 코드(: 기능 주석, 확장 터플 풀기 등 / such as function annotations or extended tuple unpacking)들은 성공적으로 변환할 수 없을 수도 있습니다.

이번 단계에서는 아마도 3to2 툴이 2to3툴에 비해 더 쉽다고 말하는 편이 옳을 것 같습니다. 몇 가지 조잡한 점을 여기저기서 발견할지도 모릅니다. 하지만, 여러분이 3.x 코드를 쓰고 싶다면 그것은 확실히 가치 있는 탐험이 될 것입니다.

여섯번째 six 는 다른 툴입니다.


 

Python 2 Python 3 사이에서 어느 쪽을 선택할지 도움이 될만한 다른 리소스들:







'Development > Python' 카테고리의 다른 글

Django 의 기본적인 흐름 V 2.  (0) 2013.11.27
Django 의 기본적인 흐름.  (0) 2013.11.12