Python 2 코드를 Python 3에 이식하는 방법

Python 2 코드를 Python 3에 이식하는 방법

2022-06-01 last update

12 minutes reading Python Development

소개


파이썬은 1980년대 말에 개발되어 1991년에 처음으로 출판되었다.파이썬의 이름은 영국 코미디 단체 몬티 파이썬의 계발을 받아 명령식 통용 ABC 프로그래밍 언어의 계승자로 여겨진다.1차 교체에서 Python은 이상 처리functionsclasses with inheritance를 포함했다.
이 강좌는 코드를 Python 2에서 Python 3으로 옮길 때 가장 좋은 실천과 주의사항, 그리고 이 두 버전과 호환되는 코드를 유지해야 하는지 안내합니다.

출신 배경


Python2는 2000년에 발표되었고 더욱 투명하고 포용적인 언어 개발 과정을 상징한다.그것은 더 많은 프로그래밍 특성을 포함하고 전체 개발 과정에서 더 많은 특성을 추가했다.
Python 3은 Python의 미래로 여겨지며 현재 개발 중인 언어 버전입니다.Python 3은 2008년 말에 출시되어 고유의 디자인 결함을 해결하고 수정하였다.그러나 Python 3 언어와 Python 2가 뒤로 호환되지 않기 때문에 Python 3의 채택 속도는 매우 느리다.
Python 2.7은 2010년에 발표되었고 2개 버전 중 마지막입니다.x 버전.Python 2.7의 배후 의도는 Python 2를 더욱 쉽게 만드는 것이다.x 사용자는 Python 3과 Python 3 사이의 호환성 도량을 제공하여 기능을 Python 3에 이식합니다.
저희 강좌Python 2 vs Python 3: Practical Considerations를 읽으시면 파이썬 버전에 대한 더 많은 정보를 알고 사용할 버전을 선택할 수 있습니다

파이썬 2.7부터.


Python 3으로 이동하거나 Python 2와 Python 3을 동시에 지원하려면 Python 2 코드가 Python 2.7과 완전히 호환되는지 확인해야 합니다.
많은 개발자들이 Python 2.7 코드를 전문적으로 사용하고 있지만, 초기 버전에서만 지원된 모든 것이Python 2.7에서 정상적으로 작동할 수 있으며, Python 2.7 스타일과 일치한다는 것을 확인해야 한다.
코드가 파이썬 2.7에서 특히 중요한지 확인하십시오. 파이썬 2가 오류 복구를 유지하고 있는 유일한 버전이기 때문입니다.Python 2의 이전 버전을 사용하고 있다면, 코드가 지원되지 않고 buxfixes를 받지 않는 문제를 해결해야 합니다.
또한 2.7 이전 Python 버전에서는 프로그래밍 오류 Pylint 패키지를 찾는 등 코드를 쉽게 이식할 수 있는 일부 도구를 지원하지 않습니다.
중요한 것은 Python 2.7이 현재 지원과 유지보수를 받고 있지만 결국은 종결될 것이라는 것을 명심하는 것이다.PEP 373Python 2.7의 발표 시간표를 상세히 소개하고 본문을 작성할 때 일몰 날짜를 2020년으로 정했다.

덮어쓰기 테스트


테스트 용례를 만드는 것은 Python 2 코드를 Python 3 코드로 이전하는 작업의 중요한 부분입니다.여러 버전의 Python을 유지하려면 테스트 세트의 전체 커버율이 양호해야 각 버전이 예상대로 작동하는지 확인해야 한다.
테스트의 일부로서 모든 함수, 방법, 클래스, 모듈의docstring에 상호작용식Python 용례를 추가한 다음 내장 doctest module 을 사용하여 그림과 같이 작동하는지 검증할 수 있습니다.doctest 외에도 coverage.py package 추적 단원 테스트 덮어쓰기를 사용할 수 있습니다.이 도구는 프로그램을 감시하고 코드의 어떤 부분이 실행되었는지, 어떤 부분이 실행되었지만 실행되지 않았는지 주의합니다.coverage.py 보고서를 명령줄에 인쇄하거나 HTML 출력을 제공할 수 있습니다.이것은 일반적으로 테스트의 유효성을 평가하는 데 사용되며, 테스트가 실행 중인 코드의 어떤 부분, 어떤 부분이 실행되지 않았는지 보여 줍니다.
목표는 100% 테스트 범위가 아니라는 것을 기억하십시오. 곤혹스럽거나 심상치 않은 코드를 덮어쓰길 원합니다.모범 사례에 대해 범위는 80% 로 정해야 합니다.

Python 2와 Python 3 간의 차이점 이해


Python 2와 Python 3 사이의 차이를 이해하면 Python 3에서 사용할 수 있거나 사용할 수 있는 새로운 기능을 사용할 수 있습니다.
"Python 2 vs Python 3"설명서에는 두 버전 간의 일부 key differences 설명이 나와 있습니다. 자세한 내용은 official Python documentation 를 참조하십시오.
이식과 이전을 시작할 때, 지금은 몇 가지 문법 변경을 실현할 수 있다.

인쇄


Python 2의 print 문장이 Python 3의 print() 함수로 변경되었습니다.
Python 2
Python 3print "Hello, World!" print("Hello, World!")

집행 이사


Python 2exec 문은 Python 3에서 로컬 및 글로벌 변수를 명시적으로 허용하는 함수로 변경되었습니다.
Python 2
Python 3exec code exec(code) exec code in globals exec(code, globals) exec code in (globals, locals) exec(code, globals, locals)

/및 //


Python2는 /operator를 사용하여 층을 나누고 Python3는 //를 도입하여 층을 구분한다.
Python 2
Python 35 / 2 = 2 5 / 2 = 2.5 5 // 2 = 2파이썬 2에서 division 모듈의 import__future__ 연산자를 사용하려면 다음과 같이 하십시오.
from __future__ import division
division with integers에 대한 자세한 내용을 확인하십시오.

올리다


Python 3에서 매개변수를 사용하여 이상을 일으키려면 괄호가 필요하며 strings 이상을 사용할 수 없습니다.
Python 2
Python 3raise Exception, args raise Exception raise Exception(args) raise Exception, args, traceback raise Exception(args).with_traceback(traceback) raise "Error" raise Exception("Error")

제외


Python 2에서 여러 개의 이상을 표시하기는 어렵지만 Python 3에서 상황이 변경되었습니다.
Python 3에서 asexcept 은 명시적으로 사용됩니다.
Python 2
Python 3except Exception, variable: except AnException as variable: except (OneException, TwoException) as variable:

def 회사


Python 2에서 함수는 tuples 또는 lists 같은 시퀀스를 받아들일 수 있습니다.이 패키지는 Python 3에서 삭제되었습니다.
Python 2
Python 3def function(arg1, (x, y)): def function(arg1, x_y): x, y = x_y

expr 회사


Python 2의 backtick 구문은 더 이상 존재하지 않습니다.Python 3에서 사용repr() 또는 str.format().
Python 2
Python 3x = `355/113` x = repr(355/113):

문자열 포맷


문자열 형식 구문이 Python 2에서 Python 3으로 변경되었습니다.
Python 2
Python 3"%d %s" % (i, s) "{} {}".format(i, s) "%d/%d=%f" % (355, 113, 355/113) "{:d}/{:d}={:f}".format(355, 113, 355/113)공부How To Use String Formatters in Python 3.

학급


Python 3에서는 선언이 필요 없습니다object.
Python 2
class MyClass(object):
    pass
Python 3
class MyClass:
    pass
파이썬 3에서 메타클래스는 metaclass 키워드로 설정됩니다.
Python 2
class MyClass:
    __metaclass__ = MyMeta
class MyClass(MyBase):
    __metaclass__ = MyMeta
Python 3
class MyClass(metaclass=type):
    pass
class MyClass(MyBase, metaclass=MyMeta): 
    pass

코드 업데이트


파이썬 3에 코드를 자동으로 업데이트하고 파이썬 2와의 호환성을 유지하는 데 사용할 수 있는 두 가지 주요 도구가 있습니다: futuremodernize.모든 도구의 행위는 다르다. future 파이썬 3의 습관적인 사용법과 최선의 실천을 파이썬 2에 존재하게 하고, modernize 파이썬의 파이썬 2/3 서브집합을 실현하기 위해 이 서브집합은 파이썬 six module 을 사용하여 호환성을 높인다.
이 도구를 사용하여 코드를 다시 쓰는 세부 사항을 처리하면 잠재적인 문제와 잘못된 뜻을 식별하고 바로잡을 수 있습니다.
유니버설 세트에서 이 도구를 실행하면 코드를 직관적으로 검사하고 검증할 수 있으며, 자동 수정이 정확한지 확인할 수 있습니다.일단 테스트가 통과되면 코드를 변환할 수 있다.
여기서부터는 특히 changes between Python 2 and 3 noted in the section above 에 대한 수동 수정이 필요할 수 있습니다.future 를 사용하면 이 import 문장을 각 Python 2.7 모듈에 추가하는 것을 고려해야 합니다.
from __future__ import print_function, division, absolute_imports, unicode_literals
이것은 다시 쓰기를 초래할 수도 있지만, 파이썬 2 코드가 파이썬 3 문법과 일치하도록 확보할 것이다.
마지막으로, 코드의 다른 잠재적인 문제를 식별하기 위해 pylint package 를 사용할 수 있습니다.이 패키지에는 PEP 8 style guide 규칙과 사용 오류 등 발생할 수 있는 광범위한 문제를 포함하는 수백 개의 단독 규칙이 포함되어 있습니다.
코드의 일부 구조가 혼동될 수 있음 pylint 과 자동 이동에 사용되는 도구를 발견할 수 있습니다.만약 이러한 구조를 간소화할 수 없다면, 철저한 단원 테스트 용례를 사용해야 한다.

지속적인 통합


여러 버전의Python을 위해 코드를 유지하려면 코드를 개발할 때 가능한 한 자주 지속적인 통합을 통해 코드에서 unittest 세트를 실행하고 다시 실행해야 합니다.
Python 2 및 3 호환성 유지 관리의 일부로 six package 를 사용하는 경우 여러 환경을 테스트해야 합니다.
다른 Python 버전의 패키지 설치 상황을 검사하고 각 환경에서 테스트를 실행하며 연속 통합 서버의 전면을 충당하기 때문에 사용할 수 있는 환경 관리 도구는 tox package 입니다.

결론


중요한 것은 개발자와 지역사회가 Python 3에 대한 관심이 갈수록 많아지면서 이 언어는 더욱 정교해지고 프로그래머가 끊임없이 발전하는 수요에 부합되며 Python 2.7에 대한 지원도 점점 적어진다는 것을 기억해야 한다.Python 2와 Python 3의 코드 라이브러리 버전을 동시에 유지하기로 결정하면 전자를 사용하는 것이 점점 어려워질 수 있습니다. 시간이 지날수록 복구 오류가 줄어들기 때문입니다.
파이썬2를 파이썬3에 이식하는 프로젝트는 Porting chardet to Python 3 등 사례 연구를 포함한다.