문제

나는 이것이 Python 3이 곧 나올 것이라고 생각하면 대부분의 Python 개발자의 마음에있는 주제라고 확신합니다. 우리가 올바른 방향으로 가도록하는 몇 가지 질문 :

  1. Python 2와 Python 3 버전을 동시에 유지할 수 있습니까? 아니면 완료되면 Python 3 버전이 있습니까?

    • 이미 시작하거나 곧 시작할 계획이 있습니까? 아니면 최종 버전이 출시 될 때까지 기다릴 계획입니까?
도움이 되었습니까?

해결책

Twisted의 일반적인 계획은 다음과 같습니다. 나는 원래 이것을 블로그에 갔지만 나는 생각했다 : 내가 얻을 수있을 때 왜 블로그 포인트들 그것을 위해?

  1. 누군가가 신경을 줄 때까지 기다리십시오.

    지금은 아무도 파이썬 3을 가지고 있지 않습니다. 우리는 적어도 한 명 이상의 실제 사용자가 나오고 "나는 Python 3.0 지원이 필요하다"고 말할 때까지 많은 노력을 기울이지 않을 것입니다. 3.0은 반짝입니다.

  2. 우리의 종속성이 마이그레이션 될 때까지 기다리십시오.

    Twisted와 같은 큰 시스템에는 여러 가지 의존성이 있습니다. 우선, 우리는 다음을 포함합니다.

    이 프로젝트 중 일부에는 자체 의존성이 있으므로 그 지역을 기다려야합니다.

  3. 누군가가 충분히 신경을 쓸 때까지 기다리십시오 도움을주기 위해.

    Twisted에서 일하는 5 명이 있습니다. 그리고 나는 그것이 나를 세고 있기 때문에 "자선 적으로"라고 말하고 몇 달 동안 헌신하지 않았기 때문입니다. 우리는 가지고 있습니다 1000 개가 넘는 티켓 지금은 버그를 수정하고, 기능을 추가하고, 일반적으로 더 나은 제품을 자체적으로 트위스트로 만드는 것이 실제로 좋을 것입니다.

    여기에는 잠재적으로 포함됩니다 스폰서 우리에게 돈을 지불하기에 충분히 돌보아 주지만, 3.0 지원에 관심을 갖고 지역 사회를 발전시키는 데 도움이되는 자원 봉사자가 유입되기를 바랍니다.

  4. Guido의 조언을 따르십시오.

    이것은 의미합니다 우리는 API를 호환되지 않게 변경하지 않을 것입니다, 그리고 우리는 다음을 따를 것입니다 과도기 개발 지침 그 Guido는 작년에 게시했습니다. 단위 테스트와 실행으로 시작합니다 2TO3 변환 도구 뒤틀린 코드베이스 위에.

  5. 2To3 도구에 대한 버그보고 및 파일 패치.

    우리가 실제로 그것을 사용하는 지점에 도달하면 실행에 많은 문제가있을 것으로 예상합니다. 2to3 미래에. 트위스트로 트위스트로 실행하는 데는 오랜 시간이 걸리며 (마지막으로 확인한 마지막으로 확인한) 트위스트 리포지토리의 파일 중 일부를 구문 분석 할 수 없으므로 결과 출력이 가져 오지 않습니다. 나는 소규모 프로젝트에서 상당한 성공 사례가 있어야하고 실제로 우리에게 효과가 있기 전에 도구에 많은 망치질이 있어야한다고 생각합니다.

    그러나 Python Development Team은 버그 보고서에 응답하는 데 매우 도움이되었으며 이러한 문제에 대한 조기 응답은 고무적이므로 이러한 모든 문제가 제 시간에 고정 될 것으로 기대합니다.

  6. 몇 년 동안 2.x 호환성을 유지하십시오.

    현재 Twisted는 Python 2.3 ~ 2.5를 지원합니다. 현재 우리는 2.6 지원을 진행하고 있습니다 (3.0 전에 마무리해야합니다!). 우리의 계획은 장기 지원 버전을 기반으로 지원되는 파이썬 버전을 수정하는 것입니다. 우분투 -Python 2.5를 포함하는 Release 8.04는 2013 년까지 지원됩니다. Guido의 조언에 따르면 3.0을 지원하기 위해 2.5에 대한 지원을 중단해야하지만 그 주변의 방법을 찾을 수 있기를 바랍니다. 버전 호환성 해킹).

    따라서 우리는 2013 년까지 Python 2.5를 지원할 계획입니다. 2 년 후 Ubuntu는 Ubuntu의 또 다른 장기 지원 버전을 출시 할 것입니다. 개인적으로 나는 이것이 Python 2.X, 아마도 Python 2.8로 배송 될 것이라고 생각합니다. /usr/bin/python, 배포와 함께 포장 된 많은 양의 Python 소프트웨어가 있기 때문에 모든 것을 업데이트하는 데 오랜 시간이 걸릴 것입니다. 그래서 5 년 그 다음에, 2015 년에는 2.X 지원을 삭제하기 시작할 수 있습니다.

    이 기간 동안 우리는 2.x 코드베이스를 통해 2to3를 실행하고 2.x 코드베이스를 수정하여 테스트를 두 버전으로 전달하는 것에 대한 Guido의 조언을 계속 따를 것입니다.

    이것의 결과는 Python 3.x가 원천 35 세 생일 이후까지 트위스트에 대한 언어 - 파이썬 2.x 코드의 대상 런타임 (및 일련의 지침 및 제한)이 될 것입니다. 앞으로 10 년 동안 Python 2.X에서 프로그램을 작성할 것으로 기대합니다.

그것이 그것이 계획입니다. 나는 그것이 1 년 정도 안에 웃을 수 없을 정도로 보수적으로 보이기를 바라고있다. 3.x 전환은 파이처럼 쉽고 모든 사람들이 빠르게 업그레이드됩니다. 다른 일이 일어날 수 있습니다. 2.x 및 3.x 브랜치가 수렴 될 수 있습니다. 누군가가 3to2, 또는 다른 런타임 (PYPY가 마음에 듭니다)은 동일한 프로세스에서 직접 2.x 및 3.x 코드를 실행할 수 있으므로 변환 프로세스가 더 쉬워집니다.

그러나 당분간, 우리는 수년 동안 그들이 유지하고있는 큰 코드베이스를 가진 사람들 (또는 사용하려는 새로운 코드를 쓰는 사람들이 있다고 가정합니다. 다른 아직 마이그레이션되지 않은 라이브러리)는 여전히 새로운 기능과 버그 수정을 원합니다. 조만간 나는 또한 우리는 또한 Python 3에 Twisted를 사용하려는 출혈 엣지 사용자가있을 것으로 기대합니다. 나는 모든 사람들에게 가능한 한 긍정적 인 경험을 제공하고 싶습니다.

다른 팁

Django 프로젝트는 라이브러리를 사용합니다 six Python 2에서 동시에 작동하는 코드베이스를 유지하려면 그리고 파이썬 3 (블로그 게시물).

six 이를 수행하여 수입 및 기능을 해당 위치 (다른 호환되지 않는 변경 사항을 통일)로 지능적으로 리디렉션하는 호환성 계층을 제공함으로써 수행합니다.

명백한 장점 :

  • Python 2 및 Python 3 용 별도의 분기가 필요하지 않습니다.
  • 2To3와 같은 변환 도구가 없습니다.

2.6의 주요 아이디어는 3.0으로 이동하는 경로를 제공하는 것입니다. 그래서 당신은 사용할 수 있습니다 from __future__ import X 모든 기능을 모두 못 박아서 3.0으로 이동할 수있을 때까지 한 번에 하나의 기능을 천천히 마이그레이션합니다. 3.0 기능 중 다수는 2.6으로 유입되므로 한 번에 모든 것을 마이그레이션하지 않고 언어 격차를 점진적으로 더 작게 만들 수 있습니다.

직장에서 우리는 먼저 2.5에서 2.6으로 업그레이드 할 계획입니다. 그런 다음 한 번에 하나의 모듈을 천천히 3.0 기능으로 활성화하기 시작합니다. 어느 시점에서 시스템의 전체 하위 부분은 아마도 3.x에 대한 준비가 될 것입니다.

유일한 문제는 라이브러리입니다. 도서관이 마이그레이션되지 않으면 오래된 도서관이 붙어 있습니다. 그러나 나는 우리가 그 부분에 대해 적시에 훌륭한 대안을 얻을 것이라고 확신합니다.

도서관 저자로 말하기 :

최종 버전이 출시되기를 기다리고 있습니다. 대부분의 Python 커뮤니티와 마찬가지로 2.x는 몇 주 또는 몇 달 동안 계속 지배적 인 버전이 될 것이라는 믿음입니다. 멋지고 세련된 3.x 릴리스를 출시 할 시간이 충분합니다.

별도의 2.x 및 3.x 브랜치를 유지할 것입니다. 2.x는 2.4로 거꾸로 호환되므로 2.6 / 3.0에서 멋진 구문 또는 새로운 기능을 많이 사용할 수 없습니다. 대조적으로, 3.x 브랜치는 사용자에게 더 좋은 경험을 제공하는 모든 기능을 사용합니다. 테스트 스위트는 2To3가 작동하도록 수정되며 두 분기에 대해 동일한 테스트를 유지하겠습니다.

둘 다 지원합니다

내가 작업중 인 프로젝트를 위해 BeautifulSoup 라이브러리를 3X로 변환하려고 시도했지만 코드의 두 가지 가지를 유지하는 것이 어떻게 고통인지 알 수 있습니다.

이를 처리하려는 현재 모델에는 다음이 포함됩니다.

  1. 2x 지점으로 변경하십시오
  2. 2to3를 실행하십시오
  3. 처음으로 전환을 제대로 수행하도록기도하십시오
  4. 코드를 실행하십시오
  5. 단위 테스트를 실행하여 모든 것이 작동하는지 확인하십시오
  6. 출력을 3 배 분기에 복사하십시오

이 모델은 작동하지만 IMHO는 짜증납니다. 모든 변경/릴리스에 대해 다음 단계를 거쳐야합니다 :: 한숨 ::. 또한 개발자는 3X 지점을 PY3K에서만 지원할 수있는 새로운 기능으로 3X 지점을 확장하지 못하게합니다.

솔루션 ... 전처리기를 사용하십시오

Python에 대한 #define 및 #ifdef 지침이있는 괜찮은 C 스타일 전처리 서를 찾을 수 없었기 때문에 하나를 썼습니다.

라고 불린다 pypreprocessor 및 PYPI에서 찾을 수 있습니다

본질적으로, 당신이하는 일은 다음과 같습니다.

  1. pypreprocessor를 가져 오십시오
  2. 스크립트가 실행중인 파이썬 버전을 감지하십시오.
  3. 버전의 사전 처리기에서 '정의'를 설정합니다 (예 : 'python2'또는 'python3')
  4. '#ifdef python2'및 '#ifdef python3'지시문이 버전에 특이 적되는 지시문
  5. 코드를 실행하십시오

그게 다야. 이제 2x와 3x 모두에서 작동합니다. 전처리기 실행의 성능이 추가 된 것에 대해 걱정이된다면 모든 메타 데이터를 제거하고 후 처리 된 소스를 파일에 출력하는 모드도 있습니다.

무엇보다도 ... 당신은 2to3 변환 만 한 번만 수행하면됩니다.

작업 예는 다음과 같습니다.

#!/usr/bin/env python
# py2and3.py

import sys
from pypreprocessor import pypreprocessor

#exclude
if sys.version[:3].split('.')[0] == '2':
    pypreprocessor.defines.append('python2')
if sys.version[:3].split('.')[0] == '3':
    pypreprocessor.defines.append('python3')

pypreprocessor.parse()
#endexclude
#ifdef python2
print('You are using Python 2x')
#ifdef python3
print('You are using python 3x')
#else
print('Python version not supported')
#endif

이것들은 터미널의 결과입니다.

 python py2and3.py
 >>>You are using Python 2x 
 python3 py2and3.py
 >>>You are using python 3x

추가 메타 데이터가없는 파일에 출력하고 깨끗한 버전 별 소스 파일을 만들려면 pypreprocessor.parse () 문의 어딘가에이 두 줄을 추가하십시오.

pypreprocessor.output = outputFileName.py
pypreprocessor.removeMeta = True

그 다음에:

python py2and3.py

추가 메타 데이터가없는 Python 2x 특정 인 outputfilename.py라는 파일을 만듭니다.

python3 py2and3.py

추가 메타 데이터가없는 Python 3x 특이 적 인 outputfilename.py라는 파일을 만듭니다.

문서화 및 더 많은 예는 확인을 참조하십시오 googlecode의 pypreprocessor.

나는 이것이 도움이되기를 진심으로 바랍니다. 나는 Python에서 코드를 작성하는 것을 좋아하며 최대한 빨리 3 배 영역으로 지원되는 진행 상황을보고 싶습니다. 나는 언어가 진행되지 않는 것을보고 싫어합니다. 특히 3X 버전은 특집 WTF를 많이 해결하고 구문을 다른 언어에서 마이그레이션하는 사용자에게 조금 더 친근하게 보이게합니다.

이 시점의 문서는 완료되었지만 광범위하지는 않습니다. 곧 더 광범위한 정보로 위키를 올리려고 노력할 것입니다.

업데이트:

이 문제를 해결하기 위해 PypReprocessor를 특별히 설계했지만 Lexer가 코드가 실행되기 전에 모든 코드를 구문 검사하기 때문에 작동하지 않습니다.

Python이 실제 C Preprocessor Directive 지원을 가지고 있다면 개발자는 동일한 파일에서 Python2x 및 Python3k 코드를 모두 함께 작성할 수 있지만 C 프리 프로세서의 평판이 좋지 않아 (언어 키워드를 변경하기위한 매크로 교체의 남용). 합법적 인 C 전 처리기 지원이 곧 Python에 추가되는 것을 참조하십시오.

Zope 툴킷은 Python 3 지원으로 느리게 진행되었습니다. 이러한 라이브러리 중 다수가 매우 복잡하기 때문에 주로 느리게합니다.

대부분의 라이브러리의 경우 2to3를 사용합니다. 일부 라이브러리는 단순하거나 대부분의 코드가 C- 확장 상태에 있기 때문에 그것 없이는 수행하지 않습니다. 관련 패키지 인 ZC.BuildOut은 Python 2 및 3 지원에 대해 2To3없이 동일한 코드를 실행합니다.

많은 다른 라이브러리와 프레임 워크가 Twisted 및 Pyramid 프레임 워크와 같은 많은 다른 라이브러리와 프레임 워크에 의존하기 때문에 ZTK를 Python 3에 포팅합니다.

더 복잡한 2.x 코드 중 일부는 2.5 또는 2.6에 머무를 것입니다. 내가 사용하는 타사 라이브러리 중 일부가 종종 3으로 업데이트되면 모든 새로운 개발을 위해 3.0으로 이동하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top